【问题标题】:CircuitBreaker not loading defaults from yaml fileCircuitBreaker 未从 yaml 文件加载默认值
【发布时间】:2021-04-30 17:28:19
【问题描述】:

我有一个使用 Resilience4j(1.3 版)CircuitBreaker (CB) 的 Spring Boot 2、Java 8 应用程序。我的应用程序 yaml 中的默认 CB 属性如下所示 -

resilience4j.circuitbreaker:
  configs:
    default:
      registerHealthIndicator: true
      slidingWindowSize: 10
      minimumNumberOfCalls: 5
      permittedNumberOfCallsInHalfOpenState: 3
      automaticTransitionFromOpenToHalfOpenEnabled: true
      waitDurationInOpenState: 10000
      failureRateThreshold: 50
      eventConsumerBufferSize: 10
      recordExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.util.concurrent.TimeoutException
        - java.io.IOException
      ignoreExceptions:
        - org.springframework.web.client.HttpClientErrorException

我希望我创建的每个 CB 都会以这些默认值结束,但事实并非如此。

// Case 1: Does not load defaults from yaml
@Bean
CircuitBreaker xCircuitBreaker(CircuitBreakerRegistry circuitBreakerRegistry) {
   return circuitBreakerRegistry.circuitBreaker("xCircuitBreaker");
}

// Case 2: Does not load defaults from yaml
@Bean
CircuitBreaker yCircuitBreaker() {
   return CircuitBreaker.ofDefaults("yCircuitBreaker");
}

// Case 3: Works
@Bean
public CircuitBreaker zCircuitBreaker(CircuitBreakerRegistry circuitBreakerRegistry,
    @Value("${resilience4j.circuitbreaker.configs.default.slidingWindowSize}") Integer slidingWindowSize,
    @Value("${resilience4j.circuitbreaker.configs.default.permittedNumberOfCallsInHalfOpenState}") Integer permittedNumberOfCallsInHalfOpenState,
    @Value("${resilience4j.circuitbreaker.configs.default.minimumNumberOfCalls}") Integer minimumNumberOfCalls,
    @Value("${resilience4j.circuitbreaker.configs.default.failureRateThreshold}") Integer failureRateThreshold,
    @Value("${resilience4j.circuitbreaker.configs.default.waitDurationInOpenState}") Integer waitDurationInOpenState,          
    @Value("${resilience4j.circuitbreaker.configs.default.automaticTransitionFromOpenToHalfOpenEnabled}") Boolean automaticTransitionFromOpenToHalfOpenEnabled) {

    CircuitBreakerConfig cfg = CircuitBreakerConfig.custom()
         .slidingWindowSize(slidingWindowSize)
         .minimumNumberOfCalls(minimumNumberOfCalls)
         .permittedNumberOfCallsInHalfOpenState(permittedNumberOfCallsInHalfOpenState)
         .failureRateThreshold(failureRateThreshold)
         .waitDurationInOpenState(Duration.ofMillis(waitDurationInOpenState))
         .automaticTransitionFromOpenToHalfOpenEnabled(automaticTransitionFromOpenToHalfOpenEnabled)
         .recordException(recordFailurePredicate())
         .recordExceptions(HttpServerErrorException.class)
         .ignoreExceptions(HttpClientErrorException.class)
         .build();

     return circuitBreakerRegistry.circuitBreaker("zCircuitBreaker", cfg);
}

我希望我不必求助于案例 3。在案例 1 和 2 中我做错了什么吗?出于此测试的目的,我使用的是InMemoryCircuitBreakerRegistry。感谢您的帮助。

谢谢

【问题讨论】:

    标签: spring-boot circuit-breaker resilience4j


    【解决方案1】:

    请使用 Resilience4j 的 Spring Boot 启动器,不要通过 bean 手动创建 CircuitBreaker。一切都会自动为您即时完成。

    【讨论】:

    • 直接获取断路器,自动接线的断路器注册表似乎可以做到。
    • 我遇到了同样的问题,@spring5150 的方法对我有用。我正在使用弹性 4j-spring-boot2 库,并且必须在 CircuitBreakerRegistry 中自动装配。
    猜你喜欢
    • 2011-12-08
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 2021-07-11
    • 2014-12-15
    相关资源
    最近更新 更多