一、前言
在微服务开发场景中,经常会碰到调用失败的情况,比如:
- 消息发送失败;
- 远程调用 rpc 接口失败;
- 调用三方 http 接口失败;
- 网络原因,幂等性场景下数据库超时导致数据增删改失败;
- ...
诸如此类的场景有很多,对于发起调用的一方,为了保证方法(http 接口)调用的可靠性,通常会通过重试的机制来保障,下面介绍几种在微服务开发模式下比较常见的实现重试的解决方案。
二、微服务重试介绍
2.1 重试介绍
重试机制是指在请求失败时,自动重新发起请求的过程。它是提升系统容错能力的重要手段之一。
2.1.1 为什么引入重试
分布式系统中,网络抖动、临时性故障、依赖服务过载等情况时有发生。引入重试可以掩盖这些瞬时故障,提高系统的整体可用性。
2.2 引入重试后需要注意的问题
- 幂等性:重试必须确保业务操作具有幂等性,避免重复执行导致数据不一致。
- 无限循环:需设置最大重试次数和退避策略,防止雪崩效应。
- 异常类型:仅对特定异常(如网络超时)进行重试,业务逻辑错误不应重试。
2.3 重试的最佳实践
- 采用指数退避策略(Exponential Backoff),避免短时间内大量请求冲击下游。
- 记录重试日志,便于排查问题。
- 结合熔断器使用,当故障持续时停止重试。
三、微服务中常用的重试解决方案
3.1 Spring-Retry 实现方案
Spring Retry 是 Spring 生态中最基础的重试框架,适用于轻量级场景。
3.1.1 Spring-Retry 常用注解
@Retryable:标记需要重试的方法。@Recover:处理重试失败后的兜底逻辑。
3.1.2 Spring-Retry 最佳实践
配合 @EnableRetry 启用功能,注意配置 maxAttempts 和 backOffPolicy。
3.2 Guava Retryer 实现方案
Guava 提供的 Retryer 是一个通用的重试工具,不依赖 Spring 容器。
3.2.1 Guava Retryer 介绍
基于函数式编程思想,支持自定义重试策略和监听器。
3.2.2 Guava Retryer 适用场景
适合非 Spring 环境或需要高度定制化重试逻辑的场景。
3.3 自定义注解 + AOP 实现方案
通过 AOP 切面拦截特定注解,实现统一的重试逻辑封装。
3.4 Resilience4j 重试实现方案
Resilience4j 是 Circuit Breaker 库,也提供了强大的重试模块,是 Spring Cloud 推荐方案。
3.4.1 Resilience4j 是什么
一个轻量级的容错库,旨在帮助开发者构建弹性系统。
3.4.2 Resilience4j 核心模块
包括 Retry、CircuitBreaker、Bulkhead 等,支持动态配置。


