spring-webflux - 断路器未将状态从 HALF_OPEN 更改为 CLOSED
问题描述
我的 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>
即使浏览了所有文档,我也不确定自己做错了什么。
解决方案
我发现了这个问题。我正在使用检查断路器状态
circuitBreaker.tryAcquirePermission()
甚至在进行导致此问题的实际调用之前的方法。删除它后,它工作得很好。
推荐阅读
- android - JSON 中的多种数据类型
- kubernetes - Kubernetes 连接服务和部署
- php - 在 Laravel 中注册时无法向用户发送电子邮件
- android - 即使在 .xml 文件中添加 tools:showIn="navigation_view" 后,我也无法获得导航抽屉的预览
- javascript - 尝试调用函数并在 post 方法中返回数据
- node.js - 如何在 monorepo 中共享类实例?
- bash - 逐行读取并将每一行分配给 Bash 中的不同变量
- c# - 尝试使用 codegenerator 在 aspnet core 3 中生成控制器时出错
- php - 一旦页面插入数据并重定向到旧页面,如何获取查询字符串值
- javascript - Discord Bot 服务器耳聋