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的三板斧第一步:加依賴web

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第二步:寫註解spring

@EnableFeignClients //在啓動類上加

第三步:寫配置json

 

如何給Feign添加日誌級別

細粒度

方式一:代碼實現第一步:添加Feign配置類,能夠添加在主類下,可是不用添加@Configuration。若是添加了@Configuration並且又放在了主類之下,那麼就會全部Feign客戶端實例共享,同Ribbon配置類同樣父子上下文加載衝突;若是必定添加@Configuration,就放在主類加載以外的包。建議仍是不用加@Configurationapp

public class FeignConfig {
    @Bean
    public Logger.Level Logger() {
        return Logger.Level.FULL;
    }
}

第二步:給@FeignClient添加配置類svg

//@FeignClient configuration = GoodsFeignConfig.class 細粒度配置,指定配置類
@FeignClient(name = "goods", configuration = FeignConfig.class)

第四步:寫配置wordpress

logging:
  level:
    com.xxx.xxx.FeignAPI: DEBUG #須要將FeignClient接口全路徑寫上# 開啓日誌 格式爲logging.level. Feign客戶端路徑

方式二:配置屬性實現微服務

feign:
  client:
    config:
      #想要調用的微服務名稱
      server-1:
        loggerLevel: FULL

全局配置

方式一:代碼實現添加了@Configuration放在了主類之下,那麼就會全部Feign客戶端實例共享,同Ribbon配置類同樣父子上下文加載衝突;讓父子上下文ComponentScan重疊(強烈不建議)惟一正確方式ui

//在啓動類上爲@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註解,需注意父子上下文,線上修改須要重打包,發佈
屬性配置
易上手
配置更加直觀
線上修改無需從新打包,發佈
優先級更高
極端場景下沒有代碼配置更加靈活

優先級:細粒度屬性配置 > 細粒度代碼配置 > 全局屬性配置 > 全局代碼配置

趙小胖我的博客

相關文章
相關標籤/搜索