遗留系统现代化实战
姚琪琳
Thoughtworks 资深咨询师
5615 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
用户故事 (1讲)
遗留系统现代化实战
15
15
1.0x
00:00/00:00
登录|注册

21|微服务拆分(一):迈出遗留系统现代化第一步

你好,我是姚琪琳。
在前面的课程中,我们结合案例讲解了如何启动一个遗留系统现代化项目。从这节课起,我们将重点介绍项目启动之后的内容,也就是具体的现代化工作。
当我们完成了项目的战略设计,大体设计出目标架构,又根据系统的现状,决定采用“战术分叉”的方式进行微服务拆分之后,接下来的难点就变成了“如何拆分”的问题。
我们会用四节课的篇幅来讲解如何拆分,分别覆盖代码拆分、数据库拆分、存储过程拆分和一些其他注意事项。这节课我们先来看看如何拆分代码。

拆分目标与演进计划

我们先来回顾一下上节课所制定的架构目标和演进计划。
我们的目标是将核保模块从遗留的单体应用中剥离出来,形成一个独立的微服务。这意味着,我们不仅要将代码拆分出来,放到全新的代码库中,数据库也要从原来的单体数据库中独立出来。以前可以随意访问的代码和数据库表,都要通过某种方式完成解耦
最终核保服务和遗留单体服务之间的关系,可能会像下图这样:
接下来我们就来看看如何演进。

基于反向代理的特性开关

我们先通过战术分叉,将单体中的核保模块(包括数据库)以及它所依赖的其他代码都完全复制出来,放到一个全新的 Maven module 或代码库中,并引入 Spring Boot 或其他 Web 框架。这部分工作可能会比较繁琐,但并不太复杂。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在进行遗留系统现代化项目中,如何进行微服务拆分的具体现代化工作。作者强调了贯彻“以增量演进为手段”的原则,并介绍了API级别的增量交付的重要性。在实现“特性开关”方面,作者提出了在单体服务中加入反向代理层的方式,并给出了代码实现的示例。此外,文章还介绍了建立数据同步机制的重要性,以及通过事件拦截和CDC的方式来实现数据同步。另外,文章还探讨了如何用API调用取代代码依赖,通过建立防腐层来解除对API调用部分的依赖,并对获取到的数据进行转换。总的来说,本文提供了微服务拆分的具体实践方法,对于正在进行遗留系统现代化项目的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《遗留系统现代化实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • peter
    请教老师一个问题: 作为例子的保险业务,代码量应该比较大。请问:改造前,是否需要通读所有的代码? 通读的话,是由一个人来通读?还是由多人来读?

    作者回复: 对于大型遗留系统,动辄几百万行代码,很难通读,所以还是先梳理业务,识别业务边界,找出精益切片,再对这个切片进行代码分析。如果用活文档等工具,一两个人来分析就行(可以结对),把活文档注解标记好,生成脑图,这样其他人就可以不用再分析代码了。 另外,每一个人领取的改造任务,比如单个API,还是要自己仔细分析代码的。

    2022-05-27
    2
  • 公号-技术夜未眠
    遗留系统涉及到的数据库除了mysql以外,还有其他数据库类型,比如sql server、oracle等数据库,如何在这些数据库中落地CDC技术了?谢谢老师

    作者回复: 参考第十一节课,用触发器或轮询事务日志,这两种方法是通用的,跟具体数据库无关。

    2022-05-30
    3
  • chon
    课程里面提到特性开关打开后,新的数据会写入新的库。这个时候如果发现问题把开关关闭,这个API又会用老的逻辑并写到老的数据库。但是特性开关打开和关闭期间写入新库的数据怎么处理,怎么同步回老的库?如果采用事件拦截是否意味着也需要在新的代码那边添加新的推送消息的逻辑并在老的代码里面添加监听处理消息的逻辑?这样是不是工作量太大了,感觉还不如用双写?有没有其他更好的办法?

    作者回复: 双写的确是最直观最简单的,更好的办法其实就是在拆分数据所有权的时候,并不拆分数据库本身,而是先保留在单体库中。微服务通过DBLink来访问单体数据库,或者如果数据库不支持DBLink,就直接在单体库中创建视图(参考第十五节课)。

    2022-05-29
  • chon
    还有个问题,记得之前课程老师说过一次只做一件事,建议先拆应用再拆数据。但是,在这一节老师举的例子是同时拆应用和数据库?

    作者回复: 好问题,这一点我没有在课程里说得太清楚。通过战术分叉拆分出服务来,基本上就完成了代码部分的拆分,剩下的绝大部分任务就是数据拆分了。因为遗留系统没有数据所有权的概念,所以在一个模块内是可以访问任何表的,像本节课中说的用API调用取代代码依赖的场景是非常少的,因为大部分情况可能就连表查询了,这一点在下一节课也会提到。

    2022-05-28
  • chon
    这章节里面把核保模块按照API 级别进行拆分,于此同时需要考虑建立数据同步机制。假如用的是基于最终一致性的消息事件同步数据方式,是不是在新旧模块凡是涉及到核保数据改动的地方都要添加发送消息的逻辑,再此基础上才能进行API级别的拆分?换句话说,API级别拆分之前,我们需要在所有涉及核保改动的地方都要先加上发送消息的逻辑?

    作者回复: 是需要补消息的,但是没必要在拆之前就全部做好,可以是当前这个API拆分任务的一部分

    2022-05-28
    2
  • chon
    如果你的数据库是 Oracle,强烈建议你使用基于 DBLink 的同义词来进行“数据同步”。 有个问题,用DBLink也只是做了数据同步,最终还是要把数据拆到新库去的,如果停机的话还比较容易,如果不停机的话,oracle有什么好的工具把数据同步到新的库中?或者还是也用传统的不停机的套路来做?

    作者回复: DBLink的好处在于,在拆分代码时,可以当成是已经拆好了数据库,可以分离关注点。 PS:你指的传统的不停机的套路是什么?

    2022-05-28
    2
  • 子夜枯灯
    请教老师两个问题:1.是按单个小功能重构还是按单个代码API重构?验证重构功能是否保持原样,是否需要业务人员在测试阶段参与进来。2.单体服务拆成微服务后,代码事务会涉及分布式事务,这部分老师有好的建议不?哪种分布式事务方案会更易于上手?谢谢

    作者回复: 1. 如果业务人员能参与验收,当然是最好的,可以通过开关做A/B测试 2. 我在课程中不会介绍分布式事务,而是通过消息机制实现最终一致。关于分布式事务,极客时间已经有很多内容了。

    2022-05-27
  • aoe
    为什么要将当前的 ServletRequest 做一下转换,再转发给核保服务呢? 因为这样有了一个防腐层,可以隔离新接口有老代码的耦合。 为什么不能直接调用 request.sendRedirect 方法直接转发呢? 因为这样新接口设计必须遵循老代码的规则,不能独立设计
    2022-05-30
    4
  • Spoon
    因为有很多旧的服务都是使用MySQL自增主键作为ID,新旧库之间这种自增主键ID怎么同步呢?
    2023-03-25归属地:江苏
    2
    1
  • fliyu
    如果是异构存储,比如mysql和mongodb这些,最好要怎么操作
    2023-02-16归属地:广东
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部