领域驱动设计的理解与实践

记录领域驱动设计的理解与实践。

DDD & 架构

DDD(Domain Driven Design,领域驱动设计)是基于业务领域实现的一种软件架构方法。

DDD的作用是将业务架构转变为系统架构和技术架构

按照架构角度的不同,可分为如下三类:

  • 业务架构:业务视角,描述业务模块以及关系;

业务架构的原型往往是业务方最先提出的,包含大体的业务需求。

完整的业务架构图是由业务、产品、技术在不断的需求迭代与架构演进不断完善的。

  • 应用架构:应用(系统)视角,描述应用系统及其依赖关系;

应用架构图是架构演进的结果。

随着业务的发展,会带来组织划分与应用拆分,应用架构也在不断演进。

  • 技术架构:技术视角,描述应用技术选型及其功能作用。

技术架构是当前系统(应用)的技术细节的描述,包括技术选型以及其应用场景。

技术架构是面向技术人员的,用于了解软件设计的细节。

Domain Driven Design

开发视角的转变:从单纯的技术视角转变为业务视角

开发人员往往从技术角度来剖析需求,大部分情况缺少从业务角度的全局思考,对业务与架构的演进缺少前瞻性导致架构的局限性。

尤其在业务开展的初级,开发人员对业务理解不够深入。

领域专家

领域专家是指那些掌握领域内知识的人,对该领域有很深入的理解。

产品技术业务都可以是领域专家,其中,业务一般掌握着最真实的领域知识。

领域专家沟通学习是架构设计的基础,无论是产品、技术、架构师,都需要与领域专家深入的学习领域知识。

通用语言

由于领域专家并不一定是产品、技术,因此与领域专家的沟通必然存在一定问题(行业不同)。

通用语言是解决领域专家与产品开发沟通的关键。

让大家都能听懂的专业名词,例如,SPU是商品,SKU是某种规格的商品。

领域建模

基于通用语言,与领域专家沟通学习领域知识,抽象出一套领域知识模型。

领域 & 限界上下文

限界上下文是领域的边界,也是领域模型的边界。

康威定律可以作为领域划分的一种规则。

组织与领域按照一一对应的关系来划分,实现领域的高内聚。

领域内可以包含多个限界上下文,此时,可以划分为多个细分子域

根据细分子域的不同性质,又可以划分为:

  • 核心子域:领域的核心,包含该领域内的核心领域知识;
  • 支撑子域:用于支撑核心子域;
  • 通用子域:公共的功能模块。

架构演进

领域模型需要不断演进来满足业务的迭代。

业务迭代会造成领域模型的拆分、增加,都会对原有架构产生巨大的挑战。

细分子域

领域划分是从全局来考虑架构结构的划分,属于架构顶层功能模块的划分。

对于开发人员来说,细分子域的领域模型的构建才是软件实现的关键。

开发人员不仅仅不要掌握细分子域,也需要了解和掌握整理领域的划分。

实体 & 值对象

实体是指具有唯一标识的对象,例如,User(实体)包含唯一的用户ID。

值对象是指不包含唯一标识的对象且不可修改,例如,Address对于其他用户来说,只是用户的一个属性,不可修改。

实体与值对象的区别在于唯一性

例如,不同规格的商品属于不同实体;规格只是一种属性,对于商品来说属于值对象。

聚合 & 聚合根

聚合是指一组相关对象的集合,聚合根作为聚合根节点,并由实体值对象组成。

聚合属于领域内知识的子集,可包含多个子域知识,用于对外提供领域服务。

领域模型 & 领域事件 & 领域服务

领域模型是指领域知识的抽象描述,用于指导软件架构设计。

领域事件是指领域内发生事件的描述,用于驱动关联领域的变更,可采用发布订阅模式实现。

领域服务是指领域对外提供的查询或更新服务,用于外部调用。

领域建模的步骤

  • 领域边界、界限上下文的划分;
  • 确认限界上下文中的核心子域、支撑子域、通用子域;
  • 确定子域内部的实体、值对象;
  • 划分聚合,确定聚合根;
  • 确认限界上下文之间的关系。

康威定律

康威定律是指系统结构应尽量的与组织结构保持一致。

对于多个团队来说,按照团队划分顶层领域边界;

对于团队内部来说,按照小组来划分细分子域的边界。

架构分类

软件架构上一般包括为CQRS六边形架构(适配器架构)分层架构

CQRS

CQRS被称为命令和查询责任分离,通过拆分读写模型来实现避免资源竞争。

CQRS按照读写把模型拆分为:

  • 命令 - 领域模型:用于持久化,包括领域行为,结构相对简单,事务支持;
  • 查询 - 视图模型:用于展示,属于非规范的模型,不包括领域行为;
  • 通知 - 领域事件:用于发布领域变更事件,包含领域行为。

六边形架构(适配器架构)

六边形架构(适配器架构)是基于适配器的设计模式的架构模型,

其主要特性如下:

  • 利用依赖倒置原则来分离技术框架
  • 功能模块均采用接口来实现相互依赖
  • 防腐层与适配器来实现外部技术框架的依赖

六边形架构屏蔽了外部技术框架的细节,内部功能高内聚,外部依赖低耦合

分层架构

分层架构是最常见的架构模型,按照功能层级拆分为:

  • 用户层:聚合多个顶层领域的数据,用于用户展示;
  • 应用层:聚合多个细分子域的数据,用于对外提供服务;
  • 领域层:细分子域的领域模型,可发布领域事件、执行领域行为,包括实体阈值对象的定义;
  • 基础设施层:提供持久化、防腐层等基础中间件的功能。