Feign的原理及概念詳解
1.什么是Feign
Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端,F(xiàn)eign可幫助我們更加便捷、優(yōu)雅地調(diào)用HTTP API。Feign可以做到使用HTTP請求遠程服務(wù)時就像調(diào)用本地方法一樣的體驗,開發(fā)者完全感知不到這是遠程方法,更感知不到這是個HTTP請求。
Spring Cloud OpenFeign對Feign進行了增強,使其支持Spring MVC注解,從而使得Feign的使用更加方便。
官方文檔: Spring Cloud OpenFeign
2.Feign的調(diào)用流程(核心)

3.Feign原理
1.將feign接口的代理類掃描到Spring容器中
@EnableFeignClients開啟feign注解掃描:FeignClientsRegistrar.registerFeignClients()掃描被 @FeignClient標(biāo)識的接口生成代理類,并把接口和代理類交給Spring的容器管理。
2.為接口的方法創(chuàng)建RequestTemplate
當(dāng)consumer調(diào)用feign代理類時,代理類會調(diào)用SynchronousMethodHandler.invoke()創(chuàng)建RequestTemplate(url,參數(shù))
3.發(fā)出請求
代理類會通過RequestTemplate創(chuàng)建Request,然后client(URLConnect、HttpClient、OkHttp)使用Request發(fā)送請求
4.Feign優(yōu)化
4.1日志配置
- NONE【性能最佳,默認值】:不記錄任何日志。
- BASIC【適用于生產(chǎn)環(huán)境追蹤問題】:僅記錄請求方法、URL、響應(yīng)狀態(tài)代碼以及執(zhí)行時間。
- HEADERS:記錄BASIC級別的基礎(chǔ)上,記錄請求和響應(yīng)的header。
- FULL【比較適用于開發(fā)及測試環(huán)境定位問題】:記錄請求和響應(yīng)的header、body和元數(shù)據(jù)。
配置方式:
(1)定義一個配置類,指定日志級別
// 注意: 此處配置@Configuration注解就會全局生效,如果想指定對應(yīng)微服務(wù)生效,就不能配置@Configuration
@Configuration
public class FeignConfig {
/**
* 日志級別
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}(2) 在application.yml配置文件中配置 Client 的日志級別才能正常輸出日志,格式是"logging.level.feign接口包路徑=debug"
logging:
level:
com.tuling.mall.feigndemo.feign: debug4.2超時時間配置
OpenFeign使用兩個超時參數(shù):
connectTimeout:可以防止由于較長的服務(wù)器處理時間而阻塞調(diào)用者。readTimeout:從連接建立時開始應(yīng)用,當(dāng)返回響應(yīng)花費太長時間時觸發(fā)。
補充說明: Feign的底層用的是Ribbon或者LoadBalancer,但超時時間以Feign配置為準
4.3契約配置(了解即可)
Spring Cloud 在 Feign 的基礎(chǔ)上做了擴展,可以讓 Feign 支持 Spring MVC 的注解來調(diào)用。
原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式來定義客戶端也是可以的,通過配置契約來改變這個配置,Spring Cloud 中默認的是SpringMvcContract。
4.4客戶端組件配置
我們知道HTTP連接需要經(jīng)過三次握手,四次揮手的過程,這是很耗費性能的;所以HTTP連接池幫助我們節(jié)省了這一步。
同時Feign的HTTP客戶端支持三種框架:
HttpURLConnection、HttpClient、OkHttp;默認是HttpURLConnection。
Feign 中默認使用 JDK 原生的 URLConnection 發(fā)送 HTTP 請求,沒有連接池,我們可以集成別的組件來替換掉 URLConnection,比如 Apache HttpClient5,OkHttp。
Feign發(fā)起調(diào)用真正執(zhí)行邏輯:feign.Client#execute (擴展點)
4.5GZIP 壓縮配置
開啟壓縮可以有效節(jié)約網(wǎng)絡(luò)資源,提升接口性能,我們可以配置 GZIP 來壓縮數(shù)據(jù)。
4.6編碼器解碼器配置
Feign 中提供了自定義的編碼解碼器設(shè)置,同時也提供了多種編碼器的實現(xiàn),比如 Gson、Jaxb、Jackson。
我們可以用不同的編碼解碼器來處理數(shù)據(jù)的傳輸。
如果你想傳輸 XML 格式的數(shù)據(jù),可以自定義 XML 編碼解碼器來實現(xiàn),或者使用官方提供的 Jaxb。
4.7攔截器配置
通過攔截器實現(xiàn)參數(shù)傳遞。
擴展點: feign.RequestInterceptor
使用場景:
(1)傳遞分布式事務(wù)ID,標(biāo)明哪個微服務(wù)屬于同一事物
(2)token校驗的參數(shù)傳遞(實現(xiàn)認證邏輯)
5.Feign整體架構(gòu)(RPC架構(gòu))

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Maven中dependency和plugins的繼承與約束
這篇文章主要介紹了Maven中dependency和plugins的繼承與約束,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Java8新特性stream和parallelStream區(qū)別
這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

