1. 程式人生 > 程式設計 >Spring Cloud Feign組成配置過程解析

Spring Cloud Feign組成配置過程解析

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)
...
配置屬性區域性
.ribbon.NFLoadBalancerClassName
...
feign.client.config..loggerLevel
...
配置屬性全域性
feign.client.config.default.loggerLevel

Feign 程式碼方式 VS 配置屬性方式

配置方式
有點
缺點
程式碼配置
基於程式碼,更加靈活
如果Feign的配置類加了@Configuration註解,需注意父子上下文,線上修改需要重打包,釋出
屬性配置
易上手
配置更加直觀
線上修改無需重新打包,釋出
優先順序更高
極端場景下沒有程式碼配置更加靈活

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。