老系统如何重构之最全总结

news2025/7/16 7:46:37

目录

1. 重构的概念

1.1 重构的定义

1.2 重构的分类

2 为什么重构

3 如何重构

3.1 说服业务方

3.2 确定重构的目标

3.3 老系统的熟悉与梳理

3.4 数据库的重构

3.5 前后端的系统重构

3.6 数据迁移与检查

3.7 系统检查联调测试

3.8 系统切换


1. 重构的概念

1.1 重构的定义

首先我们在多年的开发过程中,接触过也并参与过各种类型的重构,先不谈定义。

拿我们具体的案例来说,

1. 支付原来没有卡券功能的,后续加入了卡券逻辑,这算重构么?

2. 一个小系统原来是PHP开发的,后面全面升级到了java语言,这算重构么?

3.系统中一个模块的代码充斥着大量的IFelse,后面使用设计模式进行了改造, 这算重构么?

好,我们看下重构的定义:

前提是 不改变软件的外部行为,那上面例子中的第一条就被否定了,属于增加了新需求,改变了软件的外部行为。后面的第二、三条都属于重构,改变了内部的结构,而未改变外部的行为。

重构后使得代码更优雅,更易于维护、性能更高等。

1.2 重构的分类

重构分类可大致分为如下4大部分,

平台级、架构级、业务级、模块代码级,再实际重构工作中,4个部分并非完全割裂的,而可能会存在相互重叠的部分。

1.2.1 平台级-如很多平台最早使用的 LAMP - Linux Apache Mysql PHP 模式 - 更新成了 java平台 ,我们最早使用过一套Groovy语言开发系统 -也更新成了java

1.2.2 架构级-例如我们对单体服务的拆分- 或者为提升系统性能引入缓存设计,比如我们之前的一个单体服务-拆分成 dubbo微服务的架构模式

1.2.3 业务级-业务升级过程中会存在一些瓶颈导致迭代困难,-可以重新考虑设计底层的数据结构或业务模式,例如我们最近上线的商户档案的一个重构,本来系统中是存在 商户和代理两个主体概念,老系统却把 商户和代理耦合到一个表中,这次重构

进行了拆分。通过表进行关联。

1.2.4 代码级- 针对不合理的地方引入设计模式等进行升级拓展,-比如之前我接触过的一段路由算法,有几十个ifelse判断,最终得出路由的结果,每次升级这块都提心吊胆,后来升级使用责任链模式,在去迭代就清晰很多了。

2 为什么重构

重构的原因多种多样,但不外乎这几个:

1、业务增长太快了,老系统之前的设计无法承载过高的压力,亟需重构解决

2、系统稳定性差,漏洞很多,有时候经常要靠重启解决

3、经过多年的发展,充斥着大量的不合理的代码,杂乱,难以维护

4、老系统使用的语言无人维护了

5、业务需求满足起来很困难或无法满足 

等等

3 如何重构

如何进行是一个比较大的话题了,我们从如下几个步骤来说

3.1 说服业务方

其实业务最关注的是什么时候上线他们的新需求,什么时候可以开展新业务,而会觉得系统内部的改造和他们没啥关系,一般不会由他们来推动进行系统重构的。

而重构又会耗费大量的人力物力,以及时间,还有可能导致现在的业务迭代暂停,影响业务的开展。所以,我们需要极力的说服业务,陈述利弊。

不去重构有可能导致系统瘫痪,需求迭代慢,等,

而重构的好处就太多了

例如 1.可以提升系统的三高、高并发、高可用、高性能 2. 趁着重构的过程 可以优先现有不合理的业务流程 3. 重构完成后非常快的满足新的业务诉求

3.2 确定重构的目标

本次重构达成的最终目的是什么?引入合理架构,?微服务拆分?优化代码?达到更高的性能?等

3.3 老系统的熟悉与梳理

重构是基于老系统,而不能脱离老系统,这就需要对老系统了如指掌,特别是关键的环节步骤不能有任何差错。

知己知彼,百战不殆。 1、先收集所有老系统的资料 2、分类整理 ,梳理业务线流程  3、关键的流程或缺失资料的流程,review 老代码 4、老系统的坑,疑难点等和相关人员、沟通记录。 

3.4 数据库的重构

首先我们要熟悉老系统的数据库中不合理之处,该拆的表没拆,该合的表没合,不合理的字段、等

新系统数据库设计考虑范式,若数据量过大,分库分表等。

3.5 前后端的系统重构

首先最核心的还是设计,设计文档应参与多轮评审,并反复和大家宣贯,避免存在盲区或模糊的地方。

开发阶段可以采用迭代模式针对相对独立的模块 进行 开发-自测-Review-测试 

3.6 数据迁移与检查

新系统开发好,避免不了要处理 老系统存储的数据,这就涉及到了老系统的数据迁移

迁移方式可以全量迁移-增量迁移。 而迁移方式又和切换方案关联比较强- 如果我们选择直接切换,老系统停机,就可以使用全量迁移即可。

