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

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.mfbz.cn/a/31902.html

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

相关文章

端午作业1

只要文件存在,就会有唯一对应的inode号,且相应的会存在一个struct inode结构体。在应用层通过open()打开一个设备文件,会对应产生一个inode号,通过inode号可以找到文件的inode结构体 根据inode结构体中文件…

JMU20 软件工程经济学 复习总结

文章目录 碎碎念0. 基准收益率 i1. 现金流量图2. 净现值 NPV,内部收益率 IRR3. 单利,复利计算4. 等额年金NAV5. 动态回收期 P t ′ P_t Pt′​6. 固定资产折旧 [书P44]7. 增值税8. 软件行业增值税的即征即退9. 利息备付率 ICR,偿债备付率 DSC…

C语言学习(二十六)---指针练习题(二)

在上节的内容中,我们进一步学习了有关指针的内容,并做了一些关于指针的题目,今天我们将继续练习一些指针的题目,以便大家更好的理解和掌握指针的知识,好了,话不多说,开整!&#xff0…

GreasyFork+Github

GreasyForkGithub 好长时间没用 GreasyFork 了,最近在刷 Spring Boot 的各种知识点,其中很大时间都在学习 baeldung.com 这个站点。不知道是因为最近刷的勤了还是怎么的,这个网站经常会弹出一个“让我关闭广告阻拦插件”的提示框&#xff0c…

MongoDB集群管理(三)

MongoDB集群管理 集群介绍 为什么使用集群 随着业务数据和并发量的增加,若只使用一台MongoDB服务器,存在着断电和数据风险的问题,故采用Mongodb复制集的方式,来提高项目的高可用、安全性等性能。 MongoDB复制是将数据同步到多个…

超简单 display:flex教学

display 弹性盒子解释 Flex是Flexible Box的缩写,意为"弹性布局”,用来为盒状模型提供最大的灵活性。 它的作用: 它能够更加高效方便的控制元素的对齐、排列。 可以自动计算布局内元素的尺寸,无论这个元素的尺寸是固定的还是…

学习mysql

Mysql SQL语言的规则与规范SQL大小写规范注释数据导入指令 基本的SELECT语句SELECT.列的别名去掉重复行空值参与运算着重号(当有表名是关键字时)显示表结构where 运算符算术运算符 比较运算符号性运算符非符号形运算符空运算符非空运算符最小值运算符最大值运算符BETWEEN AND运…

Java的理论知识部分

文章目录 前言 一、Java的发展 1.1、Java的出现 1.2、Java官方网址 1.3、Java的平台 1.4、Java各版本新加的内容 1.5、java特点 1.6、Java的三种运行机制 1.7、Java的编译与运行 1.8、补充内容——华为鲲鹏jdk以及鲲鹏计算 二、面向对象程序编程 2.1、对象与类 2.2、Ja…

软考:软件工程:面向对象技术与UML,时序图,用例图,类对象,封装,继承,多态

软考:软件工程: 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1&#…

Web3 将 MetaMask添加入谷歌浏览器 扩展程序中

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 MetaMask是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理数据资产的 MetaMask 是以一个浏览器插件形式存在的 它可以直接连接到以太坊的网络中来管理我们…

【软件工程】软件工程期末考试试卷

瀑布模型把软件生命周期划分为八个阶段:问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段:计划阶段、开发阶段和( C)。 A、详细计划 B、可行性分析 C、 运行阶段 D、 测试与排…

【运维】服务器系统安装 -- 服务器版

目录 一、环境 二、ubuntu 三、启动u盘制作 Stage 1:下载balena,制作U盘启动工具 Stage 2:下载Ubuntu 系统镜像(参考上一节:Ubuntu 22.04.2 LTS ) Stage 3:将镜像写入到U盘 四、设置开启…

【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标&#x…

腾讯云服务器镜像市场快速搭建WordPress博客网站教程

通过腾讯云服务器的镜像市场搭建WordPress网站非常简单,不需要手动配置WP所需的Web环境,一键即可安装WordPress博客,腾讯云百科使用腾讯云服务器通过镜像市场的WordPress镜像搭建WP网站教程: 目录 腾讯云服务器通过市场镜像安装…

计算机网络和Linux网络

计算机网络和Linux网络 计算机网络概论 什么是计算机网络 计算机网络(结构上) 由节点(主机、网络交换设备设备)、边(通信设备)、协议构成协议:对等层的实体在通讯过程中应该遵守的规则的集合&…

上位机与两台PLC之间无线以太网通信

本文以组态王和2台三菱FX5u PLC为例,介绍组态王与多台 PLC的无线以太网通信实现过程。在本方案中采用了三菱PLC无线通讯终端DTD419MB,作为实现无线通讯的硬件设备。 在这一无线以太网通讯系统的搭建中,用户无需更改网络参数和原有程序&#…

Docker-compose的使用

目录 Docker-compose 简介 docker-compose的安装 docker-compose.yaml文件说明 compose的常用命令 总结 Docker-compose 简介 Docker-compose 是用于定义和运行多容器的 Docker 应用程序的工具。可以使用YAML文件来配置应用程序的服务。(通俗讲是可以通过yml文…

【算法与数据结构】18、LeetCode四数之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题的解法借助了【算法与数据结构】15、LeetCode三数之和的算法思想。首先我们进行排序,然…

数仓工具Hive 概述

Hive Hive简介Hive架构HiveSQL语法不同之处建表语句查询语句 Hive查看执行计划Hive文件格式 Hive简介 Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 通过Hive可以将mapred…

JVM的内容

0、Java基础考点 1、谈谈你对Java的理解 平台无关性(一次编译,到处运行)GC(垃圾清理)语言特性(泛型、反射)面向对象(封装、继承、多态)类库异常处理 2、Java是如何实现平台无关性的(一处编译,到处运行) 编译时(语法和语义进行检测&#xf…
最新文章