您现在的位置是:首页 >学无止境 >springcloud之Feign、ribbon设置超时时间和重试机制的总结网站首页学无止境

springcloud之Feign、ribbon设置超时时间和重试机制的总结

桃月十二_ 2023-06-12 20:00:03
简介springcloud之Feign、ribbon设置超时时间和重试机制的总结

重试

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  #是否所有操作都重试

在这里插入图片描述
在这里插入图片描述
可以看到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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。