微服务该如何拆分?
微服务的拆分一直是历史性的难题,行业内更是没有具体的拆分标准,拆分的好坏更多取决于拆分者的经验,并经过反复迭代,逐步优化、调整,以达到比较合适的划分。
本文包括微服务的拆分时机、拆分原则、拆分方法,用于指导微服务的拆分工作,希望能够对大家有所启示。
1.拆分时机
微服务拆分绝非是一个大跃进的过程,拆分时机不对,很容易把一个应用拆分的七零八落,最终大大增加运维成本,却不会带来明显收益。
微服务拆分的过程,是基于某个痛点出发,是业务真正遇到快速迭代和高并发等问题,如果不拆分,将对于业务的发展带来影响,只有这个时候,微服务的拆分才是有确定收益的,增加的运维成本才是值得的。
1.1 有快速迭代的需求
互联网时代,业务快速变化,应用的交付需要快速响应式交付。通过微服务架构,采用快速迭代的方式进行架构演进,将系统拆分成多个独立的微服务,微服务之间彼此独立,通过服务接口交互。当某个微服务遇到问题时发版修复,不会导致整个系统不可用,从而支撑业务的快速试错。
1.2 提交代码频繁出现大量冲突
单体应用开发通常是几十人开发一个系统,代码管理时经常会遇到代码提交冲突。微服务架构通过快速迭代可实现开发独立,将系统拆分成不同的微服务,每个微服务对外提供接口,其他依赖服务不用关注具体的实现细节,只需保证接口正确即可。每几个人维护一个服务模块,降低代码冲突的概率,出现冲突时也可快速解决。
1.3 小功能要积累到大版本才能上线
传统模式单次上线的需求通常较多、风险较大,小功能的错误可能会导致大功能无法上线。因此每次上线都会带来较大的工作量。
微服务架构对于快速迭代可带来独立上线的效果。微服务拆分后,在服务接口稳定的情况下,不同的微服务可独立上线。上线的次数增多,单次上线的需求量变小,可随时回滚,风险变小,时间变短,影响面小,从而加快迭代速度。
1.4 解决高并发横向扩展问题
互联网时代,业务应用的高并发要求越来越高,单体应用虽然可以通过部署多份承载一定的并发量,但是会造成资源非常浪费。有的业务需要扩容,例如下单和支付,有的业务不需要扩容,例如注册。如果一起扩容,消耗的资源可能是拆分后的几倍。因此,对于并发量大的系统,选择微服务拆分是很有必要的。
2.拆分原则
-
单一职责原则: 每个微服务只需关心自己的业务规则,确保职责单一,避免职责交叉,耦合度过高将会造成代码修改重合,不利于后期维护。
-
服务自治原则: 每个微服务的开发,必须拥有开发、测试、运维、部署等整个过程,并且拥有自己独立的数据库等,可以完全把其当作一个单独的项目来做,而不牵扯到其他无关业务。
-
轻量级通信原则: 微服务间需通过轻量级通信机制进行交互。首先是体量较轻,其次是需要支持跨平台、跨语言的通信协议,再次是需要具备操作性强、易于测试等能力,如:REST 通信协议。
-
接口明确原则: 明确接口要实现的内容,避免接口依赖,如 A 接口的改动会导致 B 接口的改动。
-
持续演进原则: 单体架构向微服务架构拆分过程中,无法做到一蹴而就,刚开始不建议拆分太小,过度拆分将会带来架构复杂度的急剧升高,开发、测试、运维等环节很难快速适应,将会导致故障率大幅增加,可用性降低,非必要情况,应逐步拆分细化,持续演进,避免微服务数量的瞬间爆炸性增长。
3.拆分方法
微服务的拆分应遵循上述拆分时机、拆分原则,并选择合适的拆分方法,逐步拆分。在实际拆分过程中,除了要遵循拆分原则,还要从实际业务领域出发,并结合考虑非业务的因素,比如需求变更的频率、高性能、安全性、团队规模以及技术异构等因素。这些非业务因素对于最终落地也会起到决定性的作用,因此在微服务拆分时需要重点关注。
3.1 业务领域拆分
基于领域模型,围绕业务界限上下文边界,将同类业务划归为一个微服务,按单一职责原则、功能完整性进行微服务的拆分。
3.2 需求变化频率
需要识别业务需求的变动频率,考虑业务变化频率与相关度,将业务需求变动较高和功能相对稳定的业务进一步分离拆分。
因为需求的经常性变动必然会导致代码的频繁修改和版本发布,这种拆分可以有效降低频繁发布版本的业务对不需要经常发布版本的业务的影响。
3.3 服务性能要求
需要识别性能压力较大的业务。因为对性能指标要求高的业务在资源需求上会比其他业务的高,这样可能会拖累其他业务,也会造成资源无谓的浪费。为了降低对系统整体性能和资源要求的影响,我们将对性能方面有较高要求的业务与对性能要求不高的业务进一步拆分。
3.4 组织架构和团队规模
除非有意识地优化组织架构,否则微服务的拆分应尽量避免对组织架构和团队的调整,避免由于功能的重新划分,而增加大量且不必要的团队之间的沟通成本。
在进行微服务拆分和组建项目团队时,应尽量将沟通边界控制在团队内。
3.5 安全边界
对于有特殊安全要求的业务,应独立出来,避免因不同的安全要求,而带来不必要的成本,或带来泄密的风险。
3.6 技术异构
虽然都是在同一个业务领域内,但由于各种条件的限制,在技术实现时可能会存在较大的差异(存在技术异构的问题)。
大部分都是采用 Java 语言实现,但由于业务场景或者技术条件的限制,有的可能需要采用 Go 语言实现,甚至有的采用大数据技术架构。
对应这些存在技术异构的业务功能,可以考虑按照技术栈的边界进一步拆分。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
RosaeNLG 加入 LF AI & Data 作为新的沙箱项目
LF AI & Data 基金会——该组织正在构建一个生态系统,以维持人工智能(AI)、机器学习(ML)、深度学习(DL)和数据开源项目的开源创新,宣布RosaeNLG[1]作为其第一个沙箱项目加入基金会。 最近,LF AI & Data 技术咨询委员会(TAC)增加了沙箱阶段,以适应满足以下一个或多个需求的早期项目: 任何未来有意加入 LF AI & Data 孵化的项目,并希望为此奠定基础。 旨在扩展一个或多个 LF AI & Data 项目具有功能性或互操作性库的新项目。 适合 LF AI & Data 任务的独立项目,为现有功能领域提供了一种新的方法(或试图满足未满足的需求)。 RosaeNLG 非常适合这个阶段,并被 TAC 投票进入了沙箱阶段进行孵化。它是一个开源的自然语言生成(NLG)项目,旨在提供与产品 NLG 解决方案相同的 NLG 功能,并为开发人员和 IT 提供方便的集成和配置。RosaeNLG 由法国巴黎银行 CIB 数据与人工智能实验室首席技术官、科技学院专家教授 Ludan Stoecklé 发布并开源。 LF AI ...
- 下一篇
常用动态路由协议之OSPF基础篇常用动态路由协议之OSPF基础篇
根据上篇文章,我们认识了动态路由的中RIP协议和IS-IS两种协议,这次我们来简单认识下动态路由协议的第三种OSPF。 OSPF(开放式最短路径优先) 在自治系统(AS)中,OSPF与RIP和IS-IS一样,都属于内部网关协议(IGP)中的其中一种。 OSPF的工作过程 建立邻居关系,通过学习链路状态信息形成链路状态数据库,根据Dijkstra算法算出最短路径树,最后形成路由表。 OSPF区域定义 OSPF在AS内可以划分多个区域,每个OSPF路由器只能维护所在区域的完整链路状态信息。 区域也分为骨干区(area0)和非骨干区(除area0以外的其他区域) Router ID是OSPF区域内唯一标识路由器IP地址,优先选取loopback接口ip地址,然后在选取物理接口最大的ip地址。 OSPF的DR和BDR的选举方法 先比优先级(优先级为0则不参与选举),再比Router ID(越大越优) 第一大的为DR,第二大的为BDR OSPF的组播地址 224.0.0.5 224.0.0.6 OSPF网络类型 点到点网络 广播多路访问网络 非广播多路访问网络 点到多点网络 O...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果