第7章:大型遗留系统(Large Legacy Systems)
一、导读
1.1 本章学习目标
第7章讲解系统级别的遗留代码策略——如何理解和改善大型遗留系统。
本章的核心学习目标包括:
- 理解大型遗留系统的特征
- 掌握系统理解的技术
- 学会渐进式重写策略
- 理解绞杀者模式的系统级应用
1.2 为什么本章如此重要
大型遗留系统不是"大号的遗留代码"——它有独特的挑战:团队知识流失、文档缺失、架构腐化、依赖关系复杂。需要系统级的策略来应对。
1.3 核心问题引导
如何理解一个没有文档的大型系统?
渐进式重写和大规模重写各有什么风险?
绞杀者模式如何应用到系统级别?
如何在维护遗留系统的同时推进现代化?
二、核心概念详解
2.1 系统理解技术
理解遗留系统的方法:
1. 架构考古:通过代码和提交历史恢复架构理解
2. 依赖分析:使用工具分析模块间依赖
3. 运行时分析:通过日志和监控理解系统行为
4. 团队访谈:与老员工交流获取隐性知识
5. 文档挖掘:寻找任何可用的文档2.2 渐进式重写
渐进式重写策略:
1. 绞杀者模式(Strangler Fig)
- 新功能用新系统实现
- 逐步将旧功能迁移到新系统
- 最终替换整个旧系统
2. 分支抽象(Branch by Abstraction)
- 在旧代码和新代码之间引入抽象层
- 逐步将流量从旧代码切换到新代码
- 可以按百分比灰度切换
3. 领域驱动迁移
- 按业务领域逐步迁移
- 每个领域独立迁移和验证
- 使用防腐层隔离新旧系统2.3 绞杀者模式实践
阶段1:识别边界
- 分析旧系统的模块和依赖
- 确定可以独立迁移的部分
- 设计新系统的架构
阶段2:建立基础设施
- 搭建新系统的开发环境
- 建立 CI/CD 管道
- 设置监控和日志
阶段3:逐步迁移
- 新功能在新系统实现
- 按领域逐步迁移旧功能
- 使用 API 网关路由流量
阶段4:完成迁移
- 所有功能迁移到新系统
- 旧系统下线
- 团队完全切换到新技术栈2.4 防腐层
java
// 防腐层:隔离新旧系统
public class LegacySystemAdapter {
private LegacySystem legacy;
// 将旧系统的接口转换为新系统的接口
public NewUser getUser(String id) {
LegacyUser legacyUser = legacy.findUser(id);
return new NewUser(
legacyUser.getId(),
legacyUser.getName(),
legacyUser.getEmail()
);
}
// 处理新旧系统的数据差异
public Order createOrder(NewOrderRequest request) {
// 转换数据格式
LegacyOrder legacyOrder = convert(request);
// 调用旧系统
LegacyOrder result = legacy.createOrder(legacyOrder);
// 转换结果
return convert(result);
}
}三、实战案例
3.1 案例一:大型电商系统迁移计划
迁移计划:
第1阶段(1-3月):基础设施
- 搭建新系统(微服务架构)
- 建立 API 网关
- 设置监控和日志
第2阶段(4-6月):独立领域
- 迁移用户管理(独立模块)
- 迁移商品目录(独立模块)
- 使用防腐层与旧系统集成
第3阶段(7-12月):核心领域
- 迁移订单系统(核心但可隔离)
- 迁移支付系统(需要双写验证)
- 灰度切换,逐步增加流量
第4阶段(13-18月):完成迁移
- 迁移剩余功能
- 旧系统下线
- 全量切换到新系统四、本章小结
系统理解:架构考古、依赖分析、运行时分析、团队访谈。
渐进式重写:绞杀者模式、分支抽象、领域驱动迁移。
防腐层:隔离新旧系统,处理数据差异。
迁移策略:分阶段、按领域、灰度切换。
五、思考与练习
为一个大型遗留系统制定迁移计划。
绞杀者模式和分支抽象各适用于什么场景?
如何在迁移过程中保证系统可用性?