问题描述
将 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 (将#修改为@)