领域模型设计

领域模型设计

一、前言

现代微服务系统一般涉及的业务流程多,系统交互场景丰富,为了合理切分业务领域,恰当定义业务边界,并以此开发出“高内聚,低耦合”的代码,采用DDD(Domain-Driven Design)领域驱动设计思想就能很好地实现这个目标,根据业务领域合理分层软件架构,让系统拓展性更强,结构更清晰,更灵活,复用程度更高,轻松应对各种复杂的业务需求。

二、领域与对象

1.什么是对象
对象在面向对象定义之中,也规定了一些基本的特征:
(1)封装:保护内部的操作不被破坏;
(2)继承:在原本的基础之上继续进行扩充;
(3)多态:在一个指定的范围之内进行概念的转换。
2.什么是领域驱动设计
领域驱动设计(Domain-Driven Design 简称DDD),是一套综合软件系统分析和设计的面对对象建模方法,采用领域模型概念,统一分析和设计编程,使软件能够更加灵活快速地跟随需求变化。
领域驱动设计的核心在领域模型,领域模型的核心在业务知识。
3.什么是领域对象
领域对象(Domain Object)分为实体对象(也称聚合根)和值对象。
实体对象是具有生命周期、有唯一标识、可以通过唯一标识判断相等性、有增改删查操作、可记录状态的对象。
值对象是指起描述作用,无唯一标识、只能通过属性判断是否相等、即时创建、用完就回收的不可变对象。值对象必须通过实体对象进行操作。
4.领域模型中的实体类关系
领域模型的实体类分为视图对象VO(View Object)、数据传输对象DTO(Data Transfer Object)、领域对象DO(Domain Object)、持久化对象PO(Persistent Object)四种类型,各种实体用于不同业务层次之间的交互,并在各层次间实现转化,如下图所示:
在这里插入图片描述

5.对象和领域的关系
领域是更大的对象,是可以直接产生业务价值的模型,只包含多对象的行为整合,不包含对象的属性,从而实现领域的行为共享。
领域模型是对业务需求的一种抽象,表达了领域概念、领域规则以及领域概念之间的关系。一个好的领域模型是对统一语言的可视化表示,通过它可以减少需求沟通可能出现的歧义;通过提炼领域知识,并运用抽象的领域模型去表达,就可以达到对领域逻辑的化繁为简。模型是封装,实现了对业务细节的隐藏;模型是抽象,提取了领域知识的共同特征,保留了面对变化时能够良好拓展的可能性。
领域模型以可视化的方式清晰地表达了业务含义,我们可以根据这个模型来指导后面的程序设计与编码实现。当增加新的需求或者需求发生变化时,我们能够敏锐地捕捉到现有模型的不匹配之处,并对其进行更新。领域模型传递了知识,可以作为交流的载体,符合人们的心智模型,有利于让开发人员从纷繁复杂的业务中解脱出来。

在这里插入图片描述

三、复杂领域设计原则

1.拆分子域建立领域模型
根据业务特点考虑流程节点或功能模块边界因素,按领域逐级分解成大小合适的子域,针对子域进行事件风暴,记录领域对象,初步确定各级子域的领域模型。
2.领域模型微调
梳理领域内所有子域的领域模型,对各子域模型进行微调,这个过程重点考虑不同聚合对象的重新组合,同步需要考虑子域里对象的聚合边界、服务以及事件之间的依赖关系,确定最终的领域模型。
3.微服务设计和拆解
根据领域模型的边界和微服务的拆分原则,完成微服务的拆分和设计。

四、领域驱动设计和实施

1.步骤一、事件风暴
(1)场景分析
根据不同角色和场景,全面梳理从前端操作到后端业务逻辑之间发生的所有操作、命令、领域事件以及外部依赖信息。
(2)领域建模
领域建模是一个收敛的过程。过程分为三步:第一步根据场景分析中的操作集合定义领域实体;第二步根据领域实体业务关联性定义聚合;第三步根据业务和语义边界等因素,定义领域模型。
(3)微服务设计和拆分
综合考虑职责单一性、性能、版本发布频率、团队沟通效率、技术异构等因素,合理设计和拆分微服务。
2.步骤二、领域对象服务矩阵
将事件风暴产生的领域对象按照各自所在的微服务进行分类,定义每个领域对象在微服务中的层、领域类型和依赖的领域对象,主要是为了确定实体、方法、服务等领域对象在架构中的位置以及对象之间的依赖关系,形成服务矩阵,细化了领域对象之间的关系,补充了事件风暴过程中可能遗漏的细节。
3.步骤三、领域模型服务架构
根据领域模型中领域对象的属性和服务矩阵,设计符合领域模型的技术架构,架构要能清晰地体现微服务实体间的联系,各层级之间的关系,以及服务组合和编排的关系。
4.步骤四、代码模型设计
根据DDD技术架构设计,搭建微服务架构体系,定义各层的微服务工程,各层的领域对象所在的包、类、方法、接口,领域中一个聚合对应一个聚合包。

