3

有没有办法配置 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 会失败)。这对于避免重试非常有效,但对断路器没有影响。

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

4

1 回答 1

1

看看DefaultRetryInterceptor,当产生异常时断路器是打开的。此外,micronaut http 客户端总是会抛出 404 响应错误(阻塞客户端除外),这将触发断路器。

predicate和字段似乎仅用于重试功能excludesincludes@CircuitBreaker

于 2020-08-31T20:06:03.107 回答