【发布时间】: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