断路器立即回退



我按照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();
}

我还尝试将配置移动到应用程序。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次调用后回退到/合作伙伴API。或者换句话说,电路应该在5次呼叫后打开。

我是这样测试的

启动了应用程序。后备和后备都是可用的。打了几个电话后,我杀了backendA。下一个对backendA的调用将返回到/partner,而我预计接下来的5个对backendA的调用将在没有回退的情况下失败。我的预期正确吗?

经过一些研究后,我了解到间歇故障的回退是一种预期行为,尽管我找不到任何相关文档。因此,即使电路是CLOSED的,如果方法抛出匹配异常,也会调用回退。

注意:如果您对立即回退不满意,请使用RETRY配置包装它。

@CircuitBreaker-你应该期望的结果是,如果它的状态是打开你将立即收到一个回退,它不再调用你想要的服务。

如果你期望的结果是,当你关闭你调用的后端服务,你想要5个调用,直到你得到回退,你需要使用@Retry,如果调用失败,那么它会尝试再次调用你的服务。

如果你使用多个符号,你可以在这里阅读更多关于顺序的信息

我有同样的错误,服务工作正常,但它显示了错误,对于这个问题,我使用了@Retry如下:(把它放在你的@GetMapping的顶部)

@Retry(name = "mycircuit", fallbackMethod = "connectionFail")

,然后像下面的例子一样定义回退函数:(Throwable应该在那里,并且name方法应该在fallback中同名,mean "connectionFail")

public Posts connectionFail(Throwable throwable){
return new Posts(); // or any other fallback implementation that returns a valid Posts object
}

还应该在应用程序中定义此配置。属性文件:

resilience4j.circuitbreaker.instances.mycircuit.maxRetryAttempts = 3resilience4j.retry.instances.mycircuit.waitDuration = 1resilience4j.retry.instances.mycircuit.enableExponentialBackoff = true

希望对大家有帮助。

最新更新