天天看點

Spring Cloud Feign 重試配置

配置

預設是重試政策為

Retryer.NEVER_RETRY

;

可以修改為

Retryer

預設實作

Retryer.Default

;

或者實作

Retryer

接口自定義實作邏輯.

在Feign重試行為中,它将自動重試IOException,将它們視為與網絡臨時相關的異常,以及從ErrorDecoder抛出的任何RetryableException。
  • 這裡可以在

    ErrorDecoder

    自定義邏輯根據是否抛出

    RetryableException

    異常來自定義重試邏輯,nice的一比。

方式一

@Configuration
@EnableFeignClients("com.laker.zuul.feign")
public class FeignConfig {
    @Configuration
    public class FooConfiguration {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.BASIC;
        }

    }

    @Bean
    public Retryer feignRetryer() {
        //最大請求次數為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s,
        return new Retryer.Default();
    }
}
           

方式二

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer

           

源碼分析

Feign自帶的重試機制

首先,在Spring Cloud OpenFeign中,入口為

FeignClient

,源碼如下:

Spring Cloud Feign 重試配置

FeignClient

所有屬性性中,隻有

configuration

看着跟重試有點關系,再看到

javadoc

提示的

@see FeignClientsConfiguration for the defaults

,該配置為

Feign

的預設配置,源碼如下:

Spring Cloud Feign 重試配置

FeignClientsConfiguration

終于見到

Retryer

本尊,可以看到,當容器中缺少實作

Retryer

接口的

Bean

時則自動生成執行個體并注入(

@ConditionalOnMissingBean

的功勞),這裡注入的是

Retryer.NEVER_RETRY

,一個不進行重試的

Retryer

實作類。實作為:

Spring Cloud Feign 重試配置

Retryer

Retryer

有2個方法,重點放在

continueOrPropagate(RetryableException e)

上,從方法簽名上看,要麼等待下一次重試,要麼将異常Propagate(傳播)出去,通俗點就是抛異常。

大家應該都知道,

Feign

底層使用的是動态代理,才能實作如此簡單易用的使用體驗。這裡主要講一個類:

SynchronousMethodHandler

,該類動态代理的主要類,是以它的屬性跟

Feign

的參數很相似,主要源碼如下:

Spring Cloud Feign 重試配置

SynchronousMethodHandler and Feign

invoke(Object[] argv)

方法中,當捕獲

RetryableException

異常時,會調用

Retryer

continueOrPropagate

方法,根據執行結果,該重試的重試,該抛異常的抛異常。

而根據

NERVER_RETRY

的源碼,就是直接抛異常,不進行重試。

參考:

  • https://www.jianshu.com/p/c863556f8de1

繼續閱讀