為什么要禁用retryer?其實主要是為了Debug,禁用feign retryer有兩面性,如果接口做好冪等性,retry不影響,但是總有一些意外發生,比如:有一個實例發生了故障而該情況還沒有被服務治理機制及時的發現和摘除,這時候客戶端訪問該節點的時候自然會失敗。所以,為了構建更為健壯的應用系統,我們希望當請求失敗的時候能夠有一定策略的重試機制,而不是直接返回失敗。這個時候就需要Retryer;像一些更新德接口,如果不做好冪等性,retry可能會導致數據錯亂;dev環境feign調用會頻繁出現retry,影響Debug;下面讓我們一起開啟debug模式:
1,下載feign-core
// https://mvnrepository.com/artifact/com.netflix.feign/feign-core
runtime group: 'com.netflix.feign', name: 'feign-core', version: '8.18.0'
feign-core是runtime不是compile,build會報錯;把jar包下載下來放在libs目錄下,用compile的方式。
compile fileTree(dir:'libs',include:['*.jar'])
2,Retryer不去重試
@Configuration public class RetryerConfig { @Bean @Primary Retryer feignRetryer() { return Retryer.NEVER_RETRY; } }
配置完retryer之后還會出現兩次請求,為什么?我們沒有配置ribbon相關的properties。
3,Ribbon properties
#Max number of retries ribbon.MaxAutoRetries=0 #Max number of next servers to retry (excluding the first server) ribbon.MaxAutoRetriesNextServer=0 #Whether all operations can be retried for this client ribbon.OkToRetryOnAllOperations=false #Interval to refresh the server list from the source ribbon.ServerListRefreshInterval=2000 #Connect timeout used by Apache HttpClient ribbon.ConnectTimeout=3000 #Read timeout used by Apache HttpClient ribbon.ReadTimeout=5000
-
xxx-service.ribbon.ConnectTimeout
:請求連接的超時時間 -
xxx-service.ribbon.ReadTimeout
:請求處理的超時時間 -
xxx-service.ribbon.OkToRetryOnAllOperations
:對所有操作請求都進行重試 -
xxx-service.ribbon.MaxAutoRetriesNextServer
:切換實例的重試次數 -
xxx-service.ribbon.MaxAutoRetries
:對當前實例的重試次數
根據如上配置,當訪問到故障請求的時候,它會再嘗試訪問一次當前實例(次數由MaxAutoRetries
配置),如果不行,就換一個實例進行訪問,如果還是不行,再換一次實例訪問(更換次數由MaxAutoRetriesNextServer
配置),如果依然不行,返回失敗信息。大家要設置Connect和Read超時時間的話,不要小於默認設置的超時時間;如果同時使用Retryer和Hystrix,建議Hystrix的超時>其他組件的超時,否則將可能導致重試特性失效。
其實最后再次強調一下,這篇只適合debug,生產上不要去禁用Retryer,但是小伙伴們一定要做好冪等性。下一篇聊一下Hystrix,歡迎吐槽!上一篇小哥哥說過要考研,現在已經決定了,有考驗經驗的小伙伴可以留言分享一下經驗。不要玻璃心,不慫就是一個字干!自勉!