架构重构的技巧

news2024/11/24 16:00:49

1 代码重构

定义

对软件代码做任何改动以增加可读性或者简化结构而不影响输出结果。

目的

增加可读性、增加可维护性、可扩展性

3 关键点

  • 不影响输出
  • 不修正错误
  • 不增加新的功能性

代码重构时,发现有个功能实现逻辑不合理,可直接修改吗?

当然不可!

2 架构重构

定义

通过整系统结构(4R)来修复系统质量问题而不影响整体系统能力。

目的

修复质量问题(性能、可用性、可扩展…)

关键点

  • 修复质量(架构,而非代码层面的质量)问题,提升架构质量
  • 不影响整体系统功能
  • 架构本质没有发生变化

把某个子系统的实现方式从硬编码改为规则引擎,是代码重构还是架构重构?

属于架构重构,架构设计方案了,实现系统可扩展性。

3 代码重构 V.S 架构重构

4 架构重构技巧

4.0 手段

架构重构是否可以修改 4R 中的 Rank?

不能!修改 rank 就不是重构,而是演进了。拆微服务不属于改 rank。外部系统协作方式都得修改了。比如将淘宝的支付方式支付宝拆出来,成为支付宝公司了。

4.1 先局部优化后架构重构

局部优化

定义:对部分业务或者功能进行优化,不影响系统架构。

常见手段:

  • 数据库添加索引,优化索引
  • 某个数据缓存更新策略采用后台更新
  • 增加负载均衡服务数量
  • 优化代码里面并发的逻辑
  • 修改Innodb buffer pool 配置,分配更多内存
  • 服务间的某个接口增加1个参数

架构重构

定义:优化系统架构,整体提升质量,架构重构会影响架构的4R定义。

常见手段:

  • 引入消息队列(增加 Role )
  • 去掉 ZooKeeper,改为内置 Raft 算法实现(删除 Role)
  • 将 Memcached 改为 Redis( 改变 Role)
  • 按照稳定性拆分微服务( 拆分 Role )
  • 将粒度太细的微服务合并(合并 Role)
  • 将服务间的通信方式由 HTTP 改为 gRPC(修改 Relation )
  • SDK从读本地配置文件改为从管理系统读取配置(修改Rule )

4.2 有的放矢

案例

  • 开发效率很慢,P业务和M系统互相影响
  • 线上问题很多,尤其是数据类问题
  • M系统性能很低

有的放矢:

重构只解决第1个问题(开发效率很慢,P业务和M系统互相影响)。其他问题咋办,架构师你不解决了吗?架构重构后了,各个业务部门再解决各自的问题,如 P业务后台优化自己的问题,M 系统优化自己的性能问题,因为这些问题本身靠重构是解决不了的,而是要靠重构拆分之后,各自再继续优化。

4.3 合纵连横

合纵

说服业务方和老板

  1. 以数据说话

    把“可扩展性”转换为“版本开发速度很慢然后给出对应的项目数据(平时注意搜集数据)。

  2. 以案例说话(其实更有效,给人的冲击力更明显)
    若没有数据,就举极端案例,如某个小功能,开发测试只要5天,但是等了1个月才上线。

连横

说服其它团队。

  1. 换位思考
    思考对其它团队的好处,才能让人配合。

  2. 合作双赢
    汇报和总结的时候,把其它团队也带上。

案例

合纵:告诉PM和项目经理极端案例,设计2周、开发2天、一个月才上线。

连横:P业务线上问题大大减少,P业务不会被其它业务影响

4.4 运筹帷幄

① 问题分类

将问题分类,一段时间集中处理类问题。
避免对照 Excel表格,一条条解决。

② 问题排序

分类后排序,按照优先级顺序来落地。

避免见缝插针式的安排重构任务,不要搭业务的顺风车重构:

  • 避免背锅
  • 效果不明显
  • 无法安排工作量大的重构

③ 逐一攻破

每类问题里面先易后难。

把容易的问题解决掉,增强信心。

④ 案例

Before:

  • 1个100多行的Excel问题表格,一个一个的解决
  • 专挑软柿子捏
  • 见缝插针

After:

  1. 分类:性能、组件、架构、代码
  2. 分阶段: 优化-> 架构重构 -> 架构演进
  3. 专项落地: 明确时间、目标、版本

5 架构重构FAQ

架构重构是否可以引入新技术?

可以,但尽量少,架构重构要求快准

业务不给时间重构怎么办 ?

会哭的孩了有奶吃。收集数据和案例,事实说话。

其它团队不配合怎么办 ?

学会利用上级力量。上级都不支持,说明你做的这个没意义,所以领导也不在乎。那就别做了。

业务进度很紧,人力不够怎么办 ?

收集需要重构的证据,技术汇报的时候有理有据

6 测试

6.1 判断

  1. 代码重构、架构重构、架构演进都不需要去修复问题 ×
  2. 微服务拆分既可以是架构重构的手段,也可以是架构演进的手段 √
  3. 架构重构应该搭业务版本的便车,可以避免对业务版本有影响 ×
  4. 架构重构是为修复问题,因此应该将系统遗留的问题都在架构重构的时候修复 ×
  5. 架构重构应该分门别类,按照优先级逐步落地 √

6.2 思考

架构重构的时候是否可以顺手将代码重构也做了 ? 因为反正都安排版本了。No!

局部优化不属于代码/架构重构。

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

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

相关文章

网络安全-JDBC反序列化漏洞与RCE

目录环境Black Hat Europe 2019漏洞原理攻击手法mysql-connector-java的分析Mysql协议抓包分析Mysql服务器docker启动抓包&&分析Fake Mysql Server搭建Java反序列化工具ysoserial使用fnmsd师傅的MySQL_Fake_Server使用Y4tacker师傅的脚本JDBC代码项目架构代码复现参考环…

