Ribbon、Feign、Hystrix超时&重试&熔断问题

简介: 在使用Ribbon、Feign、Hystrix组合时,因为配置的问题出现以下现象,让我的大脑CPU烧的不行不行(拿我老家话说就是“脑子ran滴奥”)

问题描述

在使用Ribbon、Feign、Hystrix组合时,因为配置的问题出现以下现象,让我的大脑CPU烧的不行不行(拿我老家话说就是“脑子ran滴奥”)。

重试次数不生效

使用以下配置时fegin调用超时重试次数一直是3次,共调用了4次。(后面发现是我对配置理解有问题)

# 连接超时时间
ribbon.ConnectTimeout=1000
# 响应超时时间
ribbon.ReadTimeout=3000
# 同一服务器上的最大重试次数(不包括首次尝试)
ribbon.MaxAutoRetries=1
# 要重试的下一个服务器的最大数量(不包括第一个服务器)
ribbon.MaxAutoRetriesNextServer=1
# 是否所有操作都重试,默认在get请求下会重试,其他情况不会重试

同时在被调用的服务中睡眠了5秒,达到超时效果。

在这里插入图片描述

开启熔断后重试次数生效

feign开启熔断后,后台日志打印共调用服务2次,然后回退降级了。配置如下:

# 开启fegin熔断
feign.hystrix.enabled=true
# hystrix的超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000

fallbackFactory回退降级异常为空

feign使用fallbackFactory回退方式捕捉异常时,无论超时、服务不存在、业务异常等原因,异常信息总是为null。

在这里插入图片描述

问题1分析

针对重试次数不生效问题是这样的,刚开始我认为的MaxAutoRetries和MaxAutoRetriesNextServer都配置为1,重试次数为1次,一共请求2次。

其实当MaxAutoRetriesNextServer为1时,请求超时或失败后不论有几个实例都会切换一次,也就是说即使只有1个实例,也会切换到自己,然后再去请求,所以就出现了重试次数为3次的现象(第一次超时重试+切换实例请求+切换实例超时重试)。

所以Ribbon请求最多会被执行(1 + maxAutoRetries ) * (1 + MaxAutoRetriesNextServer)次。

问题2、3分析

问题1了解后,问题2、3也就清晰可见了。

首先要知道feign默认支持Ribbon,二者的重试机制有冲突,所以源码关闭了feign的重试机制,使用Ribbon的重试机制。

其次Hystrix是在feign的基础上调用后进行熔断降级操作,所以Hystrix的超时时间要大于feign调用的总超时时间,也就是ribbon的总超时时间,否则重试机制就没有任何意义。

所以在对问题1理解有误时,问题2“开启熔断后重试次数生效”这个事我就很费解。 现在看来,原来是hystrix的超时时间到了,对调用依赖进行了熔断降级。

问题3“fallbackFactory回退降级异常为空”也是因为hystrix的超时时间先到,而调用还没给响应,没有捕捉到真正的异常信息。

当把Hystrix的超时时间设置为(1 + maxAutoRetries ) * (1 + MaxAutoRetriesNextServer)✖️ReadTimeout时,问题2、3也就解释的通了。

总结

feign请求次数计算

feign的总请求次数=(1 + maxAutoRetries ) * (1 + MaxAutoRetriesNextServer)

Hystrix超时时间设置公式

Hystrix超时时间=(1 + maxAutoRetries ) * (1 + MaxAutoRetriesNextServer)✖️ReadTimeout

相关文章
|
3月前
服务熔断器-Hystrix
服务熔断器-Hystrix
40 2
|
3月前
|
Java Sentinel
【熔断限流组件resilience4j和hystrix】
【熔断限流组件resilience4j和hystrix】
130 0
|
2月前
springCloud之服务降级熔断Hystrix、OpenFeign
springCloud之服务降级熔断Hystrix、OpenFeign
81 0
|
1天前
|
缓存 监控 负载均衡
一文讲明Hystrix熔断器
这篇文章详细阐述了Hystrix熔断器的原理和应用,解释了分布式系统中服务雪崩的问题,并展示了如何在Spring Cloud框架中使用Hystrix进行熔断和降级处理。
一文讲明Hystrix熔断器
|
4天前
|
负载均衡 Java Spring
Ribbon的超时配置会覆盖OpenFeign的超时配置吗
该文章详细分析了OpenFeign与Ribbon之间的超时配置关系,解释了Ribbon如何覆盖OpenFeign的默认超时配置,并探讨了OpenFeign超时配置的动态修改方案。
|
22天前
|
负载均衡 Java API
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
38 11
|
26天前
|
负载均衡 Java API
通用快照方案问题之Feign添加请求拦截器如何解决
通用快照方案问题之Feign添加请求拦截器如何解决
15 1
|
26天前
|
监控 Cloud Native Java
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
30 0
|
26天前
|
负载均衡 算法 Java
通用快照方案问题之Ribbon和RestTemplate的结合使用如何解决
通用快照方案问题之Ribbon和RestTemplate的结合使用如何解决
20 0
|
3月前
|
负载均衡 Java 应用服务中间件
Ribbon、Feign和OpenFeign的区别来了
Ribbon、Feign和OpenFeign的区别来了