断路器立即回退
Posted
技术标签:
【中文标题】断路器立即回退【英文标题】:CircuitBreaker immediate fallback 【发布时间】:2021-10-31 19:12:35 【问题描述】:我关注 https://resilience4j.readme.io/docs/getting-started-3 获取 Resilience4J 文档。
我有一个问题,当主后端不可用时,我的断路器立即连接到回退(在第一次调用时)。
@Bean
public CircuitBreakerConfig circuitBreakerConfig()
return CircuitBreakerConfig.custom()
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(5)
.minimumNumberOfCalls(5)
.failureRateThreshold(4)
.build();
我也尝试将配置移动到 application.yml,但仍然是相同的行为。
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
@CircuitBreaker(name = "backendA", fallbackMethod = "fallbackA")
public String backendA()
return restTemplate.getForObject("http://localhost:9999/backendA", String.class);
public String fallbackA(Exception e)
return restTemplate.getForObject("http://localhost:8080/partner", String.class);
有人可以帮忙吗?
//更新
更多详情如下。 如上面的代码所示,我的应用正在调用 /backendA,位于断路器后面。预计根据配置,如果 backendA 不可用,则应该失败 5 次,然后第 6 次调用将回退到 /partner API。或者换句话说,电路应该在 5 次调用后打开。
这就是我测试的方式。
我启动了应用程序。 backendA 和 fallbackA 都可用。几个电话后,我杀死了后端A。对 backendA 的下一次调用将回退到 /partner,而我预计对 backendA 的下一个 5 次调用将失败而没有后备。我的预期正确吗?
【问题讨论】:
您能否说明您的测试方式、您期望发生什么以及实际发生了什么? @TimMoore 用您要求的详细信息更新了问题 【参考方案1】:经过一些研究,我开始知道间歇性故障的回退是一种预期的行为,尽管我无法在任何地方找到它的记录。因此,即使电路已关闭,如果方法抛出匹配的异常,也会调用回退。
注意: 如果您对立即回退不满意,请使用 RETRY 配置对其进行包装。
【讨论】:
【参考方案2】:@CircuitBreaker
- 如果它的状态是 open,您应该会立即收到回退并且它不再调用您想要的服务的结果。
如果您希望在您关闭被调用的后端服务并且想要 5 次调用直到您得到回退之前,您需要使用 @Retry
,如果调用失败,那么它将尝试再次调用您的服务。
如果你使用多个符号,你可以阅读更多关于订单here
【讨论】:
以上是关于断路器立即回退的主要内容,如果未能解决你的问题,请参考以下文章