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

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

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入詳解SpringBoot配置diff的實(shí)戰(zhàn)方法
在日常的開發(fā)與運(yùn)維工作中,配置管理是一項(xiàng)至關(guān)重要的任務(wù),簡單來說,Spring Boot 配置 diff 就是對比 Spring Boot 應(yīng)用中不同配置版本之間的差異,下面小編就和大家詳細(xì)介紹一下Spring Boot 配置 diff 的實(shí)戰(zhàn)方法吧2026-04-04
nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn)
這篇文章主要介紹了nacos gateway動(dòng)態(tài)路由實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java 實(shí)戰(zhàn)范例之精美網(wǎng)上音樂平臺(tái)的實(shí)現(xiàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)前后端分離的精美網(wǎng)上音樂平臺(tái),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11
遞歸出現(xiàn)棧溢出stackoverflow的問題及解決
這篇文章主要介紹了關(guān)于遞歸出現(xiàn)棧溢出stackoverflow的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
SpringBoot WebService服務(wù)端&客戶端使用案例教程
這篇文章主要介紹了SpringBoot WebService服務(wù)端&客戶端使用案例教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10
解決springboot application.properties server.port配置問題
這篇文章主要介紹了解決springboot application.properties server.port配置問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring boot項(xiàng)目使用thymeleaf模板過程詳解
這篇文章主要介紹了Spring boot項(xiàng)目使用thymeleaf模板過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼
Ribbon 是 Netflix 發(fā)布的負(fù)載均衡器,它有助于控制 HTTP 和 TCP 客戶端的行為。這篇文章主要介紹了Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼,需要的朋友可以參考下2020-11-11
Spring AOP 自定義注解的實(shí)現(xiàn)代碼
本篇文章主要介紹了Spring AOP 自定義注解的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04

