聊聊微服务到底该如何划分

news2024/12/23 12:02:29

f6a8069035eb224d09b1373bba2befee.jpeg

背景

        现在动不动就是微服务架构,但是微服务划分的合理与否会极大的影响开发过程中的复杂度,划分的重要性不言而喻,但是在微服务划分这条路上并没有银弹,有的说DDD可以解决微服务的划分问题,吕哥想说的是那只是理论上的,实际上影响微服务划分的因素众多,不能死搬教条,每个项目都有自己的特点和实际情况,我们要做的把理论与实际结合,把知识融会贯通,走“自己特色的项目道路”.

一、单体系统分解成微服务系统,如何划分最合理,为什么?

ea10304b7072732c7f5a6fa8080facfb.png

简单说的话就是:找到合理的划分边界,把每一个功能每一个接口每一个类放到最合适的服务中,使划分后的服务之间满足”高内聚,低耦合,同时要兼顾职责单一,代码复用率高“,这并不是一件容易的事情,难就难在影响的因素太多(技术因素、业务因素、人为利益因素,甚至受到公司部门斗争人情世故的影响),死搬教条是行不通的,一定要在基本正确的前提下不断改进与重构,向着最优解靠近。

“高内聚低耦合”意味着服务独立性高,依赖关系简单,那么复用率会受到什么影响呢?我之前写过关于“聊聊代码复用的文章”,复用的种类主要分两种情况:

1)集成式的JAR包复用;

15fcc6bb158241937de0924a094e05d5.png

2)RPC式的接口复用;

b4d12b382716498ac3d0247e900cd4d1.png

“高内聚低耦合” 对于集成式JAR包复用我认为没有影响,对于RPC式的接口复用意味着 复用率降低,但这同时也是低耦合的表现,不一定是坏处,这里面就需要一个平衡。

对于项目经验较少的同学来说,以上说法还是很抽象的,下面吕哥通过曾经的项目经历来剖析微服务化后带来的复杂性。

二、单体系统微服务化后到底会遇到什么问题?

1、数据库纵向拆分

微服务要求每个服务都有独立的数据库,跨服务的SQL联查会全部失效,如何解决?

21d9c03f27976eb01fb6b5aec5c36eae.png

SQL联查意味着表之间是有关联性、依赖性、耦合性的,现在虽然数据库进行了物理隔离,但是这种业务上的关联性仍然是需要解决的,如何解决呢?

方案1)

关联逻辑转移到服务代码层,将复杂查询SQL拆解,属于自己服务管理的部分直接查库,属于别的服务管理的部分通过RPC查询,最后在内存中计算组合得到最终想要的结果;

4653153ec4e841ff8af4757177282e09.png

方案2)

主库数据冗余,冗余的粒度可大可小,大则整张表冗余,小则按列进行冗余。无论哪种方式都需要解决数据的实时性和数据一致性问题;

d07376a779197e7f387d29222a588491.png

方案3)

数据集中到只读数据仓库中,再进行跨域SQL查询,同样需要解决数据的实时性和数据一致性问题;

d4d7a4eba182e96726e0f51237583be7.png

2、分布式事务

微服务化后会产生RPC操作,由此产生的分布式事务(数据一致性问题)如何解决?

系统之间交互无非两种模式:

1)同步通信

e6303e6758e1dd1c94f8271a3dea43c9.png

2)异步通信

2a2ffd9f9477361c1354b4223ba1050f.png

哪些业务需要同步通信,哪些业务可以接受异步通信?

同步通信模式下如何解决分布式事务问题?

1)SEAT框架AT模式

586345f10faa35ce54b0dc4142e57d96.png

2)TCC框架

f185e062bccfad46157e76b2b81a9489.png

3)SAGA框架

e0eb74078d95be3a8223971bdef32aa3.png

异步通信模式下如何解决分布式事务问题?

1)消息队列

303dd27ab743fe181198b8af635d2d6e.png

8f9e67f2171ea6e591d67cf946e49fce.png

2)定时任务

f7243a32b0e08c598df222a966fb247f.png

62b018c9e1cddb7c9a3eec89c25cd9d2.png

3、服务依赖

如何解决领域存活问题?服务雪崩问题?

对于同步通信模式下,领域存活会受到挑战,一般只能通过功能降级来应对;受接口堵塞的影响雪崩问题会接踵而来,一般通过限制接口超时时间、限制重试次数、接口熔断来解决;

fa1dd4cdd491c8c99fba13d74ddb93c9.png

对于异步通信模式下,领域存活不会受到影响,也不会有雪崩问题,但是业务的进度会受到积压。

c7297066ba294f4df3fe39b8e6f10781.png

4、服务的主次之分

01dc45d2f96d49ecf4ecb05d14d27be3.png

核心服务:影响全局服务的基础服务(如:ID生成服务)、影响关键路径的服务(如:登录服务)

重要服务:主要业务所在的服务,用户大部分时间都是在这个服务上操作的,如:商品查询、订单提交、订单支付

次要服务:辅助性的服务,售后服务、退货退款、发票服务、报表统计

对于核心服务是要保障三高的,它影响的是全局;

对于重要服务是要保障领域独立存活的,影响最小化,即使支付服务挂了,也不能影响 商品查询和订单提交等服务;

次要服务在遇到故障或资源紧张的情况下是可以降低资源投入或者临时关闭的;

三、总结

1、以服务的“高内聚,低耦合,兼顾职责单一,代码复用率高”为指导原则;

2、可以参考DDD领域驱动设计的方法论;

3、服务的拆分影响因素很多,包括团队技术水平、业务水平、人为因素、部门斗争、康威定律;

4、不要死搬教条,要不断地思考、改进重构、及时修正错误 才能达到一个相对理想的效果;

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

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

相关文章

Linux常用命令——gcc命令

在线Linux命令查询工具 gcc 基于C/C的编译器 补充说明 gcc命令使用GNU推出的基于C/C的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC…

Linux---上传和下载、压缩和解压

1. 上传下载 可以通过FinalShell工具,方便的和虚拟机进行数据交换。 在FinalShell软件的下方窗体中,提供了Linux的文件系统视图,可以方便的: 浏览文件系统,找到合适的文件,右键点击下载,即可…

STL中set与map介绍

目录 一. 键值对1. 关联式容器2. pair3. 应用场景 二. set1. set的介绍2. set的使用3. multiset的介绍 三. map1. map的介绍2. map的使用3. multimap的介绍 一. 键值对 ​ 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value。key代表键…

Draw.io 高阶用法

drawio是一款非常不错画流程图的软件,而且是免费的,但大部分图形以2D为主,有时候 却需要一些3D效果来增强方案 举个例子: 需要变成这样,看起来更3D 方法: 先拖入一个圆形,把限制比例去掉&a…

【C数据结构】队列_Queue

目录 队列_Queue 【1】队列的概念及结构 【2】节点队列的实现 【2.1】队列的各个接口 【2.2】队列的初始化 【2.3】队列栈的释放 【2.4】队尾入队列 【2.5】队头出队列 【2.6】获取队列头部元素 【2.7】获取队列尾部元素 【2.8】获取队列中有效元素个数 【2.9】检测…

图像 检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点(arXiv 2019) 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A:模型…

Nginx安装Windows、Linux | 正向代理、反向代理、负载均衡

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Nginx Nginx是一个高性能的HTTP和反向代理服务器,也可用作电子邮件代理服务器和通用TCP/UDP代理服务器。它是一个轻量级的Web服务器,可以作为静…

[进阶]Java:线程概述、线程创建方式

什么是线程? 线程(thread)是一个程序内部的一条执行路径。我们之前启动程序执行后,main方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径,那么这个程序就是单线程的程序。 多线程是什么? 多线程是指从软硬件上…

【现代数据架构】面向初创公司的现代数据堆栈

“为工作使用正确的工具!” 这句话一开始听起来很简单,但在实际方面实施起来却非常复杂。早期的初创公司发现很难选择生态系统中可用的各种工具,因为它们的数据将如何演变是非常不可预测的。 需要现代数据堆栈 在过去 10 年中,软件…

c++11 标准模板(STL)(std::basic_ios)(四)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容 VMware 支持的 OpenStack 发行版&#xff1a;在 VMware 虚拟化技术之上运行企业级 OpenStack 云 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vio-7/&#xff0c;查看最新版。原创…

极易搭建的代码托管平台Gitea

这礼拜有点霉啊&#xff0c;先是日常自用的机器上&#xff0c;SSD 挂了&#xff0c;彻底识别不了的那种 隔了两天&#xff0c;用来写文章用的小机器上&#xff0c; 500G 的机械硬盘也挂了&#xff0c;重新格了一下&#xff0c;挂在玩客云上当个下载盘用吧 好在都有备份&#xf…

[进阶]Java:文件字节输出流、文件拷贝、资源释放

文件字节输出流&#xff08;FileOutputStream&#xff09;写数据出去的API 流的关闭和刷新 代码演示如下&#xff1a; ​​​​​​​ public class OutputStreamDemo04 {public static void main(String[] args) throws Exception {//1.创建一个文件字节输出流管道与目标文件…

WPF开发txt阅读器14:通过C#代码设计UI布局

文章目录 需求分析C#代码UI设计 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进快退&#x1f48…

ad18学习笔记六:ad18官方在线文档

这个挺有用&#xff0c;反正我是没找到离线的、完整的、详细的软件说明文档&#xff0c;只有去官网看在线的&#xff0c;有点卡&#xff0c;还是全英文的。 具体的位置直接进官网&#xff0c;比如这个&#xff1a; Board Region | Altium Designer 18.0 User Manual | Docume…

BOSHIDA AC DC电源模块在光纤通信设备的应用

BOSHIDA AC DC电源模块在光纤通信设备的应用 随着科技的不断发展&#xff0c;光纤通信技术逐渐成为人们日常生活和工作中广泛采用的一项技术。在光纤通信设/备中&#xff0c;稳定的电源模块是其正常运转的关键。AC DC电源模块在光纤通信设/备的应用也越来越广泛。 AC DC电源模…

清华青年AI自强作业hw3_1:用线性回归模型拟合MNIST手写数字分类

清华青年AI自强作业hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 实现过程思路分析逻辑回归二分类模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 初步体验Tensorflow编程环境体会用回归模…

HDLBits自学笔记2:Verilog language.Vector

Vectors 建立一个电路&#xff0c;有一个3bit输入&#xff0c;输出这个向量&#xff0c;并将其分割为三个单独的1bit信号输出&#xff0c;电路图如下&#xff1a; module top_module ( input wire [2:0] vec,output wire [2:0] outv,output wire o2,output wire o1,output wir…

【30天熟悉Go语言】8 Go流程控制之循环结构for range、goto、break、continue

文章目录 一、前言二、for循环1、语法1&#xff09;和Java的for循环一样2&#xff09;和Java的while一样3&#xff09;和Java的for(;;)一样 2、for语句执行过程 三、for range1、语法1&#xff09;遍历key、value只遍历value 2&#xff09;遍历key 四、关键字1、break1&#xf…

【Rust日报】2023-06-18 2023第三届中国Rust开发者大会圆满结束

2023第三届中国Rust开发者大会 发布 Mailtutan v0.3.0 - 用于测试和开发环境的 SMTP 服务器 变更日志&#xff1a; 添加数据修剪支持添加邮件目录存储向 API 添加删除消息添加 TLS 支持添加 SMTP 普通身份验证支持 github: https://github.com/mailtutan/mailtutan/ Kani 0.30.…