若新老系统并行,就会存在 全量迁移历史终态数据,再增量迁移变化数据。

迁移以及校验的方式:可以依据具体情况使用系统或手工SQL的方式。

3.7 系统检查联调测试

1. 系统检查- 会比对 出入参,新产生的数据

2、重构后的系统,存在内部之间微服务 相关的接口调用,进行联调。 与外部系统之间相互调用,进行联调。并要约定好上线及切换时间。

3、测试,从功能性、性能等方面。最核心的还是要比较新系统与老系统的差异 

稍后我们引入一个流量回放的工具。

3.7.1 重点介绍下,测试阶段-流量回放的工具使用。

流量回放的概念是 :测试数据不再由人为制造,而是直接复制线上的流量数据,将复制好的部分流量打到被测集群中,相当于线上流量在测试环境的一次重放。

流量回放的步骤- 

1. 针对生产需要测试的接口 ,进行流量的录制,数据收集。接口出入参等信息

2、将收集的数据进行持久化存储,可以使用数据库或其他缓存工具

3、制订回放计划,什么时候 回放哪些接口,等

4、将回放环境维护,相应的基础数据与生产保持一致,调用第三方的,无法模拟的,可选用mock

5、回放流量

6、对比生产结果和回放结果,哪些是合理的差异,哪些是异常的差异。 

3.7.2 流量回放工具的选择

1、web服务,自定义开发,例如 账户重构,可以相关接口开发AOP切面,将接口流量引出一份到新系统,根据新系统产生的结果,与老系统产生的结果进行比对,

2、预留资源, 单体服务-TCPCopy 适用些 复杂分布式服务-适用 Jvm-sandbox-repeater 

3.7.3 Jvm-sandbox-repeater 

3.7.4  Console

3.8 系统切换

3.8.1 使用流量切换方式 系统切换阶段,可以使用流量逐批切换的方案。

1.1首先要确定好切换的业务主体维度,例如根据用户的地域,或活跃度等计算出的 用户ID,根据商户沟通程度,业务量大小等计算出的商户ID,规划好主体ID切换批次。

1.2根据选定好的主体ID ,老系统进行白名单配置,新系统进行流量切换

1.3 持续跟踪线上日志,可以针对相关接口进行新老系统的出入参对比

1.4 对错误日志,及异常数据等进行监控并预警到相应的人员

1.5 针对切入新系统流量产生的数据,可以与老系统之前的数据进行比对,看有无出入。 

3.8.2 使用全量切换方式

2.1 首先确定好系统切换方案,-是使用直接的全部流量切换, 还是小批次验证后再进行全量切换,还是将之前的批次切换分成具体多少批切换完成。包括切换的时间,参与的人员,验证的步骤,拉出清单,并在测试环境进行模拟演练。

2.2 提前确定好回滚方案- 若流量全部切换完成,发现生产问题并无法及时处理,需要及时进行回滚。 包括回滚的内容,数据,系统,顺序,各参与人的职责,回滚后的数据验证,是否有后遗症。并在测试环境进行模拟演练。

2.3 切换后生产系统验证无误,核心逻辑正常运转,无异常数据,标志着 系统切换完成。若存在一些非核心的小问题,历史债,及时排期修复,并做好系统监控,保证新系统的平稳运行。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DlhSoft Gantt Chart Hyper Library for HTML5 Standard Edition

DlhSoft Gantt Chart Hyper Library 甘特图超级库包括一组交互式计划组件,可用于使用纯 JavaScript、TypeScript 或 Angular、React 或 Vue 等框架构建的启用时间线的应用程序 基于 JavaScript 的甘特图 可定制的网格列、汇总的工作分解结构、带有可拖动条和依赖线…

静态HTML网页设计作品 DIV布局家乡介绍网页模板代码---(太原 10页带本地存储登录注册 js表单校验)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家乡旅游景点 | 家乡民生变化 | 介绍自己的家乡 | 我的家乡 | 家乡主题 | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在…

基于ssm jsp超市在线销售平台的设计与实现

近年来,网络信息技术的迅猛发展,互联网逐渐渗透到人们日常生活中的方 方面面,而给我们的生活带来巨大变化的电子商务正在以前所未有的速度蓬勃发 展,电子商务也成为网络研究与应用的热点之一。网上商店是电子商务的重要方 面&…

【干货】教你在十分钟内编译一个Linux内核,并在虚拟机里运行!

前言 这篇文章将会简单的介绍如何在Linux系统上面,编译一个5.19的内核,然后在QEMU虚拟机中运行。 下载Linux内核源码 首先,我们需要下载Linux的代码: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.19.10.t…

使用vue互联QQ音乐完成网站音乐播放器

🎶 文章简介:使用vue互联QQ音乐完成网站音乐播放器 💡 创作目的:记录使用APlayer播放器MetingJs实现 在线播放qq音乐、网易云音…等平台的音乐 ☀️ 今日天气:2022-11-19 小雨多云 天空灰蒙蒙的 🥲 &#x…

