配置
預設是重試政策為
Retryer.NEVER_RETRY
;
可以修改為
Retryer
預設實作
Retryer.Default
;
或者實作
Retryer
接口自定義實作邏輯.
在Feign重試行為中,它将自動重試IOException,将它們視為與網絡臨時相關的異常,以及從ErrorDecoder抛出的任何RetryableException。
- 這裡可以在
自定義邏輯根據是否抛出
ErrorDecoder
異常來自定義重試邏輯,nice的一比。
RetryableException
方式一
@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
,源碼如下:

FeignClient
所有屬性性中,隻有
configuration
看着跟重試有點關系,再看到
javadoc
提示的
@see FeignClientsConfiguration for the defaults
,該配置為
Feign
的預設配置,源碼如下:
FeignClientsConfiguration
終于見到
Retryer
本尊,可以看到,當容器中缺少實作
Retryer
接口的
Bean
時則自動生成執行個體并注入(
@ConditionalOnMissingBean
的功勞),這裡注入的是
Retryer.NEVER_RETRY
,一個不進行重試的
Retryer
實作類。實作為:
Retryer
Retryer
有2個方法,重點放在
continueOrPropagate(RetryableException e)
上,從方法簽名上看,要麼等待下一次重試,要麼将異常Propagate(傳播)出去,通俗點就是抛異常。
大家應該都知道,
Feign
底層使用的是動态代理,才能實作如此簡單易用的使用體驗。這裡主要講一個類:
SynchronousMethodHandler
,該類動态代理的主要類,是以它的屬性跟
Feign
的參數很相似,主要源碼如下:
SynchronousMethodHandler and Feign
在
invoke(Object[] argv)
方法中,當捕獲
RetryableException
異常時,會調用
Retryer
的
continueOrPropagate
方法,根據執行結果,該重試的重試,該抛異常的抛異常。
而根據
NERVER_RETRY
的源碼,就是直接抛異常,不進行重試。
參考:
- https://www.jianshu.com/p/c863556f8de1