设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD不是架构,而是一种架构ff0000">设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域...">

DDD理论与实践

1. 什么是DDD

DDD是一种处理高度复杂领域的<font color="#ff0000">设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD不是架构,而是一种架构<font color="#ff0000">设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。懂DDD模型设计的并不需要是一个专业的开发人员,而是需要一个领域专家,这个领域专家可以是产品、可以是资深的销售等等。

2. 为什么要DDD

可以利用DDD设计方法来建立领域模型,划分领域边界,再根据这些<span style="background:#fff88f">领域边界从业务视角来划分微服务边界。而按照DDD方法设计出的微服务的业务和应用边界都非常合理,可以很好地实现微服务内部和外部的「高内聚、低耦合」

  1. 统一团队成员术语,无论你是开发、测试、产品、解决方案等,避免沟通障碍。让文档更容易被理解,让代码的可读性更强。 => 输出件:名词解释表
  2. 抽象领域模型,聚焦核心业务,保护好业务的核心资产。让后期的代码改动尽可能远离核心领域。
  3. 指导我们更加合理地拆分微服务,划分软件实现边界——限界上下文

3. 战略设计和战术设计

  • 战略设计主要从业务视角出发 ,建立业务<span style="background:#fff88f">领域模型,划分<span style="background:#fff88f">领域边界,建立通用语言的<span style="background:#fff88f">限界上下文,限界上下文可以作为微服务设计的参考边界。
  • 战术设计则从技术视角出发 ,侧重于领域模型的技术实现,完成软件开发和落地,包括:<span style="background:#fff88f">聚合根、<span style="background:#fff88f">实体、<span style="background:#fff88f">值对象、<span style="background:#fff88f">领域服务、<span style="background:#fff88f">应用服务和<span style="background:#fff88f">资源库等代码逻辑的设计和实现。

3.1. 战略设计

3.1.1. 主要方法——事件风暴

它是一个从发散到收敛的过程。
发散过程: 它通常采用用例分析场景分析用户旅程分析,尽可能全面不遗漏地分解业务领域,并梳理领域对象之间的关系。
收敛的过程:事件风暴过程会产生很多的实体命令事件等领域对象,我们将这些领域对象从不同的维度进行聚类,形成如聚合限界上下文等边界,建立领域模型。
image.png

3.1.2. 达成效果——微服务的边界

  1. 在事件风暴中梳理业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素<span style="background:#fff88f">梳理出领域实体等领域对象。
  2. 根据领域实体之间的业务关联性,将业务紧密相关的实体进行组合形成<span style="background:#fff88f">聚合,同时确定聚合中的<span style="background:#fff88f">聚合根、值对象和实体。在这个图里,聚合之间的边界是第一层边界,它们在同一个微服务实例中运行,<span style="background:#fff88f">这个边界是逻辑边界,所以用虚线表示。
  3. 根据业务及语义边界等因素,<span style="background:#fff88f">将一个或者多个聚合划定在一个限界上下文内,形成领域模型。在这个图里,限界上下文之间的边界是第二层边界,<span style="background:#fff88f">这一层边界可能就是未来微服务的边界,不同限界上下文内的领域逻辑被隔离在不同的微服务实例中运行,物理上相互隔离,所以是<span style="background:#fff88f">物理边界,边界之间用实线来表示。

4. DDD与微服务

DDD是一种架构设计方法,微服务是一种架构风格。DDD通过事件风暴梳理出来限界上下文,会指导形成微服务的边界。