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

3.Feign原理
1.將feign接口的代理類掃描到Spring容器中
@EnableFeignClients開(kāi)啟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ā)出請(qǐng)求
代理類會(huì)通過(guò)RequestTemplate創(chuàng)建Request,然后client(URLConnect、HttpClient、OkHttp)使用Request發(fā)送請(qǐng)求
4.Feign優(yōu)化
4.1日志配置
- NONE【性能最佳,默認(rèn)值】:不記錄任何日志。
- BASIC【適用于生產(chǎn)環(huán)境追蹤問(wèn)題】:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)代碼以及執(zhí)行時(shí)間。
- HEADERS:記錄BASIC級(jí)別的基礎(chǔ)上,記錄請(qǐng)求和響應(yīng)的header。
- FULL【比較適用于開(kāi)發(fā)及測(cè)試環(huán)境定位問(wèn)題】:記錄請(qǐng)求和響應(yīng)的header、body和元數(shù)據(jù)。
配置方式:
(1)定義一個(gè)配置類,指定日志級(jí)別
// 注意: 此處配置@Configuration注解就會(huì)全局生效,如果想指定對(duì)應(yīng)微服務(wù)生效,就不能配置@Configuration
@Configuration
public class FeignConfig {
/**
* 日志級(jí)別
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}(2) 在application.yml配置文件中配置 Client 的日志級(jí)別才能正常輸出日志,格式是"logging.level.feign接口包路徑=debug"
logging:
level:
com.tuling.mall.feigndemo.feign: debug4.2超時(shí)時(shí)間配置
OpenFeign使用兩個(gè)超時(shí)參數(shù):
connectTimeout:可以防止由于較長(zhǎng)的服務(wù)器處理時(shí)間而阻塞調(diào)用者。readTimeout:從連接建立時(shí)開(kāi)始應(yīng)用,當(dāng)返回響應(yīng)花費(fèi)太長(zhǎng)時(shí)間時(shí)觸發(fā)。
補(bǔ)充說(shuō)明: Feign的底層用的是Ribbon或者LoadBalancer,但超時(shí)時(shí)間以Feign配置為準(zhǔn)
4.3契約配置(了解即可)
Spring Cloud 在 Feign 的基礎(chǔ)上做了擴(kuò)展,可以讓 Feign 支持 Spring MVC 的注解來(lái)調(diào)用。
原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式來(lái)定義客戶端也是可以的,通過(guò)配置契約來(lái)改變這個(gè)配置,Spring Cloud 中默認(rèn)的是SpringMvcContract。
4.4客戶端組件配置
我們知道HTTP連接需要經(jīng)過(guò)三次握手,四次揮手的過(guò)程,這是很耗費(fèi)性能的;所以HTTP連接池幫助我們節(jié)省了這一步。
同時(shí)Feign的HTTP客戶端支持三種框架:
HttpURLConnection、HttpClient、OkHttp;默認(rèn)是HttpURLConnection。
Feign 中默認(rèn)使用 JDK 原生的 URLConnection 發(fā)送 HTTP 請(qǐng)求,沒(méi)有連接池,我們可以集成別的組件來(lái)替換掉 URLConnection,比如 Apache HttpClient5,OkHttp。
Feign發(fā)起調(diào)用真正執(zhí)行邏輯:feign.Client#execute (擴(kuò)展點(diǎn))
4.5GZIP 壓縮配置
開(kāi)啟壓縮可以有效節(jié)約網(wǎng)絡(luò)資源,提升接口性能,我們可以配置 GZIP 來(lái)壓縮數(shù)據(jù)。
4.6編碼器解碼器配置
Feign 中提供了自定義的編碼解碼器設(shè)置,同時(shí)也提供了多種編碼器的實(shí)現(xiàn),比如 Gson、Jaxb、Jackson。
我們可以用不同的編碼解碼器來(lái)處理數(shù)據(jù)的傳輸。
如果你想傳輸 XML 格式的數(shù)據(jù),可以自定義 XML 編碼解碼器來(lái)實(shí)現(xiàn),或者使用官方提供的 Jaxb。
4.7攔截器配置
通過(guò)攔截器實(shí)現(xiàn)參數(shù)傳遞。
擴(kuò)展點(diǎn): feign.RequestInterceptor
使用場(chǎng)景:
(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)文章
解決JavaMail附件名字過(guò)長(zhǎng)導(dǎo)致的亂碼問(wèn)題
這篇文章主要介紹了解決JavaMail附件名字過(guò)長(zhǎng)導(dǎo)致的亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Maven中dependency和plugins的繼承與約束
這篇文章主要介紹了Maven中dependency和plugins的繼承與約束,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java8新特性stream和parallelStream區(qū)別
這篇文章主要介紹了Java8新特性stream和parallelStream區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

