【问题标题】:Can Micronaut Circuit Breakers be skipped for some HTTP status codes?是否可以跳过某些 HTTP 状态代码的 Micronaut 断路器?
【发布时间】:2020-12-19 06:27:08
【问题描述】:

有没有办法配置 Micronaut 断路器,使其不会针对特定的 HTTP 状态代码打开?例如,如果我对某个项目进行查找但未找到该项目,则服务器可能会返回 HTTP 状态 404。这可能是一个完全有效的响应,我不希望断路器在这些情况下打开。

据我了解,Micronaut 断路器与 HTTP 无关,但仍有一个解决方案几乎可以帮助我:

@Client("${myEndpoint}")
@CircuitBreaker(attempts = "4", predicate = ServerErrorRetryPredicate.class)
public interface MyClient {
    @Get
    Single<MyItem> getItem(int itemId);
}

public class ServerErrorRetryPredicate implements RetryPredicate {
    @Override
    public boolean test(Throwable throwable) {
        if (throwable instanceof HttpClientResponseException) {
            HttpClientResponseException e = (HttpClientResponseException) throwable;
            return e.getStatus().getCode() >= 500;
        }
        return true;
    }
}

这里我使用的是 Micronaut 2 附带的新谓词,在这种情况下,如果 HTTP 状态小于 500,则谓词会失败(因此当找不到项目时,我得到的 HTTP 状态 404 会失败)。这对于避免重试非常有效,但对断路器没有影响。

是否可以根据谓词的结果避免打开断路器,例如基于它跳过重试?

【问题讨论】:

    标签: micronaut circuit-breaker micronaut-client


    【解决方案1】:

    查看DefaultRetryInterceptor,当产生异常时断路器被打开。 此外,micronaut http client 将始终为 404 响应引发错误(阻塞客户端除外),这将触发断路器。

    @CircuitBreakerpredicateexcludesincludes 字段似乎仅用于重试功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-26
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多