什么是领域驱动设计

领域驱动设计是由Eric Evans提出的,目的是对软件涉及的领域进行建模,以应对系统规模过大引起的软件复杂性问题。整个过程为研发团队和领域专家一起通过通用语言描述领域知识,从领域知识中提取和划分为一个个子领域,包括核心子领域、通用子领域和支撑子领域,并在子领域上建立模型,在重复以上步骤。这样周而复始,构建出符合当前领域的模型。

开发目标

  • 拒绝小单体,拒绝污染功能与服务,拒绝增加一个月的功能排期。
  • 设计出高可用、符合互联网高速迭代的应用服务。
  • 物料化、组装化和可编排的服务,提高人效。

服务架构

1. 应用层(application)

  • 应用服务位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装。
  • 应用层的服务包括应用服务和领域事件相关服务。
  • 应用服务可对微服务内的领域服务以及微服务外的应用服务进行组合和编排,或者对文件、缓存等基础层数据直接操作形成应用服务,对外提供粗粒度的服务。
  • 领域事件服务包括两类:领域事件的发布和订阅。通过事件总线和消息队列实现异步数据传输,实现微服务之间的解耦。

2. 领域层(domain)

  • 领域服务位于领域层,为完成领域中跨实体或值对象的操作转换而封装的服务,领域服务以与实体和值对象相同的方式参与实施过程。
  • 领域服务对同一个实体的一个方法或多个方法进行组合和封装,或对多个不同实体的操作进行组合或编排,对外暴露成领域服务。领域服务封装了核心的业务逻辑。实体自身的行为在实体类内部实现,向上封装成领域服务给应用层暴露接口。
  • 为了隐藏领域层的业务逻辑实现,所有的领域方法和功能实现等均需通过领域服务对外暴露。
  • 为实现微服务内聚合之间的解耦,原则上禁止跨聚合的领域服务调用和跨聚合的数据相互关联。

3. 基础层(infrastructure)

  • 基础服务位于基础层。为各层提供资源服务,如数据库,缓存等,实现各层的解耦,降低外部资源变化对业务逻辑的影响。
  • 基础服务主要为仓储服务,通过依赖反转的方式为各层提供基础资源服务,领域服务和应用服务调用仓储服务接口,利用仓储服务实现持久化存储数据对象或直接访问基础资源。

4. 用户接口层(interfaces)

接口服务位于用户接口层,用于处理用户发送的REStful请求、解析用户输入的配置文件等,并将信息传递给应用层。

应用经验

无论是DDD还是MVC,都是为了更好地实现对应架构下地设计思想,但并不是有一个通用的架构模式,就能开发出干净(高内聚)、整洁(低耦合)和漂亮(模块化)的代码。这就像同样住在三居室,各家居住的舒适度是不同的。

DDD只是指导,不能把互联网中每一个业务开发都拿出来展示,每个领域都需要设计。