Python爬虫之读取数据库中的数据

之前几篇我们一直在研究如何从网站上快速、方便的获取数据,并将获取到的数据存储在数据库中。但是将数据存储在数据中并不是我们的目的,获取和存储数据的目的是为了更好的利用这些数据,利用这些数据的前提首先需要从数据库按一定的格式来读取…

LeetCode——二叉树的非递归遍历

144. 二叉树的前序遍历 给你二叉树的根节点root,返回它节点值的前序遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&#xff1…

[ 应急响应基础篇 ] 使用 Autoruns 启动项分析工具分析启动项(附Autoruns安装教程)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Spring详解简介

1、Spring的简介 Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发。我得出一个公式:Spring 春天 Java程序员的春天 简化开发。最后的简化开发正是Spring框架带来的最大好处。 Spring是一个开放源代码的设计…

SpringSecurity之两个重要接口

前言 前面讲解了关于SpringSecurity的基本原理,其中介绍了过滤器链以及过滤器加载的过程。我们在前面入门案例中的用户名和密码是系统自动生成的,在真实应用环境中,是需要查询数据库获取用户名密码是否匹配的,那么如何实现呢&…

贯穿设计模式第二话--开闭职责原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…

串口数据处理

1.在串口接收中断中接收到的数据写入环形缓冲区;唤醒解析线程(发出任务通知)或释放信号量。 2.开一个解析线程: void AT_Parser() {while(1){1.等待任务通知;读环形缓冲区(将数据存起来); 2.常…

FE_CSS 页面布局之浮动

网页布局的本质——用 CSS 来摆放盒子。 把盒子摆放到相应位置。CSS 提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序): 普通流(标准流)浮动定位 1 标准流(普通流/文档流) 所谓的标准流: 就是标签按照规定…

LAMP架构与网站搭建实例

一.LAMP概述 1、LAMP的概念 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态web站点服务及其应用开发环境 LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、…

53 openEuler搭建PostgreSQL数据库服务器-管理数据库

文章目录53 openEuler搭建PostgreSQL数据库服务器-管理数据库53.1 创建数据库创建数据库示例53.2 选择数据库选择数据库示例53.3 查看数据库查看数据库示例53.4 删除数据库删除数据库示例53.5 备份数据库备份数据库示例53.6 恢复数据库恢复数据库示例53 openEuler搭建PostgreSQ…

第十四届蓝桥杯省赛c/c++大学B组题解

第十四届蓝桥杯省赛c/c大学B组题解 个人答案,有错漏感谢指正哈 试题 A: 日期统计 本题总分:5 分 【问题描述】   小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示&#xff…

Linux应用编程(文件属性与目录)

本章将会讨论如下主题内容。 ⚫ Linux 系统的文件类型; ⚫ stat 系统调用; ⚫ 文件各种属性介绍:文件属主、访问权限、时间戳; ⚫ 符号链接与硬链接; ⚫ 目录; ⚫ 删除文件与文件重命名。 一、Linux 系统中…

python编写一计票程序,键盘输入候选人姓名(输入“#”结束),使用字典存储并统计出候选人得票数。python实现分段函数。

一、编程题目 编程题目1&#xff1a;python编写一计票程序&#xff0c;键盘输入候选人姓名(输入“#”结束)&#xff0c;使用字典存储并统计出候选人得票数。 编程题目2&#xff1a;python实现以下分段函数&#xff1a; y 2x^34x^23 -10<x<0 y x14 0<x<6 y 6x…

001+limou+git安装与入门

1、git安装以及下载检查&#xff08;windows环境&#xff0c;macOS可能比较麻烦&#xff09; &#xff08;1&#xff09;下载git git官网下载&#xff0c; Git - Downloading Package (git-scm.com) &#xff08;2&#xff09;检查下载 以下命令可以检查git是否下载成功 $…

JAVA入坑之类和对象

目录 一、类 1.1面向对象(OOP)与面向过程 1.2面向对象的三个特性 1.3类的语法格式 1.3.1类的分类 1.3.2类修饰符 1.4变量 1.4.1变量格式 1.4.2成员变量 1.4.3区分实例变量和类变量 1.4.4局部变量 1.4.5区分成员变量和局部变量 1.5final关键字 1.5.1常量 1.6方法 …

基于Java+SSM+jsp的二手车交易网站设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;300套&#xff09; 目录 一、效果演示 二、…

博客首页效果

学习来自风宇blog的博客首页效果 全部用的基本上都是原生的html&#xff0c;css&#xff0c;js特别是flex布局的使用&#xff0c;主轴方向可以是横轴&#xff0c;也可以是纵轴&#xff0c;弹性项还可可以使用百分比sticky粘性布局&#xff0c;作为侧边栏&#xff0c;它不会超出…

Spring Cloud组件源码之OpenFeign源码分析

" Spring 到底是春天的来临万物复苏&#xff0c;还是春转夏的干燥又炎热呢&#xff1f;" Spring的来临让JavaEE走向了另一个高度。便捷的开发&#xff0c;完美的生态。物极必反&#xff0c;学习Spring的成本越来越低&#xff0c;导致Java程序员越来越密集&#xff0…

实习不对口,还去吗?

作者&#xff1a;阿秀校招八股文学习网站&#xff1a;https://interviewguide.cn这是阿秀的第「255」篇原创小伙伴们大家好&#xff0c;我是阿秀。欢迎今年参加秋招的小伙伴加入我的学习圈&#xff0c;目前已经超过 2200 小伙伴加入&#xff01;去年认真准备和走下来的基本都拿…