买竞彩篮球彩票app

图片
欢迎光临北京软件和信息服务业协会官方网站
基于领域驱动设计(DDD)的微服务设计探索
发布日期:2024-05-08    来源:超图软件集团    分享到:

在信息化建设过程中,技术架构的演变是一个持续不断的过程。从早期的面向过程设计的单体架构,到面向对象设计的集中式架构,再到由集中式架构演进而来的分布式微服务架构,这个演进过程体现了业务需求不断增长和复杂性增加的趋势,同时也反映了技术的发展和成熟。

分布式微服务架构具有独立性、模块化、分布式、高度可配置、自动化、容错性和易于扩展等特点,能够更好地满足复杂业务场景的需求,更好地支持业务的灵活性和可扩展性,从而快速响应业务需求。因此,近年来微服务在各行各业的应用系统中得到了广泛应用。

微服务架构虽然具备诸多优点,但在实际应用中也存在诸多难点。例如,面对复杂的业务场景,如何将业务拆分为几个微服务?微服务的颗粒度如何界定?当新需求出现时,是新建一个微服务还是在原有服务上进行改造?这些问题都需要结合业务情况进行综合考量。这既是一个技术问题,也是一个业务问题。

为了更好地解决微服务设计的难点问题,我们引入领域驱动设计(DDD),以此来实现更合理的微服务设计。


什么是领域驱动?


领域驱动设计(Domain Driven Design,简称DDD)概念来源于2004年著名建模专家Eric Evans出版的书籍《领域驱动设计-软件核心复杂性应对之道》。其核心思想是通过建立统一语言进行高效沟通,通过业务抽象、划分领域和建立领域模型等一系列手段来控制软件复杂度的方法论,主要用来指导如何划分业务模块、定义业务领域模型及其交互、解耦业务系统。

领域驱动设计的目标

解决复杂性问题:DDD通过将业务领域划分为明确的模块和概念,简化复杂业务场景,通过建立一个明确的、可靠的领域模型,帮助我们更好地理解和应对业务领域的挑战,从而简化开发过程。

清晰的业务模型:DDD强调梳理业务流程和关键点,并将其映射到软件系统中的领域模型,建立一个明确的、统一的领域模型,帮助我们理解业务概念和规则,进而促进高效沟通,加强对业务需求的一致性理解。

迭代开发和增量交付:DDD鼓励采用增量开发和敏捷方法,通过迭代方式逐步完善和验证领域模型,强调与领域专家密切合作,通过快速迭代的方式逐步演化系统,以满足不断变化的业务需求。

技术和业务的融合:DDD鼓励技术人员和业务专家之间的紧密合作,通过共同理解和共享语言来构建一个有效的领域模型,试图消除技术术语和业务术语之间的隔阂,促进团队之间的有效沟通和协作。

高度可维护性:DDD 倡导使用清晰的领域模型来构建软件系统,这有助于提高系统的可维护性。通过将业务逻辑和状态封装在领域对象中,并使用聚合根等DDD模式,可以简化代码结构,降低耦合性,从而使系统更易于修改和扩展[1]。

领域驱动设计与微服务协作关系

微服务架构和DDD在设计维度上的目标是一致的,它们都致力于简化业务场景,提高系统的可维护性和可扩展性。

DDD建立业务领域模型,划分领域边界,建立通用语言的限界上下文,可以作为微服务设计的参考边界。

微服务强调业务层面的服务/功能复用,要求系统架构和业务保持一致,在技术架构上要求系统模块/服务之间充分解耦,可以灵活选择合适的技术架构,去中心化地治理技术和数据;DDD强调技术和业务的融合,通过领域模型构建领域服务,实现业务层面的服务/功能复用。

综合来看,领域驱动设计(DDD)可以帮助微服务架构在业务模型梳理、技术架构设计等方面提供有力的支撑。通过结合微服务架构和DDD的优势,我们可以构建出更加健壮、可维护的软件系统,更好地应对业务复杂性的挑战。如下图所示。

1715132908844.jpg

领域驱动设计与微服务协作关系图[2]


领域驱动设计探索


战略设计与战术设计

领域驱动设计包括战略设计与战术设计,战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文;战术设计则从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现。如下图所示,战略设计旨在建立领域模型,指导软件开发的代码架构和服务模型。

1715132925703.jpg

战略设计与战术设计关系图[3]


战略设计步骤

战略设计一般包含业务域划分、事件风暴、领域建模、领域对象及服务矩阵等环节。以房产交易市县一体化应用设计为例,房产交易业务涉及到交易双方、合同签订、云签、住房保障资格验证、不动产登记协同、税务协同、合同备案、合同打印、维修资金对接、资金监管协同等业务域,本文以其中的几个业务域(交易双方、合同签订、合同备案、合同打印、维修资金对接)为例,通过事件风暴建立领域模型,进一步划分领域逻辑和物理边界,建立领域对象及服务矩阵完成战略设计。

由于房产交易业务域基本明确,在事件风暴过程中裁剪了产品愿景分析,直接从场景分析开始。


场景分析

场景分析是一个发散的过程,根据不同角色的流程和场景分析,尽可能全面的梳理从前端操作到后端业务逻辑发生的所有操作、命令、领域事件以及外部依赖关系等信息,如:房产交易合同签订时需要采集买卖双方的基本信息,要查询核验房产信息,根据已有的合同模板进行合同创建、修改、保存等操作命令,同步与维修资金系统进行业务协同,这些操作都会产生领域事件,在此同步标记各对象的类型,包括命名、实体、领域事件等。

