DDD 领域驱动设计落地实践系列:微服务拆分之道

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 在前面的两篇文章中,笔者给大家介绍了 DDD 核心思想、重要概念以及如何进行 DDD 进行微服务实践的大致过程,后续的文章中将逐渐深入 DDD 的实践细节,包括领域模型与代码模型的映射以及具体的微服务设计实例等。当下微服务盛行,微服务架构解决了单点系统的可用性问题、突破单节点服务的性能瓶颈同时提升了整个系统的稳定性。因此各大公司纷纷转向微服务架构,但是在实际的微服务拆分过程中也会遇到不少的问题。而 DDD 中的领域模型构建以及边界上下文的划分天然的和微服务划分有着异曲同工之妙,因此结合 DD 领域驱动设计来进行微服务拆分是一种比较好的微服务拆分方案。那么今天就和大家聊聊怎么进行微服务拆分。

引言

在前面的两篇文章中,笔者给大家介绍了 DDD 核心思想、重要概念以及如何进行 DDD 进行微服务实践的大致过程,后续的文章中将逐渐深入 DDD 的实践细节,包括领域模型与代码模型的映射以及具体的微服务设计实例等。当下微服务盛行,微服务架构解决了单点系统的可用性问题、突破单节点服务的性能瓶颈同时提升了整个系统的稳定性。因此各大公司纷纷转向微服务架构,但是在实际的微服务拆分过程中也会遇到不少的问题。而 DDD 中的领域模型构建以及边界上下文的划分天然的和微服务划分有着异曲同工之妙,因此结合 DD 领域驱动设计来进行微服务拆分是一种比较好的微服务拆分方案。那么今天就和大家聊聊怎么进行微服务拆分。

为什么要进行微服务拆分?

在进行微服务拆分之前,我们首先应该搞清楚为什么要进行微服务拆分?微服务拆分后会带来怎样的业务价值?在后期维护上面会不会比以前的维护成本更低?我想这些问题都是架构师在实现微服务拆分之前需要回答的问题。那么我们就来先看看单体应用在业务不断发展的过程中会遇到怎样的问题。

维护难

随着业务的不断发展,单体应用的功能越来越多,需求不断变化,修改不断进行,单个应用多团队维护就会出现各种团队协作问题,不知不觉中降低了产品的研发效能。而且由于各个业务模块杂糅在一起,一个需求过来后,到底改哪个团队来做,经常在开会的时候吵得脸红脖子粗,增加了时间以及沟通成本。

更新难

进行需求迭代的时候,也许只修改了某个模块的功能,但是每次发布都是一整个大的包进行发布,其中构建、发包的时间成本会随着应用的迭代逐渐增加,导致整个需求上线过程变更显得十分笨重,不利于进行团队规模的敏捷开发。

稳定难

由于单体应用故障隔离范围只是线程级别的,单体应用可能会由于某个模块的功能有问题而导致整个服务平台的不可用,因此平台稳定性方面显然不能满足经常变化的业务发展的需要。


鉴于上述问题,我们需要对大泥球似的单体大应用进行合理拆分,以便于适用业务的快速发展。微服务架构拆分之后,团队成员不用都围绕一个大泥球应用转了,根据拆分的不同的业务域,各自负责自己的业务域,维护起来相对来说更加方便。同事如果有需求迭代,没有功能修改的业务域可以不用发生变更,不需要进行重新部署,大大降低了修改变更导致的平台稳定性性问题。另外由于是微服务分布式架构,不再是单点应用,不再存在单点问题,性能方面也会有所提升。

微服务到底该怎么拆?

当我们想清楚为什么进行微服务拆分之后,团队 Boss 也同意进行微服务拆分了。于是我们准备撸起袖子加油干的时候,另外一个问题又挡在我们前面,微服务到底应该怎么拆呢?或者换句话说,我们应该按照怎样的标准来进行拆分呢?如果拆分的不好,逻辑混乱的微服务还不如逻辑清晰的单体应用。这时候天空飘来了三个大字—DDD。


DDD 的理论中提供了我们进行领域驱动设计的指导方针,对于我们进行微服务的拆分具备天然的指导意义。比如 DDD 指导我们首先要对当前系统平台的业务进行全面的分析,可以通过用例分析法、事件风暴法以及四色建模法来进行业务分析,使用统一的业务语言进行业务领域划分以及边界上下文的划定,当然在这个过程中还包含了领域模型的构建,在业务分析中找到对应的实体、值对象以及聚合根,从而形成聚合,将聚合划分到边界上下文中。后面我们就可以根据边界上下文来进行具体的微服务的划分了。


