天天看点

DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

…接上文

三. 架构演进及DDD架构

​     近些年来,软件系统架构的发展非常迅速,历经了单体,SOA,微服务等多个框架。笔者在本节做一个简单梳理,并引出领域驱动设计的架构理念。

架构起什么作用

​     首先,我们简单思考一下为什么要有架构?其主要作用是什么?

DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

​ 系统架构定义其组成要素和关系:

  • 要素 是 组成架构的重要元素 (Building Block)
  • 结构 是 要素之间的关系 (Relationship)

    主要作用:

  • 治理应用复杂度,降低系统熵值
  • 从随心所欲的混乱状态,走向井井有条的有序状态

好的系统架构设计原则:

  • 可扩展性
  • 灵活性
  • 简单性
  • 可插入性
  • 开放性
架构发展简单回顾

​     其次,我们从下图简单回顾一下架构演进的过程:

DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

​     从上图中我们不难看出,不管是在IAAS层、PAAS层还是SAAS层,趋势是拆分粒度越来越小,越来越细化。拆分单元越来越小,层次化越来越显著,这说明什么呢?显然是为了功能组件的重用、扩展和可组合,还有易于维护和管理部署;而DDD正是非常契合这一目标的。

DDD的分层架构体系
DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

​     从上图中我们可以看出,DDD所使用的传统分层架构与其他的不同:增加了领域层,也就是领域模型主要的落足点。一般来说,分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。分层架构分为几种,其中严格分层架构(Strict Layers Architecture)中,每层只能与直接位于其下方的层发生耦合;而在松散分层架构(Relaxed Layers Architecture)中则允许任意上方层与任意下方层发生耦合。事实上,较低层可以通过观察者模式或调停者模式与较高层发生耦合。

​     领域驱动设计在分层架构中推荐一种改进的方案,遵循了依赖倒置原则,见下图:

DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

    其理念从直观上非常简单:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。这里的抽象就是领域层所包含的业务逻辑抽象。因为所有的技术实现都是服务于业务的,所以所有层都应该依赖于业务逻辑所在的领域层,包括基础设施层。似乎没有理由使核心业务逻辑的实现依赖于诸如用户接口,应用形式和存储、消息等基础设施。

​     有趣的是,当我们在分层架构中采用依赖倒置原则时,会发现分层的概念已经不存在了。因为无论高层还是底层,它们只依赖于抽象,好像把整个架构给推平了一样。结果是引出了另一种架构:六边形架构

DDD的六边形架构
DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

​     我们通常将用户和系统交互得地方称为“前端”,而把系统中获取、存储持久化数据和发送输出数据的地方称为“后端”。但是,六边形架构提倡用一种新的视角来看待整个系统。如图所示,该架构中存在两个区域:内部区域和外部区域。在外部区域中,不同的客户均可以提交输入;而内部区域则用于获取持久化数据,并对程序输出进行存储(比如数据库),或者在中途将输出转发到另外的地方(比如消息)。

​     在上图中,每种类型的客户都有自己的适配器,该适配器用于将客户输入转化为程序内部 API 所能理解的输入。六边形每条不同的边代表了不同类型的端口,端口要么处理输入,要么处理输出。图中有两个客户请求分别抵达适配器A和B,可能是在使用HTTP协议(如浏览器,REST,SOAP);又有两个客户请求抵达适配器C和D,可能在使用AMQP协议(如RabbitMQ)。然后,端口将调用应用程序的某个操作或者向应用程序发送一个事件,控制权由此交给内部区域。这里应用程序时领域模型的直接客户。

​     对于图中右下方的端口和适配器,可以认为用来与多种持久化存贮或者消息队列的交互。例如,适配器E对接关系数据库,F对接文档数据库,G对接内部内存,H对接消息队列。六边形架构的另外一个好处在于我们可以快速开发用于测试的适配器。整个应用程序的领域模型可以在没有客户端和存储机制的条件下进行设计开发,很明显这一点有助于做单元测试。

​     最后,六边形架构可以支持系统中的其他架构。比如,我们可能采用SOA架构、REST或者事件驱动架构,CQRS(Command Query Responsibility Segregation)。

​     本节虽然重点介绍DDD相关架构,但由于架构的发展是相关的。所以对于其他架构方案也会简单梳理。

未完待续…

DDD(Domain Driven Design) 领域驱动设计从理论到实践 一

DDD(Domain Driven Design) 领域驱动设计从理论到实践 二

DDD(Domain Driven Design) 领域驱动设计从理论到实践 三

DDD(Domain Driven Design) 领域驱动设计从理论到实践 四

DDD(Domain Driven Design) 领域驱动设计从理论到实践 五

DDD(Domain Driven Design) 领域驱动设计从理论到实践 六

DDD(Domain Driven Design) 领域驱动设计从理论到实践 七

DDD(Domain Driven Design) 领域驱动设计从理论到实践 八

DDD(Domain Driven Design) 领域驱动设计从理论到实践 九

继续阅读