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

…接上文

三. 架构演进及DDD架构

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

架构起什么作用

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

在这里插入图片描述

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

  • 要素 是 组成架构的重要元素 (Building Block)

  • 结构 是 要素之间的关系 (Relationship)

    主要作用:

  • 治理应用复杂度,降低系统熵值

  • 从随心所欲的混乱状态,走向井井有条的有序状态

好的系统架构设计原则:

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

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

DDD的分层架构体系

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

​     领域驱动设计在分层架构中推荐一种改进的方案,遵循了依赖倒置原则,见下图:
在这里插入图片描述
    其理念从直观上非常简单:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。这里的抽象就是领域层所包含的业务逻辑抽象。因为所有的技术实现都是服务于业务的,所以所有层都应该依赖于业务逻辑所在的领域层,包括基础设施层。似乎没有理由使核心业务逻辑的实现依赖于诸如用户接口,应用形式和存储、消息等基础设施。

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

DDD的六边形架构

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

​     在上图中,每种类型的客户都有自己的适配器,该适配器用于将客户输入转化为程序内部 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) 领域驱动设计从理论到实践 九

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
'Eric Evans has written a fantastic book on how you can make the design of your software match your mental model of the problem domain you are addressing. 'His book is very compatible with XP. It is not about drawing pictures of a domain; it is about how you think of it, the language you use to talk about it, and how you organize your software to reflect your improving understanding of it. Eric thinks that learning about your problem domain is as likely to happen at the end of your project as at the beginning, and so refactoring is a big part of his technique. 'The book is a fun read. Eric has lots of interesting stories, and he has a way with words. I see this book as essential reading for software developers-it is a future classic.' -Ralph Johnson, author of Design Patterns 'If you don't think you are getting value from your investment in object-oriented programming, this book will tell you what you've forgotten to do. 'Eric Evans convincingly argues for the importance of domain modeling as the central focus of development and provides a solid framework and set of techniques for accomplishing it. This is timeless wisdom, and will hold up long after the methodologies du jour have gone out of fashion.' -Dave Collins, author of Designing Object-Oriented User Interfaces 'Eric weaves real-world experience modeling-and building-business applications into a practical, useful book. Written from the perspective of a trusted practitioner, Eric's descriptions of ubiquitous language, the benefits of sharing models with users, object life-cycle management, logical and physical application structuring, and the process and results of deep refactoring are major contributions to our field.' -Luke Hohmann, author of Beyond Software Architecture 'This book belongs on the shelf of every thoughtful software developer.' -Kent Beck 'What Eric has managed to capture is a part of the design process that experienced object designers have always used, but that we have been singularly unsucc

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值