美文网首页
如何拆分已有的项目

如何拆分已有的项目

作者: 捞月亮的阿汤哥 | 来源:发表于2020-07-16 23:21 被阅读0次

1. 背景介绍

原先我有个项目A,随着业务的发展,产品会提非常多的需求,随着需求的增加,原有的项目就会越来越臃肿,直观的感受就是单测和部署的速度都很慢。

2 系统臃肿带来的影响

  • 程序启动慢,发布慢,开发效率会降低,解决bug的响应速度也会降低
  • 从领域的角度来说,其实不同的业务可能完全在不同的领域中,比如有些是营销活动相关的,有些是交易订单相关的,有些是做数据聚合展示的
  • 不同的模块之间的应用的重要性是不一样的,比如你的应用X是一个包含了支付相关的应用,应用等级是A,但是其中数据展示层的问题导致了线上出现了问题
    • 对用户和公司来说,带来了不可避免的损失
    • 对自己影响也很大,本来应用等级C的故障其实没啥关系,但是因为你的带来了故障的应用包含核心业务,所以提升了故障等级

3 系统迁移的流程

3.1 划分出不同的业务域

示意图如下:


业务领域 (1).png

3.2 子业务介绍

  • 核心业务相关的
    这一块内容会包含数据库分库分表的读写,数据库缓存的查询,失效和更新,数据快照等,对外提供高可用的服务接口,一般用户层是直接访问不到的。
    通过dubbo接口对其他服务提供能力

    • 因为其很重要,所以一定需要关注dubbo线程池和业务线程池的健康状况,做好监控,建议到达阀值后就报警,不要满了报警
    • 不同业务的调用,能做到线程池隔离的话,尽量做到线程池隔离,一些业务的调用量会比其他业务高很多,容易拖垮dubbo线程
    • 做好相应的扩容措施,应对突发流量
  • 业务展示层
    注重功能业务,以及一些衍生业务,比如依赖底层服务,我们可以使用规则引擎,插件(spi,策略模式),责任链等方式支持快速开发上层业务逻辑

  • 异步任务层
    主要一些mq异步更新的操作,监听binlog同步等的操作,功能相对独立,但是这个业务可能io操作比较多,需要创建io指标的报警项,磁盘的话条件ok可以用SSD的。

  • 数据聚合层
    这层比较简单,主要做报表的展示,报表的导出。查询可以走es,hbase

3.3 业务的迁移过程

3.3.1 创建一个新项目

  • 假设原先的系统是A,创建一个新的项目B,方式有如下几种
    • 比较简单的,把原先A中所有配置拷过来先,在这之上开发
    • 整一个maven archetype快速创建项目
    • 使用spring boot的autoconfigure方式
      • 这之上其实可以参考Spring initailizer和阿里云开源的spring cloud initailizer,将自己公司的中间件也整一个initailizer,支持快速创建(最近阿里云的initailizer支持COLA了,自己业务可以开发相应的架构模式)

3.3.2 将业务A的一些DO依赖移动到client模块

  • A业务的DO不应该迁移到B业务的
  • 将A业务的client打成jar包发布到公司的nexus maven私服
    • 不建议将jar包打成snapshot的,这是个非常不好的习惯

3.3.3 将业务B相关的DO,DTO,VO迁移

  • 迁移需要迁移干净,不要还引用到A业务中的client包中的B的DO,DTO,VO

3.3.4 将业务B相关的dao,service,controller迁移

  • 中间如果有spring注入的A业务的依赖,建议通过在A业务client模块中添加facade接口,业务B通过dubbo进行rpc调用
    • 接口的dto注意需要实现序列化的接口,不然rpc调用会报错
    • rpc调用注意适当的调用顺序,比如应用A的等级是P1,应用B是P3,那么B调A是合理的,A调B是有风险的,因为两者的可用性机器多少是不同的
  • controller层依赖的时候,如果公司有api网关的话,最好修改api的名字,见名知义
  • 如果有应用循环依赖的问题,可以dubbo配置consumer的check属性为false(不建议)

3.3.5 基础设施迁移

a. redis
检查是否需要使用单独的namespace,不建议共用namaspce,可以申请单独的namespace。根据业务量来看是需要cluster的还是主从的,以及内存大小
b. mq
mq一定要检查,避免业务A还接受到消息,迁移完后,需要将A中B的接受mq的代码注释掉
c. 数据库
数据库的话可以使用一个数据库,根据业务量使用不同的数据库,数据量不大的话但库单表就ok了,数据库创建的时候也要考虑业务容量的增长,适当容余
d. 动态配置服务
需要申请独立的group,和A业务进行独立

3.3.6 迁移完后,构建下是否有报错

3.3.7 迁移后检查

  • 使用idea全局搜业务A的包名
  • 确保业务B的所有service,dao,controller引用的都是业务B的DO,DTO,VO,如果还有引用业务A中的,idea alt+F7找到所有引用,一一修改引用;检查下mybatis的mapper文件的namespce,result等类型是否还修改了

3.3.8 测试

  • 将单元测试代码迁移,把所有的单测跑一遍
  • 将新应用的接口和原应用的接口写个文档梳理下,关联到哪些h5页面,native页面等,页面新的url是啥
  • 前端配合修改后,让测试进行回归测试

3.3.9 制定发布计划上线

  • 制定合理的发布计划,建议先上B应用,上线成功后,再下线A中B应用遗留的代码
  • 如果可以制定相应的回滚策略

相关文章

网友评论

      本文标题:如何拆分已有的项目

      本文链接:https://www.haomeiwen.com/subject/yrzfqktx.html