问题描述
我有一个使用 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 手动创建断路器。一切都会自动为您即时完成。