微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

断路器未从 yaml 文件加载默认值

如何解决断路器未从 yaml 文件加载默认值

我有一个使用 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。感谢您的帮助。

谢谢

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。