五、领域划分

领域是自上而下的划分,不仅需要在这些相关联的领域有着极其丰富的经验,脑海中有着清晰且成熟的领域模型图。
而自下而上,也就是本文所讲的,主要思想是从需求出发,划分出实体后,对实体进行归类,最终提炼出领域。
1)对需求进行充分分析,提炼通用语言,从通用语言中抽象出实体
我们首先对需求进行充分分析,提炼通用语言,从通用语言中抽象出实体。
2)按照职责相似度,对实体进行归类,抽象出领域
通过上面的步骤,我们得到了很多实体,然后按照职责的相似度对实体进行归类,相似度高的为一类,每一类给他们起一个名字,这就是领域。

六、逻辑架构设计

在这里插入图片描述
逻辑架构图主要分为业务层、领域层、数据持久层,其他微服务模块通过zuul网关区分不同业务标识对应的服务路由到业务层,然后业务层通过组合、编排领域层服务,实现业务流程,领域服务操作领域对象(聚合根)和值对象,实现领域对象的属性修改和一系列领域对象行为,调用基础设施层完成完成一系列基础服务和数据库原子操作,实现数据持久化。

七、DDD软件分层设计

1.分层概述
(1)业务层system-xxx-application:组合与编排各领域服务,实现业务流程。
(2)springcloud微服务接口jar包system-xxx-feignclient:暴露微服务领域接口。
(3)领域层system-xxx-domain:单领域服务实现。
(4)领域接口jar包 system-xxx-domain-api:定义领域对象和操作接口。
(5)基础设施层system-xxx-infrastructure:数据存储与处理。
(6)公共服务 system-domain-common-xxx:公共配置、工具类。
(7)system-domain-data-config:Spring容器扫描配置
2.分层结构图
总体上分为业务层、领域层、基础设施层,前端通过restful方式请求业务层,业务层通过Spring Cloud的FeignClient接口实现远程调用领域层的微服务,领域层通过自定义Spring容器扫描配置注入不同数据源的组件,从而实现多数据源的操作。
在这里插入图片描述

3.层级maven依赖关系
在这里插入图片描述

  • 28
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
领域模型设计在软件开发中扮演着至关重要的角色。特别是在DDD(领域驱动设计)领域中,领域模型是整个软件系统的核心。领域模型不仅仅是一个简单的类或接口的集合,更应该是从业务领域中提炼出的一种业务概念的实现。其主要目的是解决业务领域中的问题,为业务提供更好的支持。 在DDD领域模型设计中,Java代码实例表现得十分出色。在Java中,我们可以通过类、接口、枚举等方式来表示概念,并使用注解、泛型等语言特性更加准确的表示领域模型中的复杂概念和关系。 下面是一个简单的Java代码实例: ```java public class Order implements Entity<Order> { private Long id; private BigDecimal amount; private OrderStatus status; private Customer customer; @Override public boolean sameIdentityAs(Order other) { return other != null && id.equals(other.id); } public void confirm(){ if(status!=OrderStatus.NEW){ throw new IllegalStateException("Only new orders can be confirmed"); } status=OrderStatus.CONFIRMED; } public void cancel(){ if(status==OrderStatus.CANCELLED||status==OrderStatus.DELIVERED){ throw new IllegalStateException("Cancelled or delivered orders cannot be cancelled again"); } status=OrderStatus.CANCELLED; } } ``` 在上述代码中,我们定义了一个订单类Order,该类实现了Entity接口。Order类有一个id属性作为唯一标识,amount属性表示订单金额,status属性表示订单状态。除此之外,Order类还有一个Customer属性,表示订单所属的顾客。 在Order类中,我们还定义了两个方法confirm()和cancel(),分别表示确认订单和取消订单的操作。在这两个方法中,我们使用了状态模式,以保证订单状态的正确性。 此外,我们还实现了Entity接口,并实现了sameIdentityAs()方法,以用于实体对象之间的比较。 以上仅是一个简单的Java代码实例,实际中的领域模型可能更加复杂和抽象。为了设计出更好的领域模型,我们需要充分理解业务领域,进行好的领域分析并利用好Java语言的特性。通过好的领域模型设计可以有效的提高软件系统的可维护性、可扩展性和可重用性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值