断路器立即回退

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

【讨论】:

以上是关于断路器立即回退的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中使用断路器

SpringCloud 断路器之Hystrix

Resilience4j 断路器不工作

精通springcloud:故障和带有Feign的断路器模式

手写一个简易版断路器(hystrix)

深入Spring Boot:快速集成Dubbo + Hystrix