如何将现有系统逐步优化成微服务设计

2024-06-21 22:44

本文主要是介绍如何将现有系统逐步优化成微服务设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 基础服务改造
    • 核心步骤
      • 准备阶段
      • 实施阶段
  • 基础服务设计

本文诞生于学习架构实践专栏后的深思以及总结,结合公司之前“大泥球”的架构风格,改造服务设计的思维。
改造公司系统服务主要原因:1、代码类似“屎山”,牵一发而动全身,维护成本高,且迭代慢;2、业务数据均存放在一个数据库中,几百张数据表,也是在业务代码中随意Join关联表;

基础服务改造

核心思想:梳理业务功能、划分业务领域、构建微服务、逐步剥离、平滑替换
其中需要业务团队频繁对接以及沟通成本极高,但是也是归还历史技术债,就是一个字:撸起袖子,加油干~哈哈哈
公司也是有N条业务线,具体不阐述,但是业务线之间相互独立,背后对应的是同一个数据库,如图

这种规划现状带来的问题:

  • 业务系统功能重复建设:功能重复,也意味着多个系统中散布着相似甚至相同的数据逻辑。由于这些数据逻辑的高度耦合,对数据库表字段的任何升级处理都会影响相关业务,违反开闭原则,导致系统的整体稳定性和可维护性受到严重影响。这种情况造成了“牵一发而动全身”的局面,难以进行灵活的功能扩展和系统优化。

  • 数据库可用性差:若存在慢查询,导致资源阻塞,严重影响系统的可用性,甚至可能导致服务不可用。这种情况不仅影响用户体验,还可能对业务造成重大损失。其次,多系统同时访问数据库,数据库的连接数也会造成不够用,连接失败;

核心步骤

  • 准备阶段:为微服务改造做好前期的准备工作,包括圈表、收集SQL 和 SQL 拆分。
  • 实施阶段:实际落地微服务,包括微服务开发、服务接入和数据库独立。

准备阶段

一、圈表
1.划分服务边界
1.1:确定微服务具体包含哪些表,即服务的数据模型;
2.拆分原则
2.1:保证既容易拆分数据库,又可以控制服务粒度,也让业务功能内聚;
2.2:符合服务边界的表,且与其他业务表关联不大;表的数量不多,保持在十几张左右;
2.3:毕竟基于现有系统改造,避免引起太多变化,减少对业务系统的影响,故先不对数据库的表结构调整,可以考虑放入后期服务升级的版本中处理;

为什么服务改造要从数据库表出发,而不是从功能入手呢???

  • 从现有数据库表出发,比业务功能要清晰明了,更加直观;确定哪些表,进而大致确定服务应该具备哪些功能;
  • 从表出发,可以保证服务包含的是完整的业务功能表结构,降低表拆分得复杂度,避免一个表的一部分字段属于A服务,而另一部分字段属于B服务的情况;

二、收集SQL

  • 服务开发团队负责提供一个标准化的 Excel 模板,各业务系统开发团队负责收集具体的 SQL;分配职责,确定人员的工作边界,不然会产生中台服务接口功能定义不清晰的问题。
  • 模板应包括以下字段:
    SQL 语句:具体的 SQL 查询语句。
    业务场景:SQL 语句所对应的业务场景说明。
    访问频率:SQL 语句的访问频率(高、中、低)。
    表名:涉及的数据库表名。
  • 针对以上SQL 语句封装成服务接口,提供给业务系统使用;

三、拆分SQL

  • 因为收集的SQL语言不可能仅限于当前服务的数据库,也会产生于其他服务的数据库产生关联;故需要要求各个业务团队先进行拆分,保证最后提供给服务开发团队的 SQL,只包含访问当前服务数据库的相关表;
  • 通过SQL拆分,保证历史系统拆分新服务时,与其他数据库表的直接联系,降低耦合关系;
  • 其次,SQL拆分,一定会涉及各个业务系统的改造,故也需要各个业务团队的配合和支撑;
  • 最后,等待新微服务构建完成后,业务系统接入微服务,则完成现有SQL的替换;

实施阶段

四、构建微服务

  • 主要包括接口设计、代码开发、功能测试等步骤;
    依据梳理的SQL,对接口做一定的通用化设计,避免为每个 SQL定制一个单独的接口,以此保证服务的复用能力。
  • 第一版的服务主要是做好接口设计,聚焦业务功能,以保证服务能够落地,业务系统能够顺利对接为目标。
  • 持续迭代服务,内部做技术性优化,保证对外提供的服务接口不变;

五、接入微服务

  • 经过功能和性能验证后,业务系统可以直接接入新服务接口;
  • 各个业务开发团队逐步接入,替换原来的 SQL 语句;
  • 接入新服务的难度不大,但需要耗费比较多的时间,故需要公司各个层次的人员相互配合与支撑;

六、数据库独立

  • 当服务接入完成,所有的 SQL 语句都被替换后,业务系统是通过服务来访问数据库的
  • 将原业务系统的数据相关表迁移到新服务对应的独立水库;将原来的直连数据,演变为通过新服务访问数据库;
  • 服务和数据库独立,从物理层面,切断业务团队对这些表的依赖,也是趋向企业数字化改革的一步;
  • 要避免业务系统还有遗漏的 SQL 语句,避免它们还在直接访问库存的表。我们可以在迁库前,通过代码扫描做好相应的检查工作。

基础服务设计

上part了解到如何将服务逐步改造成微服务,那么如何打造一个合理的微服务呢???请看下文
关于基础服务设计的核心思想,也需要保证业务上的复用性,故需要把各个基础服务封装成高度复用的共享服务。
首先要明确一个思想:技术的核心价值是为业务服务,故开发中我们除了技术之外的事情,就是了解、学习、分析业务领域;否则如果对业务了解不深入,则会导致服务设计不足(兼容很多服务版本设计)或者导致过度设计(浪费资源,实现一堆不可用的功能);

如何设计微服务呢???
核心:服务边界的划分和功能的抽象设计;

一、清晰的服务边界划分

  • 作为基础服务,不主动调用其他服务,保证基础服务职责单一;
  • 作为基础服务,不负责与第三方系统的集成;

二、服务内部抽象设计

  • 功能上保证设计通用性,对内部数据模型和外部接口进行抽象设计;
  • 设计服务接口:同步接口和异步通知;
    同步接口:拆分出粗粒度接口、中粒度接口、细粒度接口;
    异步消息通知:依据消息详细程度,提成传输效率,拆分粗粒度消息和细粒度消息;

这篇关于如何将现有系统逐步优化成微服务设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082548

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用