我在https://resilience4j.readme.io/docs/getting-started-3上查看了Resilience 4J文档。
我有一个问题,我的断路器是立即连接到回退(在第一次调用)时,主后端不可用。
@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均可用。打了几个电话后,我杀了backendA。对backendA的下一个调用将回退到/partner,而我预计对backendA的下5个调用将失败,并且不会回退。我的期望是否正确?
3条答案
按热度按时间k10s72fa1#
经过一些研究,我逐渐了解到间歇性故障的回退是一种预期行为,尽管我在任何地方都找不到它的记录。因此,即使电路为CLOSED,如果方法抛出匹配的异常,也将调用回退。
注意:如果您对立即回退不满意,请使用RETRY配置对其进行 Package 。
qc6wkl3g2#
@CircuitBreaker
-如果它的状态是open,那么你会立即收到回退,不再调用你想要的服务。如果您期望的结果是,当您关闭被调用的后端服务,并且您想要5次调用直到您得到回退,您需要使用
@Retry
,如果调用失败,那么它将尝试再次调用您的服务。如果你使用多重符号,你可以在这里阅读更多关于顺序的信息
xmakbtuz3#
我遇到了同样的错误,服务正常工作,但它显示错误,对于这个问题,我使用了@Retry,如下所示:(把它放在@GetMapping的顶部)
字符串
然后定义fallback函数,如下例所示:(Throwable应该在那里,并且name方法应该与fallback中的名称相同,意思是“connectionFail”)
型
您还应该在application.properties文件中定义此配置:
resilience4j.circuitbreaker.instances.mycircuit.maxRetryAttempts=3 resilience4j.retry.instances.mycircuit.waitDuration=1s resilience4j.retry.instances.mycircuit.enableExponentialBackoff=true
我希望它有帮助。