还在付费使用 XShell?我选择这款超牛逼的 SSH 客户端,完全免费

分享过FinallShell这款SSH客户端,也是xiaoz目前常用的SSH客户端工具,FinalShell使用起来方便顺手,但令我不爽的是tab数量变多的时候FinalShell越来越卡,而且内存占用也比较高。 最近发现一款使用使用C语言开发的跨平台SSH客户端W…

【无人机】基于Matlab的四旋翼无人机控制仿真

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

uni-app —— 下拉刷新 上拉加载

文章目录 前言一、下拉刷新 1.开启下拉刷新2.监听下拉刷新3.关闭下拉刷新二、上拉加载总结一、下拉刷新 1. 开启下拉刷新 在uni-app中有两种方式开启下拉刷新 需要在 ​​pages.json ​​​ 里,找到的当前页面的pages节点,并在​​style​​​ 选项中开…

这次把怎么做好一个PPT讲清-总体篇

文章目录一、背景二、图表化、图示化三、关键词设计四、版式层级五、逻辑关系图**1)常用逻辑****2)如何让逻辑关系图好看**六、对齐、分组和对比**对齐****分组****分组就是将同类得信息放在一起,靠的更近一点**那么,实现分组原则…

基于S32K144实现TPS929120的基本控制功能

文章目录前言1.TPS92910简介2.硬件调试平台2.1 灯板原理图2.2 参考电流2.3 器件地址3.TPS929120通信协议3.1 物理层3.2 数据链路层3.3 传输层2.3.1 读写时序2.3.2 帧格式说明2.3.3 寄存器lock与unlock2.3.4 输出通道控制4.使用S32K144驱动TPS929104.1 实现命令帧格式4.1.1 写寄…

【云原生】玩转Kubernetes实战(一):Pod、ConfigMap的使用

本文主要是利用Kubernetes 集群搭建出一个 WordPress 网站,用了三个镜像:WordPress、MariaDB、Nginx。 下面是其简单的架构图,用于直观的展示这个系统的内部逻辑关系: 简单来说,就是要通过本地地址http://127.0.0.1…

Spring AOP[详解]

一.需求引入 在开发过程中,总会有一些功能与业务逻辑代码耦合度不强(例如保存日志,提交事务,权限验证,异常处理),我们可以将这些代码提取到一个工具类中,需要使用时在调用工具类来实现. ​ 但是这样也会有弊端,那就是我们的代码已经开发完毕,后期如果需要增加公共功能就需要更…

Pinpoint--基础--03--安装部署

Pinpoint–基础–03–安装部署 前提 使用hd用户登陆 完成基础环境搭建https://blog.csdn.net/zhou920786312/article/details/118212302代码位置 https://gitee.com/DanShenGuiZu/learnDemo/tree/master/pinpoint-learn/demo11、安装环境准备 1.1、jdk1.8 基础环境搭建 包含…

一文搞懂MySQL表字段类型长度的含义

不知道大家第一眼看标题的时候有没有理解,什么是“字段类型长度”,这里我来解释下,就比如我们在MySQL建表的时候,比如下面这个建表语句: CREATE TABLE user (id int(10) DEFAULT NULL,name varchar(50) DEFAULT NULL,…

linux系统离线安装docker(分步法一键法)

1 前言 在有的项目场景中,服务器是不允许连接外网的。此时若想在服务器上安装部署docker容器,就不能采用在线方式了,不过可以采取离线方式进行安装。下面我们就一起看看离线安装的两种办法。 一种是分步安装法,一种是一键安装法…

Python冷知识:如何找出新版本增加或删除了哪些标准库?

“内置电池”是 Python 最为显著的特性之一,它提供了 200 多个开箱即用的标准库。但是,历经了 30 多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在“漏电”! 好消息是,Python 正在进行…

Pinpoint--基础--02--架构设计

Pinpoint–基础–02–架构设计 1、整体架构 1.1、Pinpoint Collector 数据收集模块,接收Agent发送过来的监控数据,并存储到HBase部署在 Web 容器上 1.2、Pinpoint Web 监控展示模块,展示系统调用关系、调用详情、应用状态等,并…

CleanMyMac磁盘空间内存瘦身清理软件使用教程

许多用着Mac系统电脑的朋友们总是卸载不干净电脑垃圾软件,想要把垃圾软件卸载干净,可以尝试使用苹果电脑清理软件CleanMyMac。 经典的电脑深度清理软件——CleanMyMac。由于苹果电脑硬盘售价高昂,且不可以自行安装内存,很多苹果用…

代码随想录day60|结束亦是开始|84.柱状图中最大的矩形|总结

代码随想录day60 来了老弟 84.柱状图中最大的矩形 思路 本题和42. 接雨水是遥相呼应的两道题目,建议都要仔细做一做,原理上有很多相同的地方,但细节上又有差异,更可以加深对单调栈的理解!42. 接雨水 其实这两道题目先…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…