问题描述
有没有一种方法可以配置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,谓词将失败)。这样可以很好地避免重试,但是对断路器没有影响。
是否可以避免基于谓词结果打开断路器,就像基于该谓词跳过重试一样?
解决方法
看DefaultRetryInterceptor
,当产生异常时断路器断开。
同样,micronaut http client总是会引发404响应错误(阻止客户端除外),这将触发断路器。
predicate
的{{1}},excludes
和includes
字段似乎仅用于重试功能。