爲何要禁用retryer?其實主要是爲了Debug,禁用feign retryer有兩面性,若是接口作好冪等性,retry不影響,可是總有一些意外發生,好比:有一個實例發生了故障而該狀況尚未被服務治理機制及時的發現和摘除,這時候客戶端訪問該節點的時候天然會失敗。因此,爲了構建更爲健壯的應用系統,咱們但願當請求失敗的時候可以有必定策略的重試機制,而不是直接返回失敗。這個時候就須要Retryer;像一些更新德接口,若是不作好冪等性,retry可能會致使數據錯亂;dev環境feign調用會頻繁出現retry,影響Debug;下面讓咱們一塊兒開啓debug模式:java
1,下載feign-coreui
// https://mvnrepository.com/artifact/com.netflix.feign/feign-core
runtime group: 'com.netflix.feign', name: 'feign-core', version: '8.18.0'this
feign-core是runtime不是compile,build會報錯;把jar包下載下來放在libs目錄下,用compile的方式。.net
compile fileTree(dir:'libs',include:['*.jar'])debug
2,Retryer不去重試code
@Configuration public class RetryerConfig { @Bean @Primary Retryer feignRetryer() { return Retryer.NEVER_RETRY; } }
配置完retryer以後還會出現兩次請求,爲何?咱們沒有配置ribbon相關的properties。server
3,Ribbon propertiesblog
#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
:請求處理的超時時間get
xxx-service.ribbon.OkToRetryOnAllOperations
:對全部操做請求都進行重試
xxx-service.ribbon.MaxAutoRetriesNextServer
:切換實例的重試次數
xxx-service.ribbon.MaxAutoRetries
:對當前實例的重試次數
根據如上配置,當訪問到故障請求的時候,它會再嘗試訪問一次當前實例(次數由MaxAutoRetries
配置),若是不行,就換一個實例進行訪問,若是仍是不行,再換一次實例訪問(更換次數由MaxAutoRetriesNextServer
配置),若是依然不行,返回失敗信息。你們要設置Connect和Read超時時間的話,不要小於默認設置的超時時間;若是同時使用Retryer和Hystrix,建議Hystrix的超時>其餘組件的超時,不然將可能致使重試特性失效。
其實最後再次強調一下,這篇只適合debug,生產上不要去禁用Retryer,可是小夥伴們必定要作好冪等性。下一篇聊一下Hystrix,歡迎吐槽!上一篇小哥哥說過要考研,如今已經決定了,有考驗經驗的小夥伴能夠留言分享一下經驗。不要玻璃心,不慫就是一個字幹!自勉!