一、前言
在微服务开发场景中,经常会碰到调用失败的情况,比如:
微服务开发中网络波动或依赖服务不稳定常导致调用失败。本文介绍了重试机制的必要性及注意事项,详细对比了 Spring Retry、Resilience4j、Guava Retryer 及自定义 AOP 四种主流方案。通过依赖配置、注解使用及代码示例,展示了各方案在 Spring Boot 中的具体集成步骤与效果验证,帮助开发者根据场景选择合适策略保障系统可靠性。

在微服务开发场景中,经常会碰到调用失败的情况,比如:
诸如此类的场景有很多,对于发起调用的一方,为了保证方法(http 接口)调用的可靠性,通常会通过重试的机制来保障,下面介绍几种在微服务开发模式下比较常见的实现重试的解决方案。
重试机制是指在请求失败时,自动重新发起请求的过程。它是提升系统容错能力的重要手段之一。
分布式系统中,网络抖动、临时性故障、依赖服务过载等情况时有发生。引入重试可以掩盖这些瞬时故障,提高系统的整体可用性。
Spring Retry 是 Spring 生态中最基础的重试框架,适用于轻量级场景。
@Retryable:标记需要重试的方法。@Recover:处理重试失败后的兜底逻辑。配合 @EnableRetry 启用功能,注意配置 maxAttempts 和 backOffPolicy。
Guava 提供的 Retryer 是一个通用的重试工具,不依赖 Spring 容器。
基于函数式编程思想,支持自定义重试策略和监听器。
适合非 Spring 环境或需要高度定制化重试逻辑的场景。
通过 AOP 切面拦截特定注解,实现统一的重试逻辑封装。
Resilience4j 是 Circuit Breaker 库,也提供了强大的重试模块,是 Spring Cloud 推荐方案。
一个轻量级的容错库,旨在帮助开发者构建弹性系统。
包括 Retry、CircuitBreaker、Bulkhead 等,支持动态配置。
适用于生产环境,特别是需要监控和灵活配置的微服务架构。
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
在主配置类添加 @EnableRetry。
@Service
public class OrderService {
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000))
public void createOrder() {
// 业务逻辑
}
}
提供 Controller 调用上述 Service 方法。
模拟异常抛出,观察控制台日志中的重试次数。
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
</dependency>
resilience4j:
retry:
instances:
api:
maxAttempts: 3
waitDuration: 1s
@Retry(name = "api")
public String callApi() { ... }
查看 Actuator 端点获取重试指标。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
.retryIfExceptionOfType(IOException.class)
.withWaitStrategy(WaitStrategies.exponentialBackoff(2, Duration.ofMillis(100)))
.build();
try {
return retryer.call(() -> doSomething());
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
定义 @MyRetry 注解。
编写 Aspect 拦截注解,实现 try-catch 重试逻辑。
在 Service 方法上标注 @MyRetry。
| 方案 | 优点 | 缺点 |
|---|---|---|
| Spring Retry | 简单,集成方便 | 功能相对基础 |
| Resilience4j | 功能丰富,可监控 | 配置稍复杂 |
| Guava | 通用性强 | 无 Spring 集成特性 |
| 自定义 AOP | 灵活度高 | 维护成本高 |
本文总结了微服务开发中常见的四种重试实现方案。在实际项目中,建议优先使用 Spring Retry 或 Resilience4j,根据项目复杂度选择合适工具。同时务必保证业务接口的幂等性,并合理配置重试参数,避免引发系统震荡。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online