Resilience4j Retry模块通过配置重试策略应对临时性失败,支持YAML注解和Builder编程式两种配置方式,核心参数包括maxAttempts、waitDuration、指数退避及异常白/黑名单规则,并可通过decorateSupplier封装调用与事件监听实现可观测性。

Resilience4j 的 Retry 模块通过配置重试策略来应对临时性失败,核心是定义“哪些异常触发重试”、“重试几次”、“间隔多久”以及“是否启用退避机制”。配置方式主要有代码硬编码和 YAML 配置两种,推荐用 YAML + 注解或 Builder 方式结合使用。
定义重试规则:RetryConfig
RetryConfig 是重试行为的载体,关键参数包括:
- maxAttempts:最大尝试次数(含首次),默认 3 次;设为 1 表示不重试
- waitDuration:首次重试前等待时长(毫秒),默认 500ms
- enableExponentialBackoff:是否启用指数退避(每次等待时间翻倍)
- exponentialBackoffMultiplier:退避倍数,默认 2.0
- retryExceptions:明确指定哪些异常类型触发重试(白名单)
- ignoreExceptions:哪些异常直接抛出、不重试(黑名单)
注意:retryExceptions 和 ignoreExceptions 互斥,优先使用 retryExceptions;若两者都设,ignoreExceptions 会覆盖 retryExceptions 中的部分类型。
YAML 配置方式(推荐)
在 application.yml 中定义命名配置:
立即学习“Java免费学习笔记(深入)”;
resilience4j.retry:
instances:
backendService:
max-attempts: 3
wait-duration: 1s
enable-exponential-backoff: true
exponential-backoff-multiplier: 2
retry-exceptions:
- java.net.SocketTimeoutException
- org.springframework.web.client.ResourceAccessException
ignore-exceptions:
- java.lang.IllegalArgumentException
然后通过 @Retry(name = "backendService") 注解在方法上启用,需配合 @EnableRetry 和 AOP 支持(如引入 spring-boot-starter-aop)。
编程式配置(适合动态场景)
用 Builder 构建 RetryConfig,并注册到 RetryRegistry:
RetryConfig config = RetryConfig.custom()
.maxAttempts(5)
.waitDuration(Duration.ofMillis(200))
.retryExceptions(IOException.class, TimeoutException.class)
.ignoreExceptions(BusinessException.class)
.build();
<p>Retry retry = Retry.of("dynamic-api", config);
// 结合装饰器使用
Supplier<String> decorated = Retry.decorateSupplier(retry, () -> callExternalApi());
这种方式适合运行时根据条件切换策略,比如按服务等级或环境调整重试次数。
配合函数式调用与监控
实际调用建议用 Retry.decorateSupplier 或 decorateCheckedSupplier 包装业务逻辑,避免手动 try-catch。同时可监听事件:
-
onRetry:每次重试前回调 -
onSuccess:最终成功时触发 -
onError:重试耗尽后回调
例如打印日志或上报指标:
retry.getEventPublisher()
.onRetry(event -> log.warn("Retry {} for {}", event.getNumberOfRetryAttempts(), event.getThrowable().getMessage()));


