1715132951176.jpg

场景分析图

领域建模

领域建模是一个收敛的过程,包括以下操作:

1)根据场景分析中的操作集合定义领域实体在场景分析过程中分析这些相关的应由什么实体发起或产生,从而定义领域实体对象,并将这些操作与实体进行关联,如在本例子中,识别出人员信息、合同信息、维修金实体。

2)根据领域实体业务关联性,定义聚合将业务紧密相关的实体进行组合形成聚合,同时确定聚合中的聚合根、值对象和实体。经分析项目最终形成三个聚合:合同信息、人员信息、维修金记录。在合同信息聚合中有合同信息、房屋记录、审批记录、打印记录等,其中合同信息为聚合根,房屋记录、合同版本、审批记录、打印记录为值对象。

3)根据业务及语义边界等因素,定义限界上下文根据领域及语义边界等因素确定限界上下文,将同一个语义环境下的一个或者多个聚合放在一个限界上下文内。由于合同信息与人员信息两者业务关联紧密,共同完成合同签订功能,两者一起构成合同签订限界上下文,维修金记录聚合则单独形成维修金管理限界上下文。

4)微服务设计和拆分:理论上一个限界上下文可以设计为一个微服务,但还需要根据总体业务需求综合考虑多种外部因素,如:职责单一性、性能差异、版本发布频率、团队沟通效率和技术异构等要素。

综合以上步骤,过程如下图所示:

1715132967755.jpg

事件风暴过程图


领域对象及服务矩阵

将事件风暴中产出的领域对象按照各自所在的微服务进行分类,确定实体、方法、服务等领域对象在微服务分层架构中的位置以及各对象之间的依赖关系,形成服务矩阵。

确定好各领域对象的属性后,按照代码模型设计各个领域对象在代码模型中的代码对象(包括代码对象所在的:包名、类名和方法名),建立领域对象与代码对象的一一映射关系。

领域模型及服务架构

根据领域模型中领域对象属性以及服务矩阵,设计领域对象及服务架构视图,用于体现微服务内实体、聚合之间的关系,各层服务之间的依赖关系以及应用层服务组合和编排的关系,微服务之间的服务调用以及事件驱动的前后处理逻辑关系。


战术设计步骤

战术设计关注的是基于战略设计的成果,设计某个子系统里代码如何实现,包括代码模型设计、详细设计、代码开发、测试和发布等环节,在此重点说明在领域驱动设计下代码架构的设计,如下图所示:

1715132985149.jpg

代码架构图


展示层

展现层负责向用户显示信息和解释用户指令。


接口层

接口层是所有流量的请求入口,负责接收请求参数,并根据业务请求将参数传递给应用层,并将应用层返回的结果再根据用户的需要进行组装,并最终返回给用户(如H5/APP、MQ、API等)。


应用层

应用层包含应用服务(由业务层自实现的操作,对外提供粗粒度服务),领域事件服务(领域事件的发布与订阅、消息队列实现异步数据传输实现服务解耦)。主要职能是协调领域层内多个聚合完成服务的组合和编排,协作完成业务操作;也是微服务之间交互的通道,可以调用其它微服务的应用服务,完成微服务之间的服务组合和编排。


领域层

领域层封装了核心的业务逻辑,负责表达业务概念、业务状态信息以及业务规则,包含聚合(聚合根)、实体映射、值对象、领域服务、领域事件等领域模型中的领域对象。领域模型内实体自身的行为在实体类内部实现,向上封装成领域服务暴露给上层应用。

基础层

基础层是贯穿除领域层外所有层,为各层提供通用的技术能力,包括:为应用层传递消息、提供API管理,为领域层提供数据库持久化机制,还能通过技术框架来支持各层之间的交互。


至此,基于领域驱动设计思想以房产交易市县一体化应用为例,通过事件风暴识别了房产交易合同签订整个过程的实体以及关系,通过实体聚合分析,识别领域模型的限界上下文边界,进而划分领域逻辑和物理边界,实现微服务初步拆分;同时建立领域对象及服务矩阵和服务架构,定义了代码结构模型,进而指导研发团队进行应用的详细设计和开发。在整个设计过程中,领域驱动设计(DDD)给我们带来诸多帮助:

1. 从业务梳理到技术实现,设计思路更加清晰;形成了可以指导代码开发的设计规范,使得设计过程更加规范;

2.帮助我们更清晰的梳理和理解业务模型,特别是针对复杂的业务场景,使得业务边界更清晰;

3.帮助我们更合理的划分业务领域,形成统一语言的领域模型,划分了领域逻辑和物理边界,指导微服务的拆分;

4.梳理各个实体、方法、服务在微服务分层架构中的位置和关系,建立了详细的服务矩阵,便于进行系统详细设计;

5.指导明确实体、聚合之间的关系,微服务内的各层服务之间的依赖关系,以及微服务之间的服务调用关系,使得整体技术逻辑、数据逻辑更清晰。

综合来说,领域驱动设计是一套完整且系统的设计方法,能够解决微服务设计过程中诸多的难题,在实践过程中仍需要结合实际业务场景进一步探索和研究,以期更好帮助我们进行系统设计,更好地满足复杂业务场景设计要求,更好地支持业务的灵活性和可扩展性。

你知道你的Internet Explorer是过时了吗?

为了得到我们网站最好的体验效果,我们建议您升级到最新版本的Internet Explorer或选择另一个web浏览器.一个列表最流行的web浏览器在下面可以找到.