myrpc 学习笔记-008 重试机制
项目地址 欢迎访问
笔记总览 myrpc 学习笔记-001 实现简易版 rpc myrpc 学习笔记-002 配置加载 myrpc 学习笔记-003 Mock 服务代理 myrpc 学习笔记-004 序列化实现和 SPI 机制 myrpc 学习笔记-005 注册中心 myrpc 学习笔记-006 自定义协议 myrpc 学习笔记-007 负载均衡 myrpc 学习笔记-008 重试机制 myrpc 学习笔记-009 容错机制 myrpc 学习笔记-0010 启动机制和注解驱动
架构图v8.0.0
- 实现重试策略
- 支持不重试 固定时间间隔 重试策略
- 支持自定义重试策略

这是 RPC 框架的重试机制的具体实现,负责在调用失败时自动重试,提升调用成功率,基于 Guava Retrying 实现,支持 不重试 / 固定间隔重试 两种策略,可扩展、可配置、SPI 加载。
一、模块结构
▼text复制代码fault.retry/ ├── RetryStrategy.java 重试策略接口 ├── NoRetryStrategy.java 不重试策略 ├── FixedIntervalRetryStrategy.java 固定时间间隔重试 ├── RetryStrategyFactory.java 重试策略工厂(SPI) └── RetryStrategyKeys.java 策略常量
二、代码笔记
1. 重试策略接口
统一规范,所有重试策略都必须实现 doRetry 方法。
▼java复制代码public interface RetryStrategy { RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception; }
2. 不重试策略
直接执行一次,失败立即抛出异常。
▼java复制代码public class NoRetryStrategy implements RetryStrategy { @Override public RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception { return callable.call(); } }
3. 固定间隔重试策略
基于 Guava Retrying 实现,功能强大。
重试规则:
- 出现 Exception 就重试
- 每次间隔 3秒
- 最多 3次尝试(1次正常+2次重试)
- 每次重试打印日志
▼java复制代码public class FixedIntervalRetryStrategy implements RetryStrategy { @Override public RpcResponse doRetry(Callable<RpcResponse> callable) throws Exception { Retryer<RpcResponse> retryer = RetryerBuilder.<RpcResponse>newBuilder() .retryIfExceptionOfType(Exception.class) // 异常重试 .withWaitStrategy(WaitStrategies.fixedWait(3, TimeUnit.SECONDS)) // 等待3秒 .withStopStrategy(StopStrategies.stopAfterAttempt(3)) // 最多试3次 .withRetryListener(attempt -> { log.info("重试次数 {}", attempt.getAttemptNumber()); }) .build(); return retryer.call(callable); } }
4. 重试策略工厂 + SPI
支持 SPI 动态加载,可无缝扩展更多重试策略。
▼java复制代码public class RetryStrategyFactory { static { SpiLoader.load(RetryStrategy.class); } private static final RetryStrategy DEFAULT = new NoRetryStrategy(); public static RetryStrategy getRetryStrategy(String key) { return SpiLoader.getInstance(RetryStrategy.class, key); } }
5. 策略常量
▼java复制代码public interface RetryStrategyKeys { String NO = "no"; // 不重试 String FIXED_INTERVAL = "fixedInterval"; // 固定间隔 }
三、使用方式(代理层调用)
▼java复制代码RetryStrategy retryStrategy = RetryStrategyFactory.getRetryStrategy("fixedInterval"); RpcResponse response = retryStrategy.doRetry(() -> VertxTcpClient.doRequest(rpcRequest, serviceMetaInfo) );
四、重试策略对比
| 策略 | 行为 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| no(不重试) | 一次失败立即抛错 | 最快、无延迟 | 不稳定 | 实时性高、非幂等接口 |
| fixedInterval(固定间隔) | 失败等3秒再试,最多3次 | 提高成功率、稳定 | 增加调用耗时 | 网络波动、幂等接口 |
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 12🧭行动:这次学习了匿名函数与变量定义🤓体会:这两种方法都能提高代码的可读性与可维护性,在特定情况都有很大作用🧑💻代码:#变量定义-指定类型注解abc: int = 915score1: float= 95.5hobby2: str = "python"result: bool = Truecba: None = Noneenglish: list[str] = ["A","B
3
day1 二分查找 26.9.15
2
day42今天开始做伙伴匹配系统,目前只完成了前端初始化和主页的导航栏和底部栏的编写。抢阿里云云服务器没抢到,明天定个闹钟抢。今天收到最右的笔试了,后天晚上7点。还有约了一个自研电话初试,明天下午2点。用友的全栈工程师笔试和ai面还没有做。感觉9月份笔试面试确实多一些,希望在笔试面试中成长,一次错记住不足的地方并提升。算法一题,java基础。
2
🚩JavaD151、写了三段代码,没有代码提示,只有阿里巴巴代码规范插件2、"写完"和"写好"代码差距太大3、Kimi制定了一份52周的学习计划,每天都有具体的代码计划,希望能坚持
1
今天学习了:①Python基础之——四大序列(list、tuple、dict、set)和两大流程控制(条件判断/模式匹配+for/while循环)②Python函数之——函数的定义、调用以及五大类参数设置和传递
2
