Spring Cloud Feign 組成和配置
阿新 • • 發佈:2019-12-31
Feign的組成
介面 |
作用 |
預設值 |
---|---|---|
Feign.Builder |
Feign的入口 |
Feign.Builder |
Client |
Feign底層用什麼去請求 |
和Ribbon配合時:LoadBalancerFeignClient 不和Ribbon配合時: Fgien.Client.Default
|
Contract |
契約,註解支援 |
SpringMVCContract |
Encoder |
解碼器,用於將獨享轉換成HTTP請求訊息體 |
SpringEncoder |
Decoder |
編碼器,將相應訊息體轉成物件 |
ResponseEntityDecoder |
Logger |
日誌管理器 |
Slf4jLogger |
RequestInterceptor |
用於為每個請求新增通用邏輯(攔截器,例子:比如想給每個請求都帶上heared) |
無 |
Feign的日記級別
日誌級別 |
列印內容 |
---|---|
NONE(預設) |
不記錄任何日誌 |
BASIC |
僅記錄請求方法,URL,響應狀態程式碼以及執行時間(適合生產環境) |
HEADERS |
記錄BASIC級別的基礎上,記錄請求和響應的header |
FULL |
記錄請求和絃ineader,body和元資料 |
首先如何整合Feign
遵循SpringBoot的三板斧第一步:加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>複製程式碼
第二步:寫註解
@EnableFeignClients //在啟動類上加複製程式碼
第三步:寫配置
複製程式碼
如何給Feign新增日誌級別
細粒度
方式一:程式碼實現第一步:新增Feign配置類,可以新增在主類下,但是不用新增@Configuration
@Configuration
而且又放在了主類之下,那麼就會所有Feign客戶端例項共享,同Ribbon配置類一樣父子上下文載入衝突;如果一定新增@Configuration
,就放在主類載入之外的包。建議還是不用加@Configuration
。
public class FeignConfig {
@Bean
public Logger.Level Logger() {
return Logger.Level.FULL;
}
}複製程式碼
第二步:給@FeignClient
新增配置類
//@FeignClient configuration = GoodsFeignConfig.class 細粒度配置,指定配置類
@FeignClient(name = "goods",configuration = FeignConfig.class)複製程式碼
第四步:寫配置
logging:
level:
com.xxx.xxx.FeignAPI: DEBUG #需要將FeignClient介面全路徑寫上# 開啟日誌 格式為logging.level.+Feign客戶端路徑複製程式碼
方式二:配置屬性實現
feign:
client:
config:
#想要呼叫的微服務名稱
server-1:
loggerLevel: FULL複製程式碼
全域性配置
方式一:程式碼實現添加了@Configuration
放在了主類之下,那麼就會所有Feign客戶端例項共享,同Ribbon配置類一樣父子上下文載入衝突;讓父子上下文ComponentScan重疊(強烈不建議)唯一正確方式
//在啟動類上為@EnableFeignClients註解新增defaultConfiguration配置
@EnableFeignClients(defaultConfiguration = FeignConfig.class)複製程式碼
方式二:配置屬性實現
feign:
client:
config:
#將呼叫的微服務名稱改成default就配置成全域性的了
default:
loggerLevel: FULL複製程式碼
Feign支援的配置項
程式碼方式
配置項 |
作用 |
---|---|
Logger.Level |
指定日誌級別 |
Retryer |
指定重試策略 |
ErrorDecoder |
指定錯誤解碼器 |
Request.Options |
超時時間 |
Collection |
攔截器 |
SetterFactory |
用於設定Hystrix的配置屬性,Fgien整合Hystrix才會用 |
配置屬性
feign:
client:
config:
feignName:
connectTimeout: 5000 # 相當於Request.Optionsn 連線超時時間
readTimeout: 5000 # 相當於Request.Options 讀取超時時間
loggerLevel: full # 配置Feign的日誌級別,相當於程式碼配置方式中的Logger
errorDecoder: com.example.SimpleErrorDecoder # Feign的錯誤解碼器,相當於程式碼配置方式中的ErrorDecoder
retryer: com.example.SimpleRetryer # 配置重試,相當於程式碼配置方式中的Retryer
requestInterceptors: # 配置攔截器,相當於程式碼配置方式中的RequestInterceptor
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
# 是否對404錯誤解碼
decode404: false
encode: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract複製程式碼
Feign還支援對請求和響應進行GZIP壓縮,以提高通訊效率,配置方式如下:
# 配置請求GZIP壓縮
feign.compression.request.enabled=true
# 配置響應GZIP壓縮
feign.compression.response.enabled=true
# 配置壓縮支援的MIME TYPE
feign.compression.request.mime-types=text/xml,application/xml,application/json
# 配置壓縮資料大小的下限
feign.compression.request.min-request-size=2048複製程式碼
Ribbon配置 VS Feign配置
粒度 |
Ribbon |
Feign |
---|---|---|
程式碼區域性 |
@RibbonClient(configuration=RibbonConfig.class) ,RibbonConfig 類必須加@Configuration ,且必須放在父上下文無法掃到的包下 |
@FeignClient(configuration=FeignConfig.class) ,FeignConfig 類的@Configuration 可以不加(可選),如果有,必須放在父上下文無法掃到的包下 |
程式碼全域性 |
@RibbonClients(defaultConfigurtion=RibbonConfig.class) |
@EnableFeignClients(defaultConfiguration = FeignConfig.class) ... |
配置屬性區域性 |
... |
feign.client.config. ... |
配置屬性全域性 |
無 | feign.client.config.default.loggerLevel |
Feign 程式碼方式 VS 配置屬性方式
配置方式 |
有點 |
缺點 |
---|---|---|
程式碼配置 |
基於程式碼,更加靈活 |
如果Feign的配置類加了@Configuration 註解,需注意父子上下文,線上修改需要重打包,釋出 |
屬性配置 |
易上手 配置更加直觀 線上修改無需重新打包,釋出 優先順序更高 |
極端場景下沒有程式碼配置更加靈活 |
優先順序:細粒度屬性配置 > 細粒度程式碼配置 > 全域性屬性配置 > 全域性程式碼配置