java CircuitBreaker立即回退

c9qzyr3d  于 2023-08-01  发布在  Java
关注(0)|答案(3)|浏览(99)

我在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个调用将失败,并且不会回退。我的期望是否正确?

k10s72fa

k10s72fa1#

经过一些研究,我逐渐了解到间歇性故障的回退是一种预期行为,尽管我在任何地方都找不到它的记录。因此,即使电路为CLOSED,如果方法抛出匹配的异常,也将调用回退。
注意:如果您对立即回退不满意,请使用RETRY配置对其进行 Package 。

qc6wkl3g

qc6wkl3g2#

@CircuitBreaker-如果它的状态是open,那么你会立即收到回退,不再调用你想要的服务。
如果您期望的结果是,当您关闭被调用的后端服务,并且您想要5次调用直到您得到回退,您需要使用@Retry,如果调用失败,那么它将尝试再次调用您的服务。
如果你使用多重符号,你可以在这里阅读更多关于顺序的信息

xmakbtuz

xmakbtuz3#

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

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

字符串
然后定义fallback函数,如下例所示:(Throwable应该在那里,并且name方法应该与fallback中的名称相同,意思是“connectionFail”)

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


您还应该在application.properties文件中定义此配置:
resilience4j.circuitbreaker.instances.mycircuit.maxRetryAttempts=3 resilience4j.retry.instances.mycircuit.waitDuration=1s resilience4j.retry.instances.mycircuit.enableExponentialBackoff=true
我希望它有帮助。

相关问题