微服务该如何拆分?

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务的拆分一直是历史性的难题,行业内更是没有具体的拆分标准,拆分的好坏更多取决于拆分者的经验,并经过反复迭代,逐步优化、调整,以达到比较合适的划分。本文包括微服务的拆分时机、拆分原则、拆分方法,用于指导微服务的拆分工作,希望能够对大家有所启示。

微服务的拆分一直是历史性的难题,行业内更是没有具体的拆分标准,拆分的好坏更多取决于拆分者的经验,并经过反复迭代,逐步优化、调整,以达到比较合适的划分。


本文包括微服务的拆分时机、拆分原则、拆分方法,用于指导微服务的拆分工作,希望能够对大家有所启示。


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语言实现,甚至有的采用大数据技术架构。


对应这些存在技术异构的业务功能,可以考虑按照技术栈的边界进一步拆分。


你认为微服务怎么拆分更合理呢?欢迎一起讨论、交流! 

目录
相关文章
|
SQL JavaScript 前端开发
springboot-plus、简介、开源单体系统,系统拆分和微服务 下
springboot-plus、简介、开源单体系统,系统拆分和微服务 下
1437 0
springboot-plus、简介、开源单体系统,系统拆分和微服务  下
|
4月前
|
SQL 数据库 微服务
微服务03,最简单的Demo,我们每个服务不能重复开发相同业务,微服务数据独立,不要访问其他微服务的数据库,微服务的特点之一是提供不能功能的数据库互相分割,微服务需要根据业务模块拆分,做到单一职责,
微服务03,最简单的Demo,我们每个服务不能重复开发相同业务,微服务数据独立,不要访问其他微服务的数据库,微服务的特点之一是提供不能功能的数据库互相分割,微服务需要根据业务模块拆分,做到单一职责,
|
3月前
|
消息中间件 监控 Java
解锁Spring Cloud微服务架构的奥秘:深度剖析拆分原则,打造高内聚低耦合的业务创新引擎!
【8月更文挑战第3天】踏入微服务领域,Spring Cloud以丰富组件助力高效系统构建。微服务拆分需遵循原则确保系统高内聚低耦合且能适应变化。首要原则为单一职责,每个服务专注一个业务功能,降低复杂度并提高可维护性。其次,追求高内聚低耦合以减少服务间影响。围绕业务域拆分有助于保持逻辑清晰及团队协作。处理数据一致性问题时,考虑采用最终一致性模型。Spring Cloud提供Eureka、Zuul/Gateway、Sleuth和Config等工具支持服务发现、路由、跟踪及配置管理,共同构建灵活健壮的微服务架构。
75 2
|
3月前
|
敏捷开发 数据库 微服务
SpringCloud微服务拆分原则
SpringCloud微服务拆分原则
60 2
|
4月前
|
敏捷开发 运维 监控
微服务将大型应用拆分成小型自治服务,每个服务专注单一功能,独立部署。
【7月更文挑战第2天】微服务将大型应用拆分成小型自治服务,每个服务专注单一功能,独立部署。起源于对单体架构局限性的应对,它促进了敏捷开发、技术多样性及高可伸缩性。但同时也增加了系统复杂度、数据一致性和运维挑战。实施涉及服务划分、技术选型、CI/CD及监控。Netflix、Uber和Spotify的成功案例展示了微服务在应对高并发和快速迭代中的价值。尽管挑战重重,微服务仍是构建现代应用的关键。
134 2
|
4月前
|
监控 Java API
Java面试题:解释微服务架构的概念及其优缺点,讨论微服务拆分的原则。
Java面试题:解释微服务架构的概念及其优缺点,讨论微服务拆分的原则。
77 0
|
4月前
|
缓存 Devops 微服务
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
|
5月前
|
敏捷开发 缓存 算法
从数据闭环谈微服务拆分
从数据闭环谈微服务拆分
|
6月前
|
敏捷开发 运维 监控
【专栏】微服务架构,以敏捷、灵活著称,通过拆分大型应用为小型自治服务,简化开发运维
【4月更文挑战第27天】微服务架构,以敏捷、灵活著称,通过拆分大型应用为小型自治服务,简化开发运维。本文探讨其基本概念、起源,核心优势(如敏捷开发、高可伸缩性)及挑战(系统复杂度、数据一致性),并分享实施策略(服务划分、技术选型、CI/CD)与实践案例(Netflix、Uber、Spotify),展示微服务如何重塑软件开发,并成为未来复杂应用系统的基础。
137 1
|
运维 监控 安全
你知道微服务如何拆分,能解决哪些问题?
你知道微服务如何拆分,能解决哪些问题?
240 0