介紹
服務間通信簡介
一個系統可以由不同的微服務構成,比如一個電商系統可以由訂單服務、商品服務、用戶服務等共同組成。 這些服務相互獨立,但又相互依賴。由於它們相互依賴,所以需要通過通信的方式來進行相互調用。
服務間通信方式主要有兩種:
(1) 基於HTTP的REST(SpringCloud)
(2) RPC(Dubbo)
SpringCloud服務間調用方式有兩種:
(1) RestTemplate
(2) FeignClient
這兩種方式都是通過REST接口調用服務的http接口
SpringCloud搭建各種微服務之后,服務間通常存在相互調用的需求,SpringCloud提供了@FeignClient 注解非常優雅的解決了這個問題,Feign的中文名稱翻譯過來是偽裝。
實戰中使用Feign進行服務間通信
1. 增加依賴(WKD項目中使用)
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-openfeign</artifactId> 4 </dependency>
說明:依賴有分feign和openfeign
(1) Feign本身不支持Spring MVC的注解,它有一套自己的注解;
(2) Spring Cloud OpenFeign是在Feign的基礎上擴展了對Spring MVC注解的支持,如@RequesMapping等等,同時還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。
2、增加注解@EnableFeignClients
(1) 在Application啟動類上增加注解@EnableFeignClients
(2)寫在一個專門的配置文件中
說明:FeignClinentConfig 外部Restful接口引入:
如果Feignclien是外部包引入的,可能需要指定掃描路徑,在注解@EnableFeignClients中指定
@EnableFeignClients(/*basePackages={"package.contains.fegin.clients"}*/)手寫的Feigclient 在 .assemble.fegin 中通過組件@FeignClient 引入,就是說你需要加上你可能要調用中心的API的包路徑,好比你的找個配置文件在庫存中心inventory,你可能要調用到基礎數據中心data,那你得加上掃描路徑(類似com.xxx.center.data.api)。
3、新建一個feign接口
參數說明:
name:指定FeignClient的名稱(微服務的名稱),name屬性會作為微服務的名稱,用於服務發現(如果使用Nacos實現服務注冊發現,name與服務的名稱一致,使用eureka也一樣);
url: url一般用於調試,可以手動指定@FeignClient調用的地址;
path: 定義當前FeignClient所有方法的requestMapping的統一前綴,,類似與controller類上的requestMapping;
4、調用feign
假如應用中心stock調用庫存中心inventory,實現類中注入inventory中心的Api接口,直接調用。
1 @Service 2 public class BandServiceImpl implements IBandService { 3 4 @Resource 5 private IBandQueryApi bandQueryApi; 6 7 ...... 8 9 @Override 10 public RestResponse<BandRespDto> queryBandById(Long id) { 11 //調用庫存中心 12 return bandQueryApi.queryBandById(id); 13 } 14 }
FeignClient原理簡述
(1)當程序啟動時,會進行包掃描,掃描所有包下有@FeignClient注解的類,並將這些類注入到Spring IOC容器中。
(2)當定義的Feign接口中的方法被調用時,Feign通過JDK的動態代理為每個接口方法創建一個RequestTemplate對象。這個RequestTemplate對象中包含請求的所有信息,如請求參數,請求URL等。
(3)然后RequestTemplate生成Request,將Request交給Client處理,這個Client默認是JDK的HTTPUrlConnection,也可以是OKhttp、Apache的HTTPClient等。
(4)最后Client被封裝成LoadBaLanceClient類,這個類結合Ribbon負載均衡發起服務之間的調用。
參考/好文
Spring Cloud中的服務間通信(RestTemplate和Feign)
https://blog.csdn.net/zhaohongfei_358/article/details/83148623
Feign的工作原理