如何解决断路器在 Feign 客户端 + Netflix Ribbon + Spring Retry 中不起作用
将 Feign 客户端与客户端负载均衡器 Ribbon 和 Spring Retry 一起使用。没有尤里卡。
得到:
- application.yml 中的服务器列表
- Netflix Ribbon 和 Spring Retry 的默认配置
想要:
- 从 listOfServers 连接到第一台服务器
- 如果出现异常,则打开第一台服务器的断路器 N 秒
- 连接到第二台服务器
- 如果出现异常,则打开第二台服务器的断路器 N 秒
- 连接到第三台服务器 ...等
我得到了什么:
- 从 listOfServers 连接到第一台服务器
- 如果出现异常,连接到第二台服务器
- 如果出现异常,连接到第三台服务器 ...等
断路器实际上并没有为停机的服务器打开。新请求将从listOfServers发送到所有服务器,不依赖于Circuit Breaker的状态。
在 3 次请求失败后在日志中收到消息:
RibbonLoadBalancedRetryPolicy | host1:8080 RetryCount: 2 Successive Failures: 3 CircuitBreakerTripped:true
否则新请求将被发送到该服务器。尽管 CircuitBreakerTripped:true,我在调试中看到对停机服务器的请求。
功能区文档说我可以使用 AvailabilityFilteringRule:
此规则将跳过被视为“电路跳闸”或具有高并发连接数的服务器。默认情况下,如果 RestClient 在最近 3 次未能与其建立连接,则实例会被电路跳闸。一旦一个实例被电路跳闸,它将在电路再次被视为关闭之前保持该状态 30 秒。但是,如果它继续连接失败,它将再次“电路跳闸”,并且它变为“电路关闭”的等待时间将随着连续失败的次数呈指数增长。
但这无济于事。无论如何,重试逻辑和其他功能区功能都可以正常工作,但断路器除外。
知道我错过了什么吗?
应用配置:
niws:
loadbalancer:
default:
circuitTripMaxTimeoutSeconds: 60
connectionFailureCountThreshold: 1
my-service:
ribbon:
eureka:
enabled: false
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
ServerListRefreshInterval: 60000
listOfServers: http://localhost:8182,http://localhost:8183,http://localhost:8184
OkToRetryOnAllOperations: true
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 2
假客户端:
@FeignClient(
name = "my-service",configuration = {
FeignClientConfiguration.class
}
)
public interface Client {...}
Feign 客户端配置:
@Bean
@Primary
public Client client(
CachingSpringLoadBalancerFactory cachingFactory,SpringClientFactory clientFactory) {
...
return new LoadBalancerFeignClient(client,cachingFactory,clientFactory);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。