Spring Cloud Feign組成配置過程解析
Feign的組成
| 接口 |
作用 |
默認(rèn)值 |
|---|---|---|
| Feign.Builder |
Feign的入口 |
Feign.Builder |
| Client |
Feign底層用什么去請(qǐng)求 |
和Ribbon配合時(shí):LoadBalancerFeignClient 不和Ribbon配合時(shí):Fgien.Client.Default |
| Contract |
契約,注解支持 |
SpringMVCContract |
| Encoder |
解碼器,用于將獨(dú)享轉(zhuǎn)換成HTTP請(qǐng)求消息體 |
SpringEncoder |
| Decoder |
編碼器,將相應(yīng)消息體轉(zhuǎn)成對(duì)象 |
ResponseEntityDecoder |
| Logger |
日志管理器 |
Slf4jLogger |
| RequestInterceptor |
用于為每個(gè)請(qǐng)求添加通用邏輯(攔截器,例子:比如想給每個(gè)請(qǐng)求都帶上heared) |
無 |
Feign的日記級(jí)別
| 日志級(jí)別 |
打印內(nèi)容 |
|---|---|
| NONE(默認(rèn)) |
不記錄任何日志 |
| BASIC |
僅記錄請(qǐng)求方法,URL,響應(yīng)狀態(tài)代碼以及執(zhí)行時(shí)間(適合生產(chǎn)環(huán)境) |
| HEADERS |
記錄BASIC級(jí)別的基礎(chǔ)上,記錄請(qǐng)求和響應(yīng)的header |
| FULL |
記錄請(qǐng)求和弦ineader,body和元數(shù)據(jù) |
首先如何整合Feign
遵循SpringBoot的三板斧第一步:加依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
第二步:寫注解
@EnableFeignClients //在啟動(dòng)類上加
第三步:寫配置
如何給Feign添加日志級(jí)別
細(xì)粒度
方式一:代碼實(shí)現(xiàn)第一步:添加Feign配置類,可以添加在主類下,但是不用添加@Configuration。如果添加了@Configuration而且又放在了主類之下,那么就會(huì)所有Feign客戶端實(shí)例共享,同Ribbon配置類一樣父子上下文加載沖突;如果一定添加@Configuration,就放在主類加載之外的包。建議還是不用加@Configuration。
public class FeignConfig {
@Bean
public Logger.Level Logger() {
return Logger.Level.FULL;
}
}
第二步:給@FeignClient添加配置類
//@FeignClient configuration = GoodsFeignConfig.class 細(xì)粒度配置,指定配置類 @FeignClient(name = "goods", configuration = FeignConfig.class)
第四步:寫配置
logging: level: com.xxx.xxx.FeignAPI: DEBUG #需要將FeignClient接口全路徑寫上# 開啟日志 格式為logging.level. Feign客戶端路徑
方式二:配置屬性實(shí)現(xiàn)
feign:
client:
config:
#想要調(diào)用的微服務(wù)名稱
server-1:
loggerLevel: FULL
全局配置
方式一:代碼實(shí)現(xiàn)添加了@Configuration放在了主類之下,那么就會(huì)所有Feign客戶端實(shí)例共享,同Ribbon配置類一樣父子上下文加載沖突;讓父子上下文ComponentScan重疊(強(qiáng)烈不建議)唯一正確方式
//在啟動(dòng)類上為@EnableFeignClients注解添加defaultConfiguration配置 @EnableFeignClients(defaultConfiguration = FeignConfig.class)
方式二:配置屬性實(shí)現(xiàn)
feign:
client:
config:
#將調(diào)用的微服務(wù)名稱改成default就配置成全局的了
default:
loggerLevel: FULL
Feign支持的配置項(xiàng)
代碼方式
| 配置項(xiàng) |
作用 |
|---|---|
| Logger.Level |
指定日志級(jí)別 |
| Retryer |
指定重試策略 |
| ErrorDecoder |
指定錯(cuò)誤解碼器 |
| Request.Options |
超時(shí)時(shí)間 |
| Collection |
攔截器 |
| SetterFactory |
用于設(shè)置Hystrix的配置屬性,F(xiàn)gien整合Hystrix才會(huì)用 |
配置屬性
feign:
client:
config:
feignName:
connectTimeout: 5000 # 相當(dāng)于Request.Optionsn 連接超時(shí)時(shí)間
readTimeout: 5000 # 相當(dāng)于Request.Options 讀取超時(shí)時(shí)間
loggerLevel: full # 配置Feign的日志級(jí)別,相當(dāng)于代碼配置方式中的Logger
errorDecoder: com.example.SimpleErrorDecoder # Feign的錯(cuò)誤解碼器,相當(dāng)于代碼配置方式中的ErrorDecoder
retryer: com.example.SimpleRetryer # 配置重試,相當(dāng)于代碼配置方式中的Retryer
requestInterceptors: # 配置攔截器,相當(dāng)于代碼配置方式中的RequestInterceptor
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否對(duì)404錯(cuò)誤解碼
decode404: false
encode: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract
Feign還支持對(duì)請(qǐng)求和響應(yīng)進(jìn)行GZIP壓縮,以提高通信效率,配置方式如下:
# 配置請(qǐng)求GZIP壓縮 feign.compression.request.enabled=true # 配置響應(yīng)GZIP壓縮 feign.compression.response.enabled=true # 配置壓縮支持的MIME TYPE feign.compression.request.mime-types=text/xml,application/xml,application/json # 配置壓縮數(shù)據(jù)大小的下限 feign.compression.request.min-request-size=2048
Ribbon配置 VS Feign配置
| 粒度 |
Ribbon |
Feign |
|---|---|---|
| 代碼局部 |
@RibbonClient(configuration=RibbonConfig.class),RibbonConfig類必須加@Configuration,且必須放在父上下文無法掃到的包下 |
@FeignClient(configuration=FeignConfig.class),F(xiàn)eignConfig類的@Configuration可以不加(可選),如果有,必須放在父上下文無法掃到的包下 |
| 代碼全局 |
@RibbonClients(defaultConfigurtion=RibbonConfig.class) |
@EnableFeignClients(defaultConfiguration = FeignConfig.class) ... |
| 配置屬性局部 |
.ribbon.NFLoadBalancerClassName ... |
feign.client.config..loggerLevel ... |
| 配置屬性全局 |
無 | feign.client.config.default.loggerLevel |
Feign 代碼方式 VS 配置屬性方式
| 配置方式 |
有點(diǎn) |
缺點(diǎn) |
|---|---|---|
| 代碼配置 |
基于代碼,更加靈活 |
如果Feign的配置類加了@Configuration注解,需注意父子上下文,線上修改需要重打包,發(fā)布 |
| 屬性配置 |
易上手 配置更加直觀 線上修改無需重新打包,發(fā)布 優(yōu)先級(jí)更高 |
極端場(chǎng)景下沒有代碼配置更加靈活 |
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot項(xiàng)目中Date類型數(shù)據(jù)在接口返回的時(shí)間不正確的問題解決
如果接口返回的Date類型時(shí)間與數(shù)據(jù)庫中datetime不一致,可能是由于沒有正確配置時(shí)區(qū)導(dǎo)致的,解決方法是在yaml配置文件中指定正確的日期格式和時(shí)區(qū)配置,修改配置并重啟項(xiàng)目后,可以獲得正確的時(shí)間,下面就來介紹一下2024-09-09
一文掌握Spring中循環(huán)依賴與三級(jí)緩存
這篇文章主要介紹了Spring中循環(huán)依賴與三級(jí)緩存,Spring通過三級(jí)緩存解決了循環(huán)依賴,其中一級(jí)緩存為單例池,二級(jí)緩存為早期曝光對(duì)象earlySingletonObjects,三級(jí)緩存為早期曝光對(duì)象工廠(singletonFactories),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09
Java對(duì)象的XML序列化與反序列化實(shí)例解析
這篇文章主要介紹了Java對(duì)象的XML序列化與反序列化實(shí)例解析,小編覺得還是挺不錯(cuò)的,這里分享給大家。2017-10-10
FactoryBean?BeanFactory方法使用示例詳解講解
這篇文章主要為大家介紹了FactoryBean?BeanFactory方法使用示例詳解講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
mybatis利用association或collection傳遞多參數(shù)子查詢
今天小編就為大家分享一篇關(guān)于mybatis利用association或collection傳遞多參數(shù)子查詢,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
java操作elasticsearch詳細(xì)方法總結(jié)
elasticsearch是使用Java編寫的一種開源搜索引擎,也是一種分布式的搜索引擎架構(gòu),這篇文章主要給大家介紹了關(guān)于java操作elasticsearch的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
解決java字符串轉(zhuǎn)換成時(shí)間Unparseable date出錯(cuò)的問題
這篇文章主要介紹了解決java字符串轉(zhuǎn)換成時(shí)間Unparseable date出錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

