领域驱动设计(DDD)和微服务拆分

DDD 全称 Domain-Driven Design(领域驱动设计),是一套应对复杂软件系统分析和设计的面向对象建模方法论。

高内聚,低耦合。
有 DDD 的指导,加上微服务的事件,才是完美的架构。(因为微服务的侧重点是治理,而不是拆分。)

聚合

聚合是一个或多个实体的集合,也可能包含值对象。
集合的父实体被称为聚合根(Aggregate Root)。

值对象

值对象与实体的区别在于值对象是不可变的,并且没有唯一的标识,仅由其属性的值所定义。

实体

实体是具有惟一标识符的潜在可变对象,在其域模型中有自己的生命周期,能够获得该实体完整状态转换历史。

例如,在电子商务领域,可以定义一个命名为 Order 的聚合,包含 Address(值对象)和 Consumer(实体)。

设计领域模型的一般步骤

  1. 根据需求划分出初步的领域和限界上下文,以及上下文之间的关系;
  2. 进一步分析每个上下文内部,识别出哪些是实体,哪些是值对象;
  3. 对实体、值对象进行关联和聚合,划分出聚合的范畴和聚合根;
  4. 为聚合根设计仓储,并思考实体或值对象的创建方式;
  5. 在工程中实践领域模型,并在实践中检验模型的合理性,倒推模型中不足的地方并重构。

模式举例

1. 贫血模型

Domain Object 包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到 Service 层。

2. 充血模型

将绝大多数业务逻辑放到 Domain 中,Service 是很薄的一层,封装少量业务逻辑,并且不和 DAO 打交道。