代码改变世界

禁用feign retryer

2018-08-12 17:26  只喝牛奶的杀手  阅读(4977)  评论(2编辑  收藏  举报

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