SpringCloud --服務調用Feign


介紹

服務間通信簡介

一個系統可以由不同的微服務構成,比如一個電商系統可以由訂單服務、商品服務、用戶服務等共同組成。 這些服務相互獨立,但又相互依賴。由於它們相互依賴,所以需要通過通信的方式來進行相互調用。

服務間通信方式主要有兩種:

(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>

說明:依賴有分feignopenfeign

(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中的服務間通信(RestTemplateFeign)

https://blog.csdn.net/zhaohongfei_358/article/details/83148623

Feign的工作原理

https://juejin.im/post/5ccbe82851882544da5008ce


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM