微服务划分的模式与反模式(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 微服务划分的模式与反模式(下)

微服务拆分策略


当不断从单体架构中抽象服务的时候,哪些服务优先被拆分,哪些服务不需要被拆分?以下几个策略可以帮助解决拆分中的这些问题


· 比较独立的新业务优先采用微服务架构。从成本角度考虑,新业务采用新的架构是最合理的,因为这样做业务的影响最小。


· 优先抽象通用服务。因为通常通用服务的边界比较明显,耦合度低,比较容易分离

· 优先抽象比较容易识别的边界比较明显的服务。如果原有包结构比较清晰,可以基于原有包结构中明显边界的、比较完整业务进行划分是从成本角度考虑。如果已经基于单体架构开发了一段时间,对业务的理解程度已经非常高,那么开发及架构人员能够比较容易提炼出一些边界比较明显的服务。


· 优先抽象核心服务。因为微服务的开发及运维成本比较高,并不是所有的地方都要划分很小的粒度。往往一些比较边缘的运营、管理的系统甚至不会考虑拆分另外随着时间的推移,有一些业务可能会发生改变,因此应该先抽象出核心服务


· 优先抽象具有独立属性的服务。应根据功能的变更频率、资源占用、技术栈属性划分服务


· 采用绞杀者模式,在遗留系统外围,随着时间的推移,让新的服务逐渐“绞杀”老的系统。在这种情况下,复杂度往往体现在如何灰度发布迁移数据以及如何保障服务不中断,后面的章节会详细描述

如何衡量服务划分合理


每个产品在实施微服务架构最初的动力都不一样,目标也有所区别,所以判断是否划分合理,首先要看是否达成了目标。其次,可以参考以下几衡量方式。每种衡量方式不能单独作为一个判断标准,需要综合考虑。


· 一个小功能的修改从需求到上线需要多长时间正常情况下的微服务架构交付周期应该是以天为单位的。如果一个功能的修改需要几周到几个月的时间,可能意味着服务划分粒度过大,存在太多的冲突,要等待合并代码


· 大多数功能修改是否可以在一个服务内完成?如果经常需要跨服务团队的联合开发组才完成一个功能的开发或者旧功能的修改,则说明服务分存在问题。


· 是否要频繁修改接口?频繁修改接口有可能是接口设计不合理导致,也有可能是服务划分的问题导致的,说明服务之间的边界并不是特别明确和稳定。


· 响应时间是否能满足要求?在某些追求极致性能的场景中,对响应时间要求较高,服务划分的层次太多、粒度太小都可能导致响应时间不能满足要求


· 是否存在大量的跨服务更新是否存在大量的跨服务的关联查询?出现这两个问题,可能是因为划分不合理


微服务划分反模式


前面我们介绍了如何划分服务,在此之上,我们希望通过微服务划分的反模式来帮助大家少走弯路。


根据代码行数划分服务


代码规模太大会导致沟通效率、交付效率低下,耦合度高,以及比较笨重。代码规模可以作为一个参考,但是不能作为一个绝对标准,微服务架构中存在一个“大服务”是很正常的。基于代码行数拆分服务很难衡量服务的完整性,容易导向更小的拆分粒度,引起不必要的复杂度。


划分粒度越小越好


服务的大小并不是特别重要,可以根据团队规模、代码规模、业务复杂度、技术领域重要程度、成本等因素综合考虑。关于服务粒度的大小,业界并没有统一标准,也很难衡量,最接近的衡量标准是研发团队规模。粒度小意味着更高的维护成本。后端管理辅助系统通常粒度较大


一次性划分服务


拆分服务有如下两种方式。


第一种,先拆分业务代码再拆分数据库。如图2-9所示,数据库并没有拆分,只是从单体中抽象出部分服务。


image.png


用第二种方式拆分服务时,根据服务将数据库彻底拆分为多个独立的数据库,每个服务独享数据库服务,服务之间只能通过接口调用。这看起来非常美好,但需要为此做大量的数据迁移。当业务处于初期,需求不是非常确定,开发人员对业务理解不是特别透彻的时候,可能拆分后发现拆分得并不合理,只能再进行合并,又要进行一次数据迁移。相对来说,业务代码拆分成本更低,而数据迁移的成本更高,频繁、大量的数据迁移并不可取。


更好的做法是把第一种方式作为过渡阶段,当业务逐步稳定后再彻底进行数据迁移。注意,处于过渡阶段时数据库并没有彻底分离,一切依赖都通过接口访问。但是这只是口头上的约定,对于业务开发人员直接在数据库中进行关联查询。需要通过Code Review的方式避免。


服务划分是一个长期的过程,需要积累大量的领域知识,以此来理解核心流程。最好是领域专家一起组成联合团队,理解核心问题的情况下,持续拆分服务并验证拆分合理性,随着时间的推移,可以重新划分可见,服务拆分是一个持续性的过程


服务划分一旦完成,不能改变


由于业务的不断变化,以及开发人员对领域知识其他影响因素的理解问题,很难一次性做出一个完美的解决方案通常划分后会发现某个问题是不可忍受的,例如划分导致响应时间降低,增加了更多的成本,有可能需要重新合并服务;由于业务的变化,原本的依赖关系发生了变化,有可能面临需要重新划分服务等类似的问题。


先实施组件化,再实施微服务架构


很多技术人员试图先通过组件化逐步过渡到微服务架构,是一种思路。微服务架构划分更强调业务领域的完整性,因此垂直划分优先,组件化往往通过抽象稳定的部分形成组件共享,调用次数和依赖关系并不强调。因此,组件化之后转化到微服务架构的方式通常是错误的 

相关文章
|
2月前
|
存储 消息中间件 Apache
比较微服务中的分布式事务模式
比较微服务中的分布式事务模式
57 2
|
3月前
|
负载均衡 应用服务中间件 API
探索微服务架构中的API网关模式
在现代软件开发中,微服务架构已经成为一种流行的设计模式。它通过将复杂的应用程序分解为一组小的、松耦合的服务来简化开发和部署。然而,随着服务数量的增加,如何有效地管理这些服务之间的通信成为了一个挑战。API网关作为微服务架构的关键组件,提供了一个集中式的入口,用于处理客户端请求并将其路由到相应的服务。本文将深入探讨API网关的作用、实现方式以及如何在微服务架构中有效地利用它来优化系统性能和安全性。
42 0
|
18天前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
2月前
|
分布式计算 负载均衡 API
微服务架构设计原则与模式
【8月更文第29天】随着云计算和分布式计算的发展,微服务架构已成为构建大型复杂应用的一种流行方式。这种架构模式将单个应用程序分解成一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。本文将探讨微服务架构的基本设计原则、常用模式以及如何有效地划分服务边界。
164 3
|
2月前
|
负载均衡 前端开发 API
我希望在系统设计面试之前知道的 12 种微服务模式
我希望在系统设计面试之前知道的 12 种微服务模式
|
2月前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
2月前
|
C# 微服务 Windows
模块化革命:揭秘WPF与微服务架构的完美融合——从单一职责原则到事件聚合器模式,构建高度解耦与可扩展的应用程序
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中借鉴微服务架构思想,实现模块化设计。通过将WPF应用分解为独立的功能模块,并利用事件聚合器实现模块间解耦通信,可以有效提升开发效率和系统可维护性。文中还提供了具体示例代码,展示了如何使用事件聚合器进行模块间通信,以及如何利用依赖注入进一步提高模块解耦程度。此方法不仅有助于简化复杂度,还能使应用更加灵活易扩展。
69 0
|
2月前
|
负载均衡 监控 JavaScript
探索微服务架构下的API网关模式
【8月更文挑战第31天】在微服务的大潮中,API网关不仅是流量的守门人,更是服务间通信的桥梁。本文将带你深入理解API网关的核心概念、设计要点及其在微服务架构中的重要作用,同时通过代码示例揭示如何利用API网关提升系统的灵活性与扩展性。
|
2月前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
在微服务架构的海洋中,API网关扮演着枢纽的角色。它不仅是客户端请求的接收者,也是各个微服务间通信的协调者。本文将深入探讨API网关的设计原则、实现策略以及它在微服务生态中的重要性。我们将通过实际案例分析,了解API网关如何优化系统性能、提高安全性和简化客户端与服务的交互。
43 4
|
3月前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的复杂网络中,API网关扮演着交通枢纽的角色,不仅简化了客户端与各微服务的交互,还提升了系统的安全性和可维护性。本文将深入探讨API网关的设计原则、核心功能以及在实际应用中的部署策略,旨在为后端开发者提供一套完整的API网关解决方案。