笔者在实践微服务拆分的过程中主要按照业务能力、通用能力两个维度来进行具体的拆分。接下来给大家详细说明下。

业务能力

所谓业务能力就是平台的具体实现的业务功能是什么,这就好比在电商业务中物流域我们按照业务可以划分为仓储、运输、配送、计费等业务领域。大的领域划分出来之后,我们可以用真实的业务流程来串联这些业务领域。当业务流程经过这些业务领域的时候,必定会触发一些领域事件,经历一些业务流程,那么在这个过程中我们就可以梳理出对应的实体、值对象以及聚合根,我们将具有紧密业务逻辑关系的实体以及值对象收敛在聚合根的周围,从而形成聚合。例如在仓储领域中就会涉及到入库、库内操作以及出库这三大流程,其中入库主要包括质检、收货以及上架。这其中涉及到的实体主要用入库单、货品、操作员等,其中入库单就是聚合根,通过它可以将货品、操作员等实体以及值对象聚合起来,形成入库聚合。

image.png

通用能力

这里的通用能力其实包含两个意思,对于微服务本身来说,通用能力就是将各个微服务都涉及到的通用能力进行抽象形成单独的微服务。但是对于整个业务平台来说,通用能力实际就是业务中台。

1、通用服务

所谓通用服务就是在各个微服务之间都会碰到的问题,比如说接口的鉴权、日志的监控和管理、服务状态的监控和管理以及服务幂等等分布式系统问题。因此,我们需要将这些微服务的通用服务进行统一的抽象,形成通用的基础服务,这样微服务本身只需要关注自身的业务,这些微服务通用的能力由单独的基础服务来进行实现就 OK 了。


2、业务中台

我们还是拿大家最熟悉的电商业务来举个栗子吧,电商的业务形态有很多种,就阿里巴巴来说,有淘宝、天猫、主打生鲜的盒马、天猫超市等等。不管上层的业务形态有怎样的变化,实际上他们都是有比较核心的业务域是通用的,比如用户、支付、仓储、物流等等。那么实际上这些通用的业务对于整个电商平台来说实际就是通用能力,因此我们需要将这些通用的公共的能力进行下沉,形成业务中台,实现企业级的通用业务能力复用。

image.png

微服务拆分原则

在进行微服务拆分的过程中,有几条笔者总结的原则大家可以参考下,在实操的时候如果没有原则来遵循,实际我们自己也没办法去评判微服务拆分的效果到底有没有达到我们的预期。

微服务拆分要把握度

如果在微服务拆分过程中发生过度拆分,就会导致微服务爆炸的情况。不可避免的增加软件系统的维护成本,同时由于拆分也会导致业务流程变长,原本一两个服务就完成的业务,拆分后需要在五六个甚至更多的微服务才能完成,增加了平台出现 Bug 的概率,不知不觉中降低了平台的稳定性。另外更多的微服务意味着需要更多的服务器资源,从而在无形中增加了业务成本。因此我们可以借助于 DDD 划分的边界上下文,防止微服务过度拆分情况的发生。

拆分过程逐步迭代

软件平台架构的演进过程必定会经历现有平台以及新架构平台先共存,后替代的过程。因此我们可以先从平台的非核心功能开始再到核心功能这样逐步拆分的方式进行迭代拆分,避免一上来就要大刀阔斧的进行微服务拆分以及架构调整,否则就会陷入旧平台不稳定而新平台又不完善的尴尬处境。

确保微服务高内聚低耦合

在进行微服务拆分之前,应该对平台进行完整的领域划分,建立合适的领域模型,确定好边界上下文,并以此作为微服务拆分的指导。将领域模型的稳定与不断变化的外部需求进行隔离,保证核心领域模型的稳定,避免领域模型之间的强依赖。从而达到实现微服务高内聚低耦合的目的。

总结

本文主要围绕微服务拆分在实践落地层面存在的问题进行了分析,并结合自身的事件经验,可以分别从业务能力维度以及通用能力维度两方面进行拆分,同时提出了微服务拆分的相关原则和建议。希望大家在自己的实际项目中进行微服务拆分落地的时候可以有所参考。

相关文章
|
14天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
15天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
3天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
23 5
|
7天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
5天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
7天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
8天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
10天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
10天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
33 2
|
12天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;