我的 spring-boot 反应式应用程序中有这个断路器配置 -
CircuitBreakerConfig.custom().failureRateThreshold(5)
.slowCallDurationThreshold(Duration.ofMillis(5000))
.slidingWindowType(SlidingWindowType.COUNT_BASED)
.slidingWindowSize(5)
.permittedNumberOfCallsInHalfOpenState(5)
.waitDurationInOpenState(Duration.ofMillis(30000))
.slowCallRateThreshold(5)
然后我像这样调用上游 API -
return Mono.from(invokeUpstream(body, headers))
.compose(CircuitBreakerOperator.of(circuitBreaker)).onErrorResume(this::fallback);
invokeUpstream方法如下所示-
Mono<ResponseEntity<String>> response = webClient.post()
.body(BodyInserters.fromValue(body))
.retrieve()
.onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new BadGatewayException()))
.toEntity(String.class);
而后备方法只是抛出异常 -
private Mono<ResponseEntity<String>> fallback(Throwable ex) {
throw new BadGatewayException();
}
现在,当上游 API 5 次返回500响应时,我可以看到 circuitBreaker 状态正在从 CLOSED 状态移动到 OPEN 状态,这是预期的。在 OPEN 状态下,它根据配置保持 30 秒。之后,它进入 HALF_OPEN 状态,问题从这里开始。即使上游 API 返回成功响应,它也永远不会进入 CLOSED 状态,它永远保持在 HALF_OPEN 状态。
我在我的应用程序中使用这些依赖项 -
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-reactor</artifactId>
<version>1.3.1</version>
</dependency>
即使浏览了所有文档,我也不确定自己做错了什么。