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<RequestInterceptor> 攔截器
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),FeignConfig類的@Configuration可以不加(可選),如果有,必須放在父上下文無法掃到的包下
代碼全局 @RibbonClients(defaultConfigurtion=RibbonConfig.class) @EnableFeignClients(defaultConfiguration = FeignConfig.class)
...
配置屬性局部 <clientName(服務(wù)名稱)>.ribbon.NFLoadBalancerClassName
...
feign.client.config.<clientName(服務(wù)名稱)>.loggerLevel
...
配置屬性全局 feign.client.config.default.loggerLevel

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

配置方式 有點(diǎn) 缺點(diǎn)
代碼配置 基于代碼,更加靈活 如果Feign的配置類加了@Configuration注解,需注意父子上下文,線上修改需要重打包,發(fā)布
屬性配置 易上手
配置更加直觀
線上修改無需重新打包,發(fā)布
優(yōu)先級(jí)更高
極端場景下沒有代碼配置更加靈活

優(yōu)先級(jí):細(xì)粒度屬性配置 > 細(xì)粒度代碼配置 > 全局屬性配置 > 全局代碼配置

趙小胖個(gè)人博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容