为何要禁用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,欢迎吐槽!上一篇小哥哥说过要考研,如今已经决定了,有考验经验的小伙伴能够留言分享一下经验。不要玻璃心,不怂就是一个字干!自勉!