文章目錄
- 一,OpenFeign的簡介
- 二,OpenFeign的使用步驟
- 1,場景說明
- 2,引入依賴
- 2,開啟OpenFeign
- 3,編寫Feign接口
- 4,使用feign調用遠程接口
- 5,驗證
- 錯誤記錄
上一節學習了注冊中心,我們知道服務器A調用服務器B之前,會從注冊中心獲取到服務B的IP,然后服務器A向服務B發出請求。
那么服務器A是怎么向服務B發出請求的呢?
這是本節要解決的主要問題。
在這個項目中,采用OpenFeign這個組件完成服務間的調用,OpenFeign是對Http請求的封裝。
一,OpenFeign的簡介
OpenFeign是一個聲明式的 HTTP 客戶端,它的目的就是讓遠程調用更加簡單。
Feign 提供了HTTP請求的模板,通過編寫簡單的接口和插入注解,就可以定義好 HTTP 請求的參數、格式、地址等信息。
Feign 整合了 Ribbon(負載均衡)和 Hystrix(服務熔斷),可以讓我們不再需要顯式地使用這兩個組件。
SpringCloudFeign 在 NetflixFeign 的基礎上擴展了對 SpringMVC 注解的支持,在其實現下,我們只需創建一個接口并用注解的方式來配置它,即可完成對服務提供方的接口綁定。簡化了SpringCloudRibbon 自行封裝服務調用客戶端的開發量。
二,OpenFeign的使用步驟
1,場景說明
我們以一個場景化的問題學習OpenFeign的使用,假設會員服務
要調用優惠券服務
的一個接口,這個接口返回了會員的能使用的優惠券信息。
這個優惠券的接口如下,這是一個用來測試的接口,沒有真實的業務邏輯。
@RequestMapping("member/list")public R list(){CouponEntity couponEntity = new CouponEntity();couponEntity.setCouponName("慢100減80");return R.ok().put("page", Arrays.asList(couponEntity));}
啟動服務后,可以使用下面的url在瀏覽器訪問這個接口。
http://localhost:7000/coupon/coupon/member/list
瀏覽器調用這個接口,發出的是Http請求。
會員服務要使用這個接口,也要想優惠券服務發出Http請求,如果沒有OpenFeign,我們需要自己封裝Http請求,并解析Http響應,會非常復雜。
使用OpenFeign可以大大簡化這個過程。
2,引入依賴
考慮到所有模塊都需要這個依賴,所以把這個依賴聲明放在common模塊最為合適。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2,開啟OpenFeign
需要在啟動類加上類注解@EnableFeignClients
,并通過basePackages屬性明確feign接口所在的包。
@EnableFeignClients(basePackages = "com.atguigu.gulimall.pms.feign")
@EnableFeignClients
是激活OpenFeign的關鍵,在 Spring Boot 應用的啟動類加上這個注解,就相當于告訴 Spring:“嘿,我要開始使用 Feign 啦!請幫我找到所有用 @FeignClient 標記的接口,并為它們創建代理對象。”
這樣,Spring 就會掃描basePackages指定的包下的所有類,尋找那些用 @FeignClient 注解過的接口。對于每一個這樣的接口,Spring 都會創建一個代理類,這個代理類看起來就像你在調用本地方法一樣,但實際上它是在發起遠程調用。
總結一下,@EnableFeignClients
的作用就是:
- 開啟 Feign 的功能;
- 掃描并注冊所有用 @FeignClient 標記的接口;
- 創建代理類,使得你能夠以聲明式的方式調用遠程服務,就像調用本地方法一樣簡單。
3,編寫Feign接口
首先在會員工程下新建一個包,名為feign,我們把所有Feign聲明相關的類都放在這個包下,便于管理。
如下圖所示。
- ①所有的遠程調用相關的類都定義在feign包下
- ②與優惠券相關的遠程調用接口的定義都可以放在這個類中,通過這個類調用優惠券服務的接口
- ③使用注解@FeignClient指定這個類下的接口要調用是哪個服務,在FeignClient中指定服務名,需要根據服務名從注冊中心獲取IP
- ④Feign相關的類是一個接口,不需要提供具體的實現
- ⑤聲明遠程接口,注意通過url指定需要調用的接口
@FeignClient("gulimall-coupon")
public interface CouponFeign {@RequestMapping("/coupon/coupon/member/list")public R list();
}
4,使用feign調用遠程接口
一般情況下,我們會在Service中調用Feign接口,但理論上,我們可以在任何地方調用Feign接口。
接下來,為了演示的方便,我們在Member會員服務的Controller接口中調用Feign接口。
如下,我們在MemberController中編寫演示代碼。
@Autowiredprivate CouponFeign couponFeign;@RequestMapping("/coupons")public R coupons(){return couponFeign.list();}
- ① 注入CouponFeign對象
- ② 調用CouponFeign的list方法,就像調用本地接口一樣,OpenFeign底層會將這個調用封裝為Http請求,并接收、封裝響應
通過這個例子,我們可以體驗到使用OpenFeign進行遠程調用是非常簡單的,語法和調用本地接口一樣。
5,驗證
啟動會員服務,在瀏覽器輸入:
http://localhost:8000/member/member/coupons
我們調用的是會員服務的接口,但是會員服務通過OpenFeign實現對優惠券服務的遠程調用。
錯誤記錄
錯誤記錄-SpringCloud-OpenFeign測試遠程調用