Resilience4j断路器无法触发打开问题求助
核心原因拆解
切面顺序导致调用统计逻辑不符合预期
你配置了retryAspectOrder: 2,而CircuitBreaker的默认切面优先级(order=1)更高,这意味着CircuitBreaker会包裹Retry的切面。每次外部调用data()方法时,Retry的2次尝试(原始调用+1次重试)会被CircuitBreaker视为单次调用,只有当这2次尝试全部失败,CircuitBreaker才会记录1次失败。结合你设置的minimum-number-of-calls: 6,需要累计6次这样的“外部调用失败”才会触发断路器打开——如果你的循环调用次数不足6次,断路器不会进入阈值判断逻辑。TimeLimiter注解在同步方法上的误用
@TimeLimiter注解原本是为异步方法(返回CompletableFuture类型)设计的,直接用在同步void方法上会导致切面逻辑异常,可能干扰CircuitBreaker的失败统计流程。版本兼容性冲突
Spring Cloud 3.0.0(2021.0.x版本)官方依赖的Resilience4j版本为1.7.x,而你使用了Resilience4j 2.0.2。Resilience4j 2.x对核心API和Spring集成逻辑做了较大改动,版本不兼容可能导致断路器切面未正确拦截方法调用。
解决建议
调整切面顺序,让Retry包裹CircuitBreaker
修改Retry的切面优先级为小于CircuitBreaker的默认值(比如设为0),这样每次重试都会经过CircuitBreaker,失败次数会被单独统计,更快达到触发阈值:resilience4j: retry: retryAspectOrder: 0 # 其他配置保持不变移除或修正同步方法上的TimeLimiter
- 如果不需要超时控制,直接删除
@TimeLimiter注解; - 如果需要同步方法的超时功能,改用
@Bulkhead配合线程池,或者将方法改为异步实现(返回CompletableFuture)。
- 如果不需要超时控制,直接删除
对齐版本兼容性
将Resilience4j版本降级到Spring Cloud 3.0.0兼容的1.7.x版本(例如1.7.1),避免集成异常。验证调用次数达标
确保循环调用data()方法的次数至少达到minimum-number-of-calls: 6次,且每次外部调用的Retry尝试全部失败。
内容的提问来源于stack exchange,提问作者markatathena

