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

目录

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

本文诞生于学习架构实践专栏后的深思以及总结,结合公司之前“大泥球”的架构风格,改造服务设计的思维。
改造公司系统服务主要原因: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.mfbz.cn/a/731310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Virtualbox主机和虚拟机之间文件夹共享及双向拷贝

在VirtualBox这样的虚拟化环境中,实现主机与虚拟机之间的文件夹共享与双向文件传输是一个常见的需求。下面,我们将详细讲解如何在VirtualBox中实现这一功能。 一、安装与准备 首先,确保你已经安装了VirtualBox,并在其上成功创建…

Python学习打卡:day12

day12 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day1292、全国疫情地图构建数据整理获取数据数据整体结构(全国)省数据结构获取每个省份的确诊数据上述代码执行后输出&…

JavaScript的学习之旅之基本数据类型

目录 一、字面量(常量)和变量 二、标识符 三、数据类型 1.String类型 2.Number类型 四、布尔值类型 五、Null和Undefined类型 一、字面量(常量)和变量 字面量:不可变的数据,一般位于等式的右边 变量&…

vue生成二维码跳转到小程序

参考 https://blog.csdn.net/qq_51678620/article/details/121397610 https://blog.csdn.net/blue__k/article/details/125410448 this.$nextTick(()>{// new qrcode(this.$refs.qrCodeDiv, {// text: "https://www.aiitss.cn/member?id"id,//二维码链接&…

Python网络数据抓取(9):XPath

引言 XPath 是一种用于从 XML 文档中选取特定节点的查询语言。如果你对 XML 文档不太熟悉,XPath 可以帮你完成网页抓取的所有工作。 实战 XML,即扩展标记语言,它与 HTML,也就是我们熟知的超文本标记语言,有相似之处&am…

内存马的错误参数获取,导致原有接口失效解决方案

内存马的错误参数获取,导致接口失效。 前言 java Listener 类型内存马,在使用request.getParameter(String name); 获取请求参数去判断是否是恶意请求的时候,会影响某些框架无法接收到参数。 例子 在Jersey 框架 使用 MultivaluedMap 去接…

名校介绍|英国六所红砖大学

​近年来由于美国的拒签率增加,很多公派申请者,尤其是CSC资助的访问学者、公派联合培养学生及博士后研究学者,把出国目标改为其它发达国家,尤以英国居多,本文知识人网小编就重点介绍六所英国红砖大学。 我们在“英国大…

乐观锁实现库存控制

一、什么是乐观锁? 乐观锁是一种基于版本控制的并发控制机制。在乐观锁的思想中,认为数据访问冲突的概率很低,因此不加锁直接进行操作,但在更新数据时会进行版本比对,以确保数据的一致性。 乐观锁的原理主要基于版本号…

Spring IOC 控制反转(注解版)

Spring IOC 控制反转 文章目录 Spring IOC 控制反转一、前言什么是控制反转(IOC)什么是依赖注入(DI) 二、介绍 IOC2.1 传统思想代码2.2 解决方案2.3 IOC思想代码2.4 IOC 使用(Autowired依赖注入)2.5 IOC 优…

Service方法增加@Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException

Service方法增加Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException 场景处理方法原因 场景 首先确认的是Service添加了Service或Component等注解,另外也增加了ComponentScan确定扫描的包路径是包含对应Service的,但就是无法找到这个bean。 通…

从艳彩山水到艳彩艺术 薛永年:郭泰来艳彩艺术填补了中国美术史的空白

薛永年先生 自6月12日开展以来,郭泰来现代艺术大展杭州如火如荼地进行着,吸引了众多艺术爱好者和专业人士前往。毫不夸张地说,总统和清洁工人都能在他的作品中找到自己心中的那一块共振带并与之产生强烈的共鸣,这便是郭泰来先生的…

Vector 例题

例题一&#xff1a; 下面这个代码输出的是( ) &#xfeff;#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); a…

Python学习笔记16:进阶篇(五)异常处理

异常 在编程中&#xff0c;异常是指程序运行过程中发生的意外事件&#xff0c;这些事件通常中断了正常的指令流程。它们可能是由于错误的输入数据、资源不足、非法操作或其他未预料到的情况引起的。Python中&#xff0c;当遇到这类情况时&#xff0c;会抛出一个异常对象&#…

34.构建核心注入代码

上一个内容&#xff1a;33.获取入口点 以 33.获取入口点 它的代码为基础进行修改 实现的功能是把LoadLibrary函数注入到目标进程实现加载我们的模块。LoadLibrary只有有程序使用过了它的代码就会加载到内存中&#xff08;因为动态链接库是内存加载&#xff09;就是a程序要用L…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Polyp-DDPM: Diffusion-Based Semantic Polyp Synthesis for Enhanced Segmentation

Polyp- ddpm:基于扩散的语义Polyp合成增强分割 摘要&#xff1a; 本研究介绍了一种基于扩散的方法Polyp-DDPM&#xff0c;该方法用于生成假面条件下息肉的逼真图像&#xff0c;旨在增强胃肠道息肉的分割。我们的方法解决了与医学图像相关的数据限制、高注释成本和隐私问题的挑…

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址&#xff1a;一套上手ClickHouse-OLAP分析引擎&#xff0c;囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…

Comfy UI使用最新SD3模型,并解决报错‘NoneType‘ object has no attribute ‘tokenize‘【实测可行】

解决Comfy UI使用最新SD3模型报错’NoneType’ object has no attribute ‘tokenize’ 前几天SD3发布了&#xff0c;所以想着尝尝鲜&#xff0c;便去下载了SD3来玩一玩。使用的是Comfy UI而不是Stable Diffusion UI&#xff0c;这是一个比SD UI更加灵活的UI界面&#xff0c;使用…

内容安全复习 4 - 深度生成模型

文章目录 概述经典算法自回归模型&#xff08;Autoregressive model&#xff09;变分自编码器&#xff08;VAE&#xff09;生成对抗网络&#xff08;GAN&#xff09;扩散模型&#xff08;Diffusion model&#xff09;总结 应用 概述 深度生成模型是一类使用深度学习技术构建的…

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;因为是求二叉树的所有路径 &#xff08;2&#xff09;然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 &#xff08;3&#xff09;首先先考虑根节点&#xff0c;也就是要满足节点不为空 返回递归的形式dfs(根节…