一. 架构模式演进
软件架构模式演进大体分为三个阶段。第一阶段是单机架构(两层架构),第二阶段是集中式架构(三层架构),第三阶段是分布式微服务架构(DDD分层架构)。
1.1 DDD设计
DDD设计包括战略设计和战术设计。
战略设计:主要从业务视角出发。建立业务领域模型,划分领域边界,建立通用语言的界限上下文,界限上下文可以作为微服务设计的参考边界。
战术设计:主要从技术视角出发。侧重领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现。
1.2 概念释义
1.2.1 领域
领域具体指一种特定的区域或范围。领域是用来确定范围的,范围即边界。领域用来限定业务范围与边界。
1.2.2 子域
领域可以进一步划分为子领域,即子域。每个子域对应一个更小的问题域或更小的业务范围。子域可以根据自身重要性和功能属性划分为三类子域,它们分别是:核心域、通用域、支撑域。
1.2.3 核心域
核心域是决定产品和业务核心竞争力的子域,它是业务成功的重要因素和核心竞争力。
1.2.4 通用域
通用域是可以被多个子域使用的通用功能子域。
1.2.5 支撑域
支撑域是一种必须的功能子域,但是它既不包括决定产品和业务核心竞争力功能,也不包括可以被多个子域使用的通用功能。
1.2.6 限界上下文
限界上下文用来确定语义所在的领域边界。为了避免同样的概念或语义在不同的上下文环境中产生歧义,DDD在战略设计上提出了“限界上下文”这个概念。
1.2.7 实体
实体以DO(领域对象)的形式存在,每个实体对象都有唯一的ID。实体上领域模型的一个重要对象,领域模型的实体是多个属性、操作或行为的载体。在事件风暴中,我们可以根据命令、操作或者事件,找出产生这些行为的业务实体对象,进而按照一定的业务规则将依存度高和业务关联紧密的多个实体对象和值对象进行聚类,形成聚合。
1.2.8 值对象
值对象相对实体来说会更加抽象一些。值对象的定义:通过对象属性值来识别的对象,它将多个相关属性组合为一个概念载体。在DDD中用来描述领域的特定方面,并且是一个没有标识符的对象,叫做值对象。也就是说,值对象描述了领域中的一件东西,这东西说不可变的,它将不同的相关属性组合成了一个概念整体。当度量和描述改变时,可以用另一个值对象进行替换。它可以和其他值对象进行相等性比较,且不会对协作对象造成副作用。简单来说,值对象的本质就是一个集,这个集合里面有什么呢?若干个用于描述目的、具有整体概念和不可修改的属性。那这个集合存在的意义又是什么?在领域建模的过程中,值对象可以保证属性归类的清晰和概念的完整性,避免属性零碎。
1.2.9 聚合
在DDD中,实体和值对象是很基础的领域对象。实体一般对应业务对象,它具有业务属性和业务行为。而值对象主要是属性集合,对实体的状态和特征进行描述。但实体和值对象都只是个体化的对象,他的行为表现出来的是个体的能力。领域内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来保证这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。
1.2.10 聚合根
聚合根也称为根实体,它不仅是实体,还是聚合的管理者。聚合之间通过聚合根ID进行关联饮用,如果需要访问其他的聚合实体,就要先访问聚合根,再导航到聚合内部的实体,外部对象不能访问聚合内的实体。
1.3 聚合、聚合根、实体和值对象特点
- 聚合的特点:高内聚,低耦合。它是领域模型中最底层的边界,可以作为拆分微服务的最小单位。
- 聚合根的特点:聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期。一个聚合只有一个聚合根,聚合根在聚合内对实体和值对象采用直接对象引用的方式进行组织和协调,聚合根与聚合根之间通过ID关联的方式实现聚合之间的协同。
- 实体的特点:有ID标识,通过ID判断相等性,ID在聚合内唯一即可。状态可变,它依附于聚合根,其生命周期由聚合根管理。实体一般会持久化,但与数据库持久化对象不一定是一对一的关系。实体可以引用聚合内的聚合根、实体和值对象。
- 值对象的特点:无ID,不可变,无生命周期,用完即扔。值对象之间通过属性值判断相等性。它的核心本质是值,是一组概念完整的属性组成的集合,用于描述实体的状态和特征。值对象尽量只引用值对象。