21|微服务拆分(一):迈出遗留系统现代化第一步
拆分目标与演进计划
基于反向代理的特性开关
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了在进行遗留系统现代化项目中,如何进行微服务拆分的具体现代化工作。作者强调了贯彻“以增量演进为手段”的原则,并介绍了API级别的增量交付的重要性。在实现“特性开关”方面,作者提出了在单体服务中加入反向代理层的方式,并给出了代码实现的示例。此外,文章还介绍了建立数据同步机制的重要性,以及通过事件拦截和CDC的方式来实现数据同步。另外,文章还探讨了如何用API调用取代代码依赖,通过建立防腐层来解除对API调用部分的依赖,并对获取到的数据进行转换。总的来说,本文提供了微服务拆分的具体实践方法,对于正在进行遗留系统现代化项目的技术人员具有一定的参考价值。
《遗留系统现代化实战》,新⼈⾸单¥59
全部留言(11)
- 最新
- 精选
- peter请教老师一个问题: 作为例子的保险业务,代码量应该比较大。请问:改造前,是否需要通读所有的代码? 通读的话,是由一个人来通读?还是由多人来读?
作者回复: 对于大型遗留系统,动辄几百万行代码,很难通读,所以还是先梳理业务,识别业务边界,找出精益切片,再对这个切片进行代码分析。如果用活文档等工具,一两个人来分析就行(可以结对),把活文档注解标记好,生成脑图,这样其他人就可以不用再分析代码了。 另外,每一个人领取的改造任务,比如单个API,还是要自己仔细分析代码的。
2022-05-272 - 公号-技术夜未眠遗留系统涉及到的数据库除了mysql以外,还有其他数据库类型,比如sql server、oracle等数据库,如何在这些数据库中落地CDC技术了?谢谢老师
作者回复: 参考第十一节课,用触发器或轮询事务日志,这两种方法是通用的,跟具体数据库无关。
2022-05-303 - chon课程里面提到特性开关打开后,新的数据会写入新的库。这个时候如果发现问题把开关关闭,这个API又会用老的逻辑并写到老的数据库。但是特性开关打开和关闭期间写入新库的数据怎么处理,怎么同步回老的库?如果采用事件拦截是否意味着也需要在新的代码那边添加新的推送消息的逻辑并在老的代码里面添加监听处理消息的逻辑?这样是不是工作量太大了,感觉还不如用双写?有没有其他更好的办法?
作者回复: 双写的确是最直观最简单的,更好的办法其实就是在拆分数据所有权的时候,并不拆分数据库本身,而是先保留在单体库中。微服务通过DBLink来访问单体数据库,或者如果数据库不支持DBLink,就直接在单体库中创建视图(参考第十五节课)。
2022-05-29 - chon还有个问题,记得之前课程老师说过一次只做一件事,建议先拆应用再拆数据。但是,在这一节老师举的例子是同时拆应用和数据库?
作者回复: 好问题,这一点我没有在课程里说得太清楚。通过战术分叉拆分出服务来,基本上就完成了代码部分的拆分,剩下的绝大部分任务就是数据拆分了。因为遗留系统没有数据所有权的概念,所以在一个模块内是可以访问任何表的,像本节课中说的用API调用取代代码依赖的场景是非常少的,因为大部分情况可能就连表查询了,这一点在下一节课也会提到。
2022-05-28 - chon这章节里面把核保模块按照API 级别进行拆分,于此同时需要考虑建立数据同步机制。假如用的是基于最终一致性的消息事件同步数据方式,是不是在新旧模块凡是涉及到核保数据改动的地方都要添加发送消息的逻辑,再此基础上才能进行API级别的拆分?换句话说,API级别拆分之前,我们需要在所有涉及核保改动的地方都要先加上发送消息的逻辑?
作者回复: 是需要补消息的,但是没必要在拆之前就全部做好,可以是当前这个API拆分任务的一部分
2022-05-282 - chon如果你的数据库是 Oracle,强烈建议你使用基于 DBLink 的同义词来进行“数据同步”。 有个问题,用DBLink也只是做了数据同步,最终还是要把数据拆到新库去的,如果停机的话还比较容易,如果不停机的话,oracle有什么好的工具把数据同步到新的库中?或者还是也用传统的不停机的套路来做?
作者回复: DBLink的好处在于,在拆分代码时,可以当成是已经拆好了数据库,可以分离关注点。 PS:你指的传统的不停机的套路是什么?
2022-05-282 - 子夜枯灯请教老师两个问题:1.是按单个小功能重构还是按单个代码API重构?验证重构功能是否保持原样,是否需要业务人员在测试阶段参与进来。2.单体服务拆成微服务后,代码事务会涉及分布式事务,这部分老师有好的建议不?哪种分布式事务方案会更易于上手?谢谢
作者回复: 1. 如果业务人员能参与验收,当然是最好的,可以通过开关做A/B测试 2. 我在课程中不会介绍分布式事务,而是通过消息机制实现最终一致。关于分布式事务,极客时间已经有很多内容了。
2022-05-27 - aoe为什么要将当前的 ServletRequest 做一下转换,再转发给核保服务呢? 因为这样有了一个防腐层,可以隔离新接口有老代码的耦合。 为什么不能直接调用 request.sendRedirect 方法直接转发呢? 因为这样新接口设计必须遵循老代码的规则,不能独立设计2022-05-304
- Spoon因为有很多旧的服务都是使用MySQL自增主键作为ID,新旧库之间这种自增主键ID怎么同步呢?2023-03-25归属地:江苏21
- fliyu如果是异构存储,比如mysql和mongodb这些,最好要怎么操作2023-02-16归属地:广东