SpringCloud Feign 之 超時重試次數探究
上篇文章,我們對Feign的fallback有一個初步的體驗,在這里我們回顧一下,Fallback主要是用來解決依賴的服務不可用或者調用服務失敗或超時,使用默認的返回值。實際應用中, 在Fallback之前,需要對服務配置重試機制,當多次重試服務,還是服務不可用的情況下,就觸發Fallback。
這里,我們對重試機制配置以及重試次數進行一次探究。
Feign的超時
Feign接口調用分兩層,Ribbon(負載均衡)和Hystrix(熔斷器)的調用,因此Feign的超時時間就是
ribbon的超時時間和Hystrix的超時時間的結合(不是簡單相加)。
##hystrix的超時時間
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 60000
##Ribbon超時
ribbon:
ConnectTimeout: 20000 #毫秒 連接超時時間
ReadTimeout: 20000 #毫秒 邏輯處理超時時間
正常情況下,因為Ribbon有重試機制,所以Ribb的超時時間是 < Hystrix熔斷的超時。
Feign的重試
Feign的重試機制在源碼中默認關閉的,因為Ribbon的重試機制和Fiegn原來的重試機制沖突,所以在一般情況下,Feign的重試機制指的就是Ribbon的重試機制,本文也是如此。
Ribbon超時重試
##Ribbon超時重試配置
ribbon:
ConnectTimeout: 20000 #毫秒 連接超時時間
ReadTimeout: 20000 #毫秒 邏輯處理超時時間
OkToRetryOnAllOperations: true # 是否對所有操作都進行重試
MaxAutoRetries: 2 # 對當前實例的最大重試次數(請求服務超時6s則會再請求一次)
MaxAutoRetriesNextServer: 1 # 切換實例的最大重試次數(如果還失敗就切換下
Ribbon超時重試次數(總的請求次數):(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)
如果Ribbon沒有配置重試時間和次數,默認1S超時,默認重試1次。
重試次數驗證
-
設置超時時間2S,在demo中sleep 3S,會發現請求了6次。
-
不配置重試時間和次數,sleep 3S,重試1次,一共請求2次。
根據測試結果,可看出結論正確。總的請求次數):(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)
其他
-
如果重試期間,調用時間超過了 Hystrix熔斷的超時時間,便會立即熔斷,進行FallBack。
根據上面描述可大致計算出Hystrix可以參考的超時時間,來保持可以使用到重試機制。
hystrix超時時間的計算:(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) * (ConnectTimeout+ReadTimeout) 。
-
當ribbon超時后且hystrix沒有超時,就會使用到重試機制。
-
默認情況下,GET方式請求無論是連接異常還是讀取異常,都會進行重試,非GET方式請求,只有連接異常時,才會進行重試(從其他博文學習到,暫未驗證)
-
demo地址:https://github.com/lanxuan826/sample-library/tree/master/feigndemo-fallback