Resilience4j 的 CircuitBreaker 默认将所有异常视为失败,需通过 recordExceptions 指定触发熔断的异常(如 IOException、TimeoutException),用 ignoreExceptions 排除不计数的异常(如 IllegalArgumentException),二者共存时后者优先;配置后结合 fallback 可实现精准降级,且须通过 Metrics 或事件监听验证生效。

Resilience4j 的 CircuitBreaker 默认只对抛出的异常(即非受检异常)进行失败统计,但**不会自动区分异常类型**——它默认把所有异常都当作失败事件。若要让熔断器仅对特定异常(如 TimeoutException、IOException)触发失败计数,而忽略其他异常(如 IllegalArgumentException),需通过 自定义 recordExceptions 和 ignoreExceptions 配置 实现。
1. 指定哪些异常触发熔断(recordExceptions)
使用 recordExceptions 明确列出需要计入失败率的异常类。只有这些异常被抛出时,才会增加失败计数、影响熔断状态。
- 支持子类匹配:例如配置
IOException.class,则SocketTimeoutException、ConnectException等子类也会被记录 - 配置方式(Java DSL):
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 失败率超50%开启熔断
.waitDurationInOpenState(Duration.ofSeconds(60))
.slidingWindowSize(10)
.recordExceptions(IOException.class, TimeoutException.class)
.build();
2. 指定哪些异常不触发熔断(ignoreExceptions)
用 ignoreExceptions 声明某些异常应被完全忽略——即使它们发生,也不会影响失败计数、不会导致熔断,适合业务校验类异常(如参数错误、权限拒绝)。
-
ignoreExceptions和recordExceptions可同时使用;若某异常同时出现在两者中,ignoreExceptions优先级更高(即被忽略) - 常见忽略场景:用户输入非法、Token过期、401/403响应封装成的运行时异常
- 示例:
.recordExceptions(IOException.class, TimeoutException.class) .ignoreExceptions(IllegalArgumentException.class, SecurityException.class)
3. 配合 fallback 使用更精准的错误处理
配置好异常策略后,在调用处结合 decorateCheckedSupplier 或 decorateSupplier + fallback,可实现“特定异常走降级,其他异常直接抛出”:
立即学习“Java免费学习笔记(深入)”;
- 例如:网络异常走缓存 fallback,参数异常仍向上抛出供上层统一校验处理
- 代码示意:
Supplier<String> decorated = CircuitBreaker
.decorateSupplier(circuitBreaker, () -> callExternalApi())
.andThen(fallbackToCache()); // 仅当 circuitBreaker 开启或失败时触发
// 注意:fallback 不会拦截被 ignore 的异常 —— 它们根本不会进入熔断判断流程
4. 验证配置是否生效(关键调试点)
可通过 CircuitBreaker.Metrics 或事件监听确认异常是否被正确归类:
- 注册
onIgnoredError监听器,观察被忽略的异常是否如期出现 - 调用
circuitBreaker.getMetrics().getNumberOfFailedCalls(),验证只有目标异常会使其递增 - 注意:若异常未被
record且未被ignore,Resilience4j 默认按“失败”处理(兼容旧行为),所以务必显式配置二者之一


















