micronaut - 是否可以跳过某些 HTTP 状态代码的 Micronaut 断路器?
问题描述
有没有办法配置 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 客户端总是会抛出 404 响应错误(阻塞客户端除外),这将触发断路器。
的predicate
和字段似乎仅用于重试功能excludes
。includes
@CircuitBreaker
推荐阅读
- docker - 真正可复制的 Docker 容器?
- devise - 用户名/密码和 sso 系统 - sso 用户的密码值应该是多少
- vbscript - 如何通过 VBscript 获取 CAD 零件的位置?
- if-statement - 如何将 WHERE 函数添加到复杂字符串
- angular - 使用 ngfor 时如何处理数据以更快地显示
- python - 列名减半,数据用 pyodbc 和 Teradata 数据库编码错误
- java - Log4J 2 配置:如何同时按大小和按天拆分日志文件?
- javascript - 在第二次点击时触发 jquery 事件更新输入
- json - DStream JSON 对象到 SQLite
- python - Python Subprocess.Popen 带有声音警报的通知