springcloud之Feign、ribbon设置超时时间和重试机制的总结
一 超时时间配置
如果在一个微服务当中对同一个接口同时配置了Hystrix与ribbon两个超时时间,则在接口调用的时候,两个计时器会同时读秒。
比如,访问一个接口需要2秒,你的ribbon配置的超时时间是3秒,Hystrix配置的超时时间是1秒。
如果没有配置Hystrix的话,访问一个接口需要2秒,你的ribbon配置的超时时间是3秒,Hystrix配置的超时时间是1秒,会有异常。
注:刚刚又测试了一下,2个都要配置一下,要不就是hystrix和ribbon或者和feign
feign: hystrix: enabled: true # client: # config: # service-product: # readTimeout: 6000 # connectTimeout: 6000
在这个地方建议配置Hystrix的超时时间要大于ribbon的超时时间,否则会在接口调用还未完成的时候直接进入回调方法。
Hystrix与ribbon的默认请求超时时间都是1秒
附配置代码:
server
一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制) 因为ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,源码如下
要开启Feign的重试机制如下:(Feign默认重试五次 源码中有)
二、ribbon的重试机制
设置重试次数:
ribbon
根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用 如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义 hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)*3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次 注意: 默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试 非GET方式请求,只有连接异常时,才会进行重试
参考:https://blog.csdn.net/qq_31404603/article/details/88696848 https://blog.csdn.net/east123321/article/details/82385816