java - 弹簧断路器 - Resilience4j - 如何配置?
问题描述
我有一个关于带有 Resilience4J(不是单独的 Resilience4J)的 Spring Cloud Circuit Breaker 的快速问题。
这两个项目都非常棒。然而,目前,我们过于频繁地以回退结束。这意味着,当 3rd 方服务实际上很好时,我们最终还是会选择回退。
这可能是我自己的问题,因此,我想针对特定配置提出问题。
我想告诉当前配置执行以下操作:断路器。(我将使用好、坏和半好/半坏的状态。
当状态良好时:在可配置数量(例如 5 个)失败请求(第 3 方 API 出现问题)后,将其设置为一半好/一半坏。
当状态是一半好/一半坏时:一半好/坏,如果超过一半(可配置)的请求成功,则将 if 放回良好状态。
当状态是一半好/一半坏:如果超过一半的请求仍然失败,则进入坏状态。
当状态为坏时:连续两次好的请求后,将其恢复到一半好一半坏。
对于超时,请求应在 4 秒内答复。这是第 3 方给我们的 SLA。除此之外,可能有问题。
对于每个失败的请求,重试 3 次(可配置)。
请问如何在 Spring Webflux 中实现这一点?
谢谢
解决方案
这是不可能的:
当状态为坏时:连续两次好的请求后,将其恢复到一半好一半坏。
当断路器打开时,它不允许任何调用。
如果您使用resilience4j-spring-boot2
和 , 您可以轻松实现这一点resilience4j-reactor
。
publisher
.transform(TimeLimiterOperator.of(timeLimiter))
.transform(CircuitBreakerOperator.of(circuitBreaker))
.transform(RetryOperator.of(retry))
我们的 Spring Boot 启动器允许您在外部配置文件中配置 TimeLimiter、CircuitBreaker 和 Retry。你甚至可以在你的方法上使用注解。无需手动添加 Reactor 操作符。
@TimeLimiter(name = "id")
@CircuitBreaker(name = "id")
@Retry(name = "id")
public Flux<String> fluxSuccess() {
return Flux.just("Hello", "World");
}
我们的 Spring Boot 启动器添加了指标;)