相关推荐recommended
springcloud之Feign、ribbon设置超时时间和重试机制的总结
作者:mmseoamin日期:2023-12-14

目录标题

  • 重试
    • ribbon的重试机制
      • 重试的次数
      • hystrix超时时间
      • 举个例子
      • fegin重试
      • Feign和Ribbon的重试机制
      • 超时时间
        • ribbon和Feign
          • ribbon和Feign默认超时时间
          • 关于ribbon和Feign超时时间配置说明
          • 关于hystrix默认超时时间与配置说明

            重试

            ribbon的重试机制

            ribbon:
              #连接超时时间(ms)
              ConnectTimeout: 6000
              #业务逻辑超时时间(ms)
              ReadTimeout: 6000
              
              #同一台实例最大重试次数,不包括首次调用(对当前实例的重试次数)
              MaxAutoRetries: 1
              #重试负载均衡其他的实例最大重试次数,不包括首次调用(切换实例的重试次数)
              MaxAutoRetriesNextServer: 1
              #是否所有操作都重试,
              # false:get请求中,连接超时,读取超时都会重试,其他请求(put,post)连接超时重试,读取超时不重试。
              # true:get请求中,连接超时,读取超时都会重试,其他请求(put,post)连接超时重试,读取超时重试。
              ribbon.OkToRetryOnAllOperations: false
            

            ribbon.MaxAutoRetries 设置为1,请求某服务6s超时后准备重试,该重试策略会先尝试再访问该实例,如果失败1次之后才更换实例访问。 ribbon.MaxAutoRetriesNextServer 决定了尝试更换1次实例。

            重试的次数

            (MaxAutoRetries+1)* (MaxAutoRetriesNextServer+1)- 1 即重试3次 则一共产生4次调用。

            hystrix超时时间

            如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义。

            hystrix超时时间的计算: (1 + MaxAutoRetries )*(1+ MaxAutoRetriesNextServer) *(ReadTimeout +ConnectTimeout)。

            如果服务没下线,ConnectTimeout可以忽略不计;最接近的实际时间 (1 + MaxAutoRetries )*(1+

            MaxAutoRetriesNextServer) *(ReadTimeout);

            一般ReadTimeout > ConnectTimeout,所以hystrix的超时时间设置可以以这个计算为准;

            当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。

            如果不配置ribbon的重试次数,默认会重试一次

            注意:

            默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试

            非GET方式请求,只有连接异常时,才会进行重试

            举个例子

            ribbon:
              ReadTimeout: 2000
              ConnectTimeout: 2000
              MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
              MaxAutoRetriesNextServer: 3 #重试负载均衡其他的实例最大重试次数,不包括首次调用
              OkToRetryOnAllOperations: true  #是否所有操作都重试
            

            springcloud之Feign、ribbon设置超时时间和重试机制的总结,在这里插入图片描述,第1张

            springcloud之Feign、ribbon设置超时时间和重试机制的总结,在这里插入图片描述,第2张

            可以看到2台机器分别被请求了四次,而且每个时间的间隔大约为2秒左右。一开始请求的是8083接口,请求的次数为8083,8083,8081,8081,8083,8083,8081,8083。

            那它的计算公式为:(MaxAutoRetries+ 1)*(MaxAutoRetriesNextServer+1) =8次。

            fegin重试

            默认是重试5次,每次重试间隔100ms,最大重试间隔不超过1s

            可以通过在FeignClient的config配置类中重写Retryer方法,修改Feign的重试方法和间隔时间

            period重试间隔时间ms,maxPeriod最大重试间隔时间ms,maxAttempts最大重试次数(包含第一次请求,即重试次数=maxAttempts-1)

            原文链接:https://blog.csdn.net/u010471571/article/details/120764060

            更多详情:https://cloud.tencent.com/developer/article/2260187

            Feign和Ribbon的重试机制

            Feign 和 Ribbon重试,其实二者的重试机制相互独立,并无联系。如果一个http请求,如果feign和ribbon都配置了重试机制,请求总次数 n (计算公式)为Feign 和 Ribbon 配置参数的笛卡尔积。

            计算公式:n(请求总次数)=feign(默认5次) * (MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)

            注意:+1是代表ribbon本身默认的请求。

            Feign和Ribbon的重试机制相当于一个双层循环,feign重试机制在外层,Ribbon的重试机制在里层,每执行一次feign的重试机制,内层的Ribbon的重试机制都会全部执行一次。

            feign的重试机制相对来说比较鸡肋,使用Feign 的时候一般会关闭该功能。Ribbon的重试机制默认配置为0,也就是默认是去除重试机制的。

            超时时间

            feign/ribbon对应的是请求的时间

            hystrix对应的是断路器的时间

            一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)

            ribbon和Feign

            ribbon和Feign默认超时时间

            ribbon和Feign默认超时时间都是1s。

            关于ribbon和Feign超时时间配置说明

            Feign 和 Ribbon 的超时时间只会有一个生效。

            当我们没有显式配饰feign的超时时间的是时候,如果配置了ribbon的超时时间,则只有这个配置会生效,feign默认的1s超时无效

            如果我们feign和ribbon的超时时间都配置了,会以feign配置的为准

            feign设置单个接口超时:通过指定的contextId。

            ribbon不能指定单个接口超时时间,可以用feign配置单个接口超时,feign和ribbon配置超时同时存在时,feign的配置生效。

            关于hystrix默认超时时间与配置说明

            如果配置了hystrix功能,那么它的超时时间默认就是开启的,且该时间是1秒,这个时间和ribbon的超时时间会同时起作用,不像上面的feign的超时时间和ribbon超时时间二选一,我们可以通过上面的配置hystrix的超时时间让它更长,或者显式禁用hystrix的超时时间

            fegin重试:https://blog.csdn.net/u010471571/article/details/120764060

            https://blog.csdn.net/qq_29860591/article/details/120916339

            https://blog.csdn.net/wounler/article/details/124178411

            https://blog.csdn.net/east123321/article/details/82385816

            https://www.jianshu.com/p/b470a2352881

            https://blog.csdn.net/east123321/article/details/82385816