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

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

微服务划分模式


虽然服务是逐步被拆分出来的,随着业务的演进,在某一时刻,可能需要我们重新审视服务划分得是否合理。本节向大家推荐两种服务划分的方法,首先介绍如何选择服务划分的方法。


基于业务复杂度选择服务划分方法


根据业务复杂度划分服务,如图2-4所示。当业务复杂度足够高的时候,应该基于领域驱动划分服务,而领域驱动本身足够复杂,很多概念比较抽象,应用范围并不是特别广泛,所以当业务复杂度较低时,可以选择基于数据驱动划分服务。数据驱动更容易理解和上手。也就是说,除非业务复杂度非常高,否则应该优先以数据驱动划分服务。这里的业务复杂度专指业务逻辑,而非数据量、并发量等相关复杂度。




image.png


做出选择的时候,还有一个参考指标是,团队以前是否已经基于领域驱动开发业务。也就是,如果产品已经基于领域驱动开发了一段时间,团队具备了领域驱动开发的能力,那么推荐继续选择领域驱动划分服务。如果是一个全新的产品,可以灵活选择。


选择服务划分方法时要重点考虑如下条件


· 业务复杂度



· 团队对领域驱动的熟悉程度


基于数据驱动划分服务


数据驱动是一个自下而上的架构设计方法,数据驱动强调的是数据结构,也就是通过分析需求,确定整体数据结构,根据表之间的关系划分服务。


通常基于数据驱动划分服务步骤如下。


1)需求分析。通过领域专家(或者产品经理)确定目标然后总结User Story,确定核心的业务流程;通过工具呈现比较粗糙的界面进行内部讨论;不断迭代此环节直到满意为止。


2)抽象数据结构。根据需求总结Use Case协助分析需求,从中抽象数据结构。


3)划分服务。分析数据结构,识别服务——服务应该满足高内聚、低耦合单一职责特征。


4)确定服务调用关系先分析出主要流程,根据请求需要调用的服务确定服务调用关系。如果存在问题,则需要回到(1)重新开始。


5)业务流程验证。重新回到User Story,以服务为粒度实现时序图,注意此阶段重点是验证服务划分是否合适,要关注如下问题。


· 一次更新操作如果要跨越更多服务,那么一致性的要求是什么


· 跨服务查询,是否要做关联查询,一个服务内是否能解决问题


· 性能是否能满足要求


· 成本是否满足要求


6)持续优化


基于领域驱动划分服务


领域驱动是一个自上而下的架构设计方法,通过和领域专家建立统一的语言,不断交流,确定关键业务场景,逐步确定边界上下文。领域驱动更强调业务实现效果,认为自下而上的设计可能会导致技术人员不能更好地理解业务方向,进而偏离业务目标。

通常基于领域驱动划分服务步骤如下。


1)通过模型领域专家建立统一语言。建立统一语言是为了更深入地理解需求。通用语言尽量以业务语言为主而非技术语言通用语言和代码一样,需要不断重构


2)业务分析。确定核心的业务流程然后逐步扩展到全部。最好通过工具呈现比较粗糙的界面供内部讨论。


3)寻找聚合。显式地定义领域模型的边界。最近比较热门的事件风暴,是一种基于领域驱动分析业务、划分服务的方法。


事件风暴就是把所有的关键参与者都召集到一个很宽敞的屋子里来开会,并且使用便利贴来描述系统中发生的事情,如图2-5所示。

 


image.png


· 用桔黄色的便利贴代表领域事件,在上面用一句话描述曾经发生过什么事情。


· 用蓝色的便利贴代表命令。命令的发起者可能是人,也可能是注入系统中的外部事件,或者定时器等。


· 用黄色的便利贴代表聚合。聚合是一组相关领域对象的集合,高内聚、低耦合是其基本要求,聚合内还要保证数据一致性。


4)确定服务调用关系。先分析出主要流程,根据一次请求需要调用的服务来确定服务调用关系。如果存在水平划分,则需要根据服务依赖原则确定关系。如果存在问题,则需要回到(1)重新开始。


5)业务流程验证。以服务为粒度实现时序图,注意此阶段重点是要验证服务划分是否合适,要关注如下问题


· 一次更新操作如果要跨越更多服务,那么一致性的要求是什么


· 跨服务查询,是否要做关联查询,一个服务内是否能解决问题


· 性能是否能满足要求


· 成本是否满足要求


6)持续优化

从已有单体架构中逐步划分服务


在大多数场景下,并非开始阶段就采用微服务架构,而是随着业务不断发展,从最初的单体架构中逐步拆分服务。下面描述了一个单体架构逐步拆分的步骤。


1)所有微服务成功的故事都是从一个单体架构太大,需要被拆散开始的,如图2-6所示。我们应该从单体架构开始,当系统规模足够大、团队人数足够多时,再逐步拆分服务,通常前后端分离是拆分的第一步。


image.png


4)当业务越来越复杂的时候,API Gateway做了太多的事情,会成为一个瓶颈点,服务之间的依赖关系也会变得越来越复杂,此时,需要适当地进行水平切分,如图2-8所示。


image.png

相关文章
|
26天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
2月前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
75 2
|
2月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
97 2
|
4月前
|
存储 消息中间件 Apache
比较微服务中的分布式事务模式
比较微服务中的分布式事务模式
76 2
|
1月前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
46 3
|
5月前
|
负载均衡 应用服务中间件 API
探索微服务架构中的API网关模式
在现代软件开发中,微服务架构已经成为一种流行的设计模式。它通过将复杂的应用程序分解为一组小的、松耦合的服务来简化开发和部署。然而,随着服务数量的增加,如何有效地管理这些服务之间的通信成为了一个挑战。API网关作为微服务架构的关键组件,提供了一个集中式的入口,用于处理客户端请求并将其路由到相应的服务。本文将深入探讨API网关的作用、实现方式以及如何在微服务架构中有效地利用它来优化系统性能和安全性。
55 0
|
1月前
|
存储 缓存 监控
探索微服务架构中的API网关模式
探索微服务架构中的API网关模式
48 2
|
3月前
|
JSON 监控 安全
探索微服务架构中的API网关模式
【9月更文挑战第22天】在微服务架构的海洋中,API网关如同一位智慧的守门人,不仅管理着服务的进出,还维护着整个系统的秩序。本文将带你一探究竟,看看这位守门人是如何工作的,以及它为何成为现代云原生应用不可或缺的一部分。从流量控制到安全防护,再到服务聚合,我们将一起解锁API网关的秘密。
|
4月前
|
分布式计算 负载均衡 API
微服务架构设计原则与模式
【8月更文第29天】随着云计算和分布式计算的发展,微服务架构已成为构建大型复杂应用的一种流行方式。这种架构模式将单个应用程序分解成一组小型、独立的服务,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。本文将探讨微服务架构的基本设计原则、常用模式以及如何有效地划分服务边界。
397 3
|
4月前
|
负载均衡 前端开发 API
我希望在系统设计面试之前知道的 12 种微服务模式
我希望在系统设计面试之前知道的 12 种微服务模式