最近两个月,你完成了哪些线上系统迁移工作,能具体介绍一下吗?
摘要:背景 我们这边有一个系统,和大多数系统一样吧,涉及后台管理部分、后台管理相关服务、数据库,另外,由于该系统对app提供接口,还涉及app接口服务。这个系统,业务上归属于我们部门,但是目前在线上,是在另一个部门的服务器上运行(这个部门是由于前
背景
我们这边有一个系统,和大多数系统一样吧,涉及后台管理部分、后台管理相关服务、数据库,另外,由于该系统对app提供接口,还涉及app接口服务。这个系统,业务上归属于我们部门,但是目前在线上,是在另一个部门的服务器上运行(这个部门是由于前两年组织架构调整,从我们部门拆分出去成立的),运行也算平稳,但是,这个系统最近突然有个需求要做,新部门这边明确表示需求他们不做,他们不做,就我们做呗。但是,我们开发完,上线又去他们的服务器上上线,流程也比较麻烦,我们这边最后决定是把系统迁回到我们部门的服务器上运行。
这个系统整体迁移完成,大概两个月左右,还是比较麻烦的,大概包括:现状梳理、迁移方案评审、开发验证、测试方案评审、测试验证、运维上线方案评审、运维上线、业务上线。下面简单讲讲。
这个系统,在经过对线上链路的梳理后,也画了架构图,大体来说呢,类似下面这样:
大家可以看到,上图有的是红色,有的是绿色,这个图实际是最终我们这边部署完成后的架构图,对方部门那边得原始架构也差不多(我就偷懒不弄了),毕竟这次任务就是做迁移,相当于把系统涉及的各类组件,都在我们这边部署一遍。当然了,有些组件其实我们已经有了,如后台管理系统、内部路由服务,这两个服务只需要做一些变更就行了,不用新部署;另外的绿色部分组件,就是我们这边没有的,本次需要在我们这边新部署。另外,还有个APP测路由的组件(可以简单理解为业务网关,如spring gateway),这个组件,原本是把app侧的接口转发到对方业务部门的服务,现在是要改一下,转到我们这边的业务服务A来,这样呢,app侧是无感的。
后台管理部分
前端页面的迁移
这个后台管理系统,其实挺有意思,是传统的以前servlet war包部署的架构,不过servlet容器不是tomcat,是resin(以前我也没听过)。不过这个不重要,这个管理系统,是厂商做的,一般来说,厂商把系统卖给我们了,但我们后续想在这个管理系统里加一些菜单、页面、功能,怎么办呢?难道厂商来给我们开发吗,那是不可能的,因为厂商卖给我们的这套系统是没卖源码的,没法改。
那这个系统怎么支持加菜单、页面这些呢?
这个系统做了些功能,支持你新建菜单,点击菜单后一般会渲染一个前端页面对吧,那页面怎么来呢,它就还支持你创建一个前端页面:
页面内容由你自己定义,可以看到,下面就是一些前端标签,但这个标签怎么都带了个前缀啥的,这我也没仔细研究,自然是弄了个前端渲染的引擎,不然浏览器肯定不认识这个html:
然后呢,页面数据从哪里来呢,点击按钮后,又触发什么动作呢。这些都是可以自己定义的,比如上图我框出来的,这个form对应的加载数据的事件就是e_q_important_notice。
那这个事件其实就相当于我们现在的接口了,但是为了保证扩展性,这里支持好几种事件。
这里的bus接口就是类似于现在的rest接口,只是你要指定一个服务名和接口名。
如果是想直接查库,也是支持的,需要指定一个datasource的名字(后台配置了对应datasource的数据库连接信息,ip端口用户名密码啥的):
所以,靠这么一套框架,厂商,既卖了管理系统给我们,代码没泄露,且后续的业务开发还不需要他们投人力。该说不说,10几年搞的这套东西,还是不错的,虽然它不符合现在的时代了(开发页面很不舒服,效率低),但上面有太多的业务功能了,该维护还得维护着。
说回迁移,所以这次,前端的迁移还是比较简单,因为这些页面对应的html代码、事件啥的,都是存储在管理系统的数据库里的,而且页面上支持导出这些html代码、事件,我们只需要把他们在原系统导出,然后在我们这边的系统导入即可。
为什么我们这边可以直接导入呢,导入到哪里呢,因为那时候基于厂商这套框架,搞了2个后台管理系统,1个是给员工相关系统用的(employee),1个是给app那种面向客户的系统用的(customer),两个系统独立演化了好些年,已经大不相同(毕竟厂商不能预判到所有需求,所以之前的开发同事们,在各自负责系统上弄了各种骚操作,后面会提到)。
部门拆分后,当时两个系统都归他们,后来呢,为了部门切割干净,我们把给员工用的那个系统(employee)复刻了一套(假设为employee-own),这次要迁移的功能的前端页面,其实是在customer那一套上面的,也就是从customer导出,然后在employee-own中导入。
数据库迁移
这块其实还是有点麻烦,我们做完迁移方案评审后,接下来就是验证方案的可行性。我先在开发环境做验证,尽量确保各种坑都能踩到。
