0

我的 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>

即使浏览了所有文档,我也不确定自己做错了什么。

4

1 回答 1

1

我发现了这个问题。我正在使用检查断路器状态

circuitBreaker.tryAcquirePermission()

甚至在进行导致此问题的实际调用之前的方法。删除它后,它工作得很好。

于 2020-05-17T13:21:26.843 回答