背景
架构设计中,很少有机会进行全新架构设计,大部分都是在遗留系统上做架构重构设计和演进。
小型系统可能咬咬牙就把架构重写了,但是对于大型系统架构重构,都是要兼顾系统发布节奏的,即既要重构系统到目标架构(一般为了解决系统当前面临主要问题,比如架构强耦合、性能瓶颈、更换技术栈等),即往往面临着不重构就要死的地步(重大需求和严重bug很难合入),又要保证系统的及时交付,相当于高速公路上行驶中换轮胎,不亚于带着镣铐跳舞。
选择靠谱的可演进可利旧、可随时交付的重构模式就变得重中之重了。
模式选择
为了应对这种状况,有的项目采用另起炉灶的方式,即两拨人马并行,一拨维护老版本,修bug或合入新功能,应对交付;另一拨人马全新开发新架构对齐到老架构某个历史版本v。
新架构基本完工后,新架构追赶对齐老架构v版本后的新增功能和bug。
这种模式看起来很自然,其实弊端很多,我们并不推荐,原因如下:
1、隐形知识遗失
老系统里面积累了很多隐形知识,如果没有原班人马参与,这些隐形知识就很容易遗失。
2、新架构bug难以快速收敛
两拨人马,老架构踩过的坑基本还会再踩一遍,新架构的bug很难快速收敛。
3、新版本发布周期长
老功能功能繁多且应对交付,其中新需求和bug不停快速合入,新版本短期内很难对齐,需要长期不停追赶老版本,追到一个新的点后,老版本又向前演进了,需要一定马拉松式追赶才能对齐。

这个问题有点像阿基里斯悖论。不停追赶,需要反复对齐,直到收敛,尽管说总能追上,但大型系统波及影响分析很困难,不断波及影响分析工作量巨大,对齐过程非常吃力。
为了解决上述问题,我们推荐绞杀者+脚手架模式的重构方式,核心内容:
1、新老架构并存
2、通过脚手架进行新老功能路由和互通
3、新增功能全部逐次进入新框架
4、老功能择机向新功能迁移
从而实现渐进式的可以随时发布的架构重构。
绞杀者的基本原理如下:
步骤一
整合遗留系统对外接口
步骤二
增加脚手架:
脚手架1,转发层,负责统一鉴权和功能路由,实现新老功能并存。
脚手架2,适配层,负责新老功能互通和数据模型转换,为新老功能并存提供状态互通通道和数据结构转换。
步骤三
新增功能都在新框架中开发;遗留系统功能择机逐步迁移到新架构,新架构中的代码和逻辑分层明确,条理清楚,易于理解、易于维护。
步骤四
新老功能全部增加和移植到新架构中,整改系统重构就基本ok了,这时就可以把脚手架逐一拆除(脚手架本身有一定性能损耗和开发维护的复杂度)。
小结,绞杀者+脚手架模式可以兼顾交付,同时一套人马,一套代码,充分利旧和无缝的知识传递,随时交付随时重构,基本能够应对背景里面提出来的问题。
脚手架
很多大型建筑,无论多么美轮美奂,

建设的过程中都是通过脚手架过渡的。

建成之后之所以看不到脚手架,是因为它被拆除了。
架构重构也一样,没有脚手架,新老系统就无法共存和互通,所以脚手架是绞杀者模式成败的关键点之一。
脚手架有侵入型白盒脚手架和非侵入型黑盒脚手架两种或者基于这两种的组合。
其中第二种更普遍和重要。
以下分别从脚手架的结构、场景和优劣势方面来介绍。
绞杀者中的脚手架
绞杀者中脚手架
侵入型白盒脚手架

一、结构:
1、在老系统协议栈中增加转发层模块,其中包含新老功能转发的路由表
2、在老系统会话鉴权中增加新功能的权限配置模块。
上述1+2合起来构成转发层脚手架。
3、老系统中开发一个内部消息通道,对外暴露数据接口给新架构实现状态互通和数据结构的对齐。
二、场景
1、新老功能路由
用户在老架构上登录,协议栈进行编解码后,根据功能路由表把功能分发给新功能或透传给老架构。
三、优劣势
1、优势:这种方式相对简单
2、局限:
a、这种方式适合老系统完全自主可控,且业务功能相对简单的场景。
b、不方便实现复杂的新老功能组合
非侵入型黑盒脚手架

不对老系统做任何侵入修改,通过反向代理层和状态互通适配层。
一、结构:
1、增加一个反向代理层,包含协议栈+会话鉴权模块,功能:
a、协议栈的编解码模块
b、单点会话鉴权管理
c、新老功能路由表
d、功能协作汇聚模块,对新老功能的返回值进行编排组合,以实现对老功能的增加或消弱。
2、增加缓存适配代理
不侵入修改老系统,从老系统入口处访问数据并对结果进行缓存。功能:
a、提升性能
b、在适配代理中对新老系统中对应状态进行适配或格式转换。
该代理具备完整的协议栈和会话权限管理模块,用户请求来了后,可以按场景进行功能路由。
二、场景
场景一,登录
1、用户请求在反向代理模块协议栈解码后,先在反向代理中完成登录会话和权限校验,完成一次登录;
2、接着反向代理构造老系统登录协议,在老系统登录,成功后,反向代理内保存老系统的登录token,完成二次登录。
这样老功能可以路由到老系统中。
场景二、保活
反向代理使用保存的老系统的token在老系统进行定时会话保活,防止老系统会话超时。
场景三、登出
用户在脚手架上登出时,反向代理先在老系统上登出,然后在脚手架上登出。
场景四、新老功能协作
反向代理使用老系统token构造老系统接口协议,请求老系统处理业务;新功能直接路由到新系统处理,两者返回的结果在反向代理中进行组合并返回最终结果。
这样通过反向代理实现了对老功能的增强、或消弱从而实现新老系统无缝衔接。
三、优劣势
1、优势:
a、对老系统无侵入修改,新老功能界面清楚且容易进行bug定位定界。
b、老版本可以轻量级升级和无缝替换。
2、局限:
反向代理中协议栈和二次登录有一定开发维护工作量。
Tips
上了绞杀者+脚手架模式后,建议对老系统新增功能进行封存或受控修改,新功能尽可能都在新架构开发并逐渐丰富新系统,持续开展绞杀过程;而不是迫于惯性,很多功能还是在老系统开发,造成老系统越来越厚。
小结
架构重构或者架构演进中,为了兼顾交付,必须引入新老架构并存的绞杀者+脚手架模式,逐步择机把老功能移植到新架构中。而绞杀者架构的关键点是选择合适的脚手架。
工欲善其事必先利其器,做好足够的脚手架支撑才能事半功倍,脚手架的重要性不是个可选问题,而是大型遗留系统重构成功的关键要素。
原文始发于微信公众号(丁辉的软件架构说):大型遗留代码重构中的脚手架
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27263.html