myrpc 学习笔记-009 容错机制
项目地址 欢迎访问
笔记总览 myrpc 学习笔记-001 实现简易版 rpc myrpc 学习笔记-002 配置加载 myrpc 学习笔记-003 Mock 服务代理 myrpc 学习笔记-004 序列化实现和 SPI 机制 myrpc 学习笔记-005 注册中心 myrpc 学习笔记-006 自定义协议 myrpc 学习笔记-007 负载均衡 myrpc 学习笔记-008 重试机制 myrpc 学习笔记-009 容错机制 myrpc 学习笔记-0010 启动机制和注解驱动
架构图v9.0.0
- 实现容错策略
- 支持故障恢复 快速失败 故障转移 静默处理
- 支持自定义容错策略

本模块是 RPC 调用的最后一层安全保障,当重试机制也失败后,由容错策略处理异常,避免整个系统雪崩或直接报错。
模块基于 SPI + 工厂模式 实现,支持 快速失败、故障转移、静默处理、故障恢复 四种策略。
一、模块结构
▼text复制代码fault.tolerant/ ├── TolerantStrategy.java 容错顶层接口 ├── FailFastTolerantStrategy 快速失败 ├── FailSafeTolerantStrategy 静默处理 ├── FailOverTolerantStrategy 故障转移 ├── FailBackTolerantStrategy 故障恢复(降级) ├── TolerantStrategyFactory 工厂 + SPI └── TolerantStrategyKeys 策略常量
二、代码笔记
1. 容错策略接口
统一规范,所有容错策略必须实现 doTolerant。
▼java复制代码public interface TolerantStrategy { RpcResponse doTolerant(Map<String, Object> context, Exception e); }
2. 快速失败(默认)FailFast
直接抛出异常,让调用方立即感知,是生产最常用策略。
▼java复制代码public class FailFastTolerantStrategy implements TolerantStrategy { @Override public RpcResponse doTolerant(Map<String, Object> context, Exception e) { throw new RuntimeException("服务报错", e); } }
3. 静默处理 FailSafe
不抛异常,返回空结果,系统继续运行。
▼java复制代码public class FailSafeTolerantStrategy implements TolerantStrategy { @Override public RpcResponse doTolerant(Map<String, Object> context, Exception e) { return new RpcResponse(); } }
4. 故障转移 FailOver
自动切换其他可用节点,提高可用性。
▼java复制代码public class FailOverTolerantStrategy implements TolerantStrategy { @Override public RpcResponse doTolerant(Map<String, Object> context, Exception e) { // 扩展:从服务列表获取下一个节点重试 return null; } }
5. 故障恢复(降级)FailBack
降级调用其他服务或本地方法。
▼java复制代码public class FailBackTolerantStrategy implements TolerantStrategy { @Override public RpcResponse doTolerant(Map<String, Object> context, Exception e) { // 扩展:调用降级服务 return null; } }
6. 工厂 + SPI 加载
▼java复制代码public class TolerantStrategyFactory { static { SpiLoader.load(TolerantStrategy.class); } public static TolerantStrategy getTolerantStrategy(String key) { return SpiLoader.getInstance(TolerantStrategy.class, key); } }
7. 策略常量
▼java复制代码public interface TolerantStrategyKeys { String FAIL_BACK = "failBack"; // 降级 String FAIL_FAST = "failFast"; // 快速失败 String FAIL_OVER = "failOver"; // 故障转移 String FAIL_SAFE = "failSafe"; // 静默处理 }
三、调用方式(代理层)
▼java复制代码try { // 重试调用 } catch (Exception e) { // 重试失败,进入容错 TolerantStrategy strategy = TolerantStrategyFactory.getTolerantStrategy("failFast"); RpcResponse response = strategy.doTolerant(context, e); }
四、四种容错策略对比
| 策略 | 行为 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| failFast 快速失败 | 立即抛异常 | 简单、快速定位问题 | 可能中断流程 | 核心服务、支付、订单 |
| failSafe 静默处理 | 吞异常,返回空 | 不影响主流程 | 问题难发现 | 日志、监控、非关键统计 |
| failOver 故障转移 | 试下一个节点 | 高可用 | 实现复杂 | 高可用服务集群 |
| failBack 故障恢复 | 降级到其他服务 | 功能不中断 | 需要准备降级逻辑 | 商品详情、首页推荐 |
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
🚩JavaD141、今天看了try-catch-finally和函数式编程,lamda有点类似Swift中的闭包,还没彻底理解,似懂非懂2、五座山头刷题,靠理解的话,得分50,靠答题规则记忆,得分95,总体还是似懂非懂3、看书《Head First设计模式》(第二版)的工厂设计模式和代理设计模式(李文华的视频提到了两种设计模式,就顺便有岔路去看了,以免天天被五座山头逼疯了)
2
day41今天自己修改了一下简历,用作投AI应用开发岗位,还不是很完善,先用老鱼简历做一个简单的。后年用AI优化了一下。今天主要是对AI超级智能体的总结还有简历优化,后续继续学新项目,我觉得写项目是学知识的最佳途径,相比于死板板的理论,实践起来,记忆更佳。但是基础的还是要看,不然跟着写项目都写不明白。算法一题,Java基础。用友有一个笔试邀约,9月第一个笔试。其他的投完简历的都还没回信,科大讯飞的
2
Day 14✅ 今天做了:前端Vue终于学完了⏰ 明天计划:就差Linux部署和Docker了, 争取今天看完
1
Day 12🧭行动:这次学习了匿名函数与变量定义🤓体会:这两种方法都能提高代码的可读性与可维护性,在特定情况都有很大作用🧑💻代码:#变量定义-指定类型注解abc: int = 915score1: float= 95.5hobby2: str = "python"result: bool = Truecba: None = Noneenglish: list[str] = ["A","B
3
day1 二分查找 26.9.15
1
