Spring boot 断路器不在外国客户处工作+;Netflix Ribbon&x2B;春季重试

Spring boot 断路器不在外国客户处工作+;Netflix Ribbon&x2B;春季重试,spring-boot,feign,spring-retry,netflix-ribbon,Spring Boot,Feign,Spring Retry,Netflix Ribbon,使用带客户端负载平衡器功能区和Spring的外设客户端重试。没有尤里卡 得到: application.yml中的服务器列表 Netflix功能区和Spring重试的默认配置 想要: 从服务器列表连接到第一台服务器 如果出现异常,则断开第一台服务器的断路器N秒 连接到第二台服务器 如果出现异常,则断开第二台服务器的断路器N秒 连接到第三台服务器 ... 等 我得到的是: 从服务器列表连接到第一台服务器 如果出现异常,请连接到第二台服务器 如果出现异常,请连接到第三台服务器 ... 等 实际上,断

使用带客户端负载平衡器功能区和Spring的外设客户端重试。没有尤里卡

得到:

  • application.yml中的服务器列表
  • Netflix功能区和Spring重试的默认配置
  • 想要:

  • 从服务器列表连接到第一台服务器
  • 如果出现异常,则断开第一台服务器的断路器N秒
  • 连接到第二台服务器
  • 如果出现异常,则断开第二台服务器的断路器N秒
  • 连接到第三台服务器 ... 等
  • 我得到的是:

  • 从服务器列表连接到第一台服务器
  • 如果出现异常,请连接到第二台服务器
  • 如果出现异常,请连接到第三台服务器 ... 等
  • 实际上,断路器并没有为停机服务器打开。新请求将从listOfServers发送到所有服务器,而不依赖断路器的状态

    在3次请求失败后在日志中获取消息:

    RibbonLoadBalancedRetryPolicy | host1:8080 RetryCount: 2 Successive Failures: 3 CircuitBreakerTripped:true
    
    但新的请求将被发送到该服务器。虽然CircuitBreakerTripped:true,但我在调试中看到对停机服务器的请求

    功能区文档说明我可以使用AvailabilityFilteringRule:

    此规则将跳过被视为“电路跳闸”或具有高并发连接计数的服务器。默认情况下,如果RestClient在过去三次都未能与实例建立连接,则实例将被电路触发。一旦一个实例被电路跳闸,它将在电路再次被视为闭合之前保持该状态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 {...}
    
    假装客户端配置:

    @Bean
    @Primary
    public Client client(
            CachingSpringLoadBalancerFactory cachingFactory,
            SpringClientFactory clientFactory) {
        ...
        return new LoadBalancerFeignClient(client, cachingFactory, clientFactory);
    }