当前位置: 首页 > news >正文

领域驱动DDD三种架构-分层架构、洋葱架构、六边形架构

博主介绍: 大家好,我是Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。
技术范围: 目前专注java体系,以及golang、.Net、软件架构、DDD、微服务、redis、nginx、tomcat、mysql、oracle等
业务范围: 从数字医院到区域医疗,从院内业务系统到互联网医院及健康服务,从公立医院到私立医院都有一些经历及理解
*** 为大家分享一些技术积累,欢迎交流合作 持续关注Yuperman ***

领域驱动DDD三种架构-分层架构、六边形架构、洋葱架构

本文介绍DDD的三种主要实现架构
1.分层架构
2.六边形架构
3.洋葱架构

据了解互联网很多大厂都在应用实践DDD,同时很多银行保险等行业也在积极深入应用,DDD也非常适合我所在的医疗行业,也在部分项目中进行了应用。在早期的项目中应用分层架构较多,随着理解深入和DDD演进,逐渐应用洋葱架构。

领域驱动DDD适合应用场景包括:

(1)业务应用系统:当项目涉及多个业务领域,且业务逻辑复杂时,采用DDD能够提高系统的可维护性、可扩展性和灵活性。

(2)团队协作:在大型项目中,DDD有助于明确各团队的职责范围,提高团队之间的沟通协作效率。

(3)业务变化频繁的项目:DDD能够帮助系统快速响应业务变化,降低因业务变动导致的开发成本。


文章目录

  • 领域驱动DDD三种架构-分层架构、六边形架构、洋葱架构
  • 优势与不足
  • 一、分层架构
  • 二、六边形架构
  • 三、洋葱架构
  • 四、结语

优势与不足

优势:

(1)提高可维护性:通过将复杂的业务场景划分为简单的领域,有利于代码的阅读和维护。

(2)提高可扩展性:领域之间的解耦降低了系统间的耦合度,有利于未来的功能扩展和新技术引入。

(3)提高灵活性:基于领域模型的设计使得系统能够更快地响应业务变化,提高适应性。

(4)促进团队沟通:通过清晰地定义领域边界,有助于团队之间的交流和协作。

不足:
(1)学习成本较高:掌握DDD需要一定的领域知识和编程经验,对于初学者来说,学习成本较高。

(2)过度设计:在实际项目中,过度关注领域划分可能导致系统设计过于复杂,反而降低开发效率。

(3)领域建模挑战:对于某些复杂业务场景,领域建模可能存在一定的困难,需要开发者具备较高的业务理解和建模能力。

一、分层架构

2003年,Eric Evans出版了他的标志性著作《领域驱动设计:软件核心复杂性应对之道》。从此,DDD的概念被人熟悉,以及基于DDD的一系列架构演变开始出现。

在这里插入图片描述

分层架构,每一层,只与自己下一层发生耦合,类似于网络的7层或TCP/IP的4层模型架构,每一层各司其职,并且只关心向下一层的实现,而不会出现各层耦合。

DDD分层架构中包含四层:从上到下分别是用户接口层,应用层,领域层和基础层。


二、六边形架构

2005年Alistair Cockburn提出了六边形架构,在这个架构中,将应用分为内六边形和外六边形两层,内六边形实现应用的核心业务逻辑。外六边形完成外部应用,基础资源等的交互和访问,对于与不同的外部系统交互,由外六边形的适配器负责协议转换,保证内六边形业务逻辑的干净。
这种架构也是典型的分层架构,和DDD分层架构一样,都体现了高内聚,低耦合的设计特性。六边形也常作为指导微服务设计的重要架构之一。

在这里插入图片描述

六边形架构又称端口-适配器架构,这个名字更容易理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表应用的业务逻辑,外部代表应用的驱动逻辑、基础设施或其他应用。内部通过端口和外部系统通信,端口代表了一定协议,以API呈现。

一个端口可能对应多个外部系统,不同的外部系统需要使用不同的适配器,适配器负责对协议进行转换。这样就使得应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,并且可以在与实际运行的设备和数据库相隔离的情况下进行开发和测试。

一个端口对应多个适配器,是对一类外部系统的归纳,它体现了对外部的抽象。应用通过端口为外界提供服务,这些端口需要被良好地设计和测试。内部不关心外部如何使用端口,从一开始就要假定外部使用者是可替换的。

三、洋葱架构

洋葱架构是比较新的DDD架构,2008年Jeffrey Palermo已经提出了具有分层思想的洋葱架构,如下图,同心圆代表软件的不同部分,从里向外依次是领域模型,领域服务,应用服务和外层的基础设施和用户终端。

在这里插入图片描述

洋葱架构根据依赖原则,定义了各层的依赖关系,越往里依赖程度越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的情况,这种架构也是典型的分层架构,和DDD分层架构一样,都体现了高内聚,低耦合的设计特性。洋葱架构也常作为指导微服务设计的重要架构之一。

在这里插入图片描述
洋葱架构与六边形架构有着相同的思路,都是通过编写适配器代码将应用核心从对基础设施的关注中解放出来,避免基础设 施代码渗透到应用核心之中。这样应用使用的工具和传达机制都可以轻松地替换,在一定程度上避免技术、工具或者供应商锁定。

洋葱架构分离了基础设施和业务应用,使得我们可以方便地模拟(Mock)基础实施,对业务应用进行测试。企业应用中存在着不止两个层次,洋葱架构还在业务逻辑中加入了一些在领域驱动设计的过程中被识别出来的层次:


四、结语

领域驱动DDD的分层架构、洋葱架构、六边形架构的表现形式稍有不同,对应落地到代码层面的实现层次关系也略有不同,但是核心思想都是一样的,按业务创建领域并进行业务解耦。

相关文章:

  • 通过openAI的Chat Completions API实现一个支持追问的ChatGPT功能集成
  • 初试AngularJS前端框架
  • 【AI驱动 TDSQL-C Serverless 数据库技术实战营】AI赋能电商数据管理
  • 【AI大模型】向量及向量知识库
  • C++的智能指针
  • Java爬虫抓取数据的艺术
  • 电脑ip地址怎么换地区:操作步骤与利弊分析
  • 【学习笔记】TLS/SSL握手之Records
  • 智能新宠:BabyAlpha A2开启家庭机器人新时代
  • 【JAVA】synchronized 关键字的底层实现涉及得三个队列
  • Python知识点:如何使用Python进行物联网数据处理
  • JavaScript的条件语句
  • hive分区详细教程
  • 基于flask常见trick——unicode进制编码绕过
  • 【rabbitmq-server】安装使用介绍
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • emacs初体验
  • ERLANG 网工修炼笔记 ---- UDP
  • java小心机(3)| 浅析finalize()
  • MaxCompute访问TableStore(OTS) 数据
  • Mybatis初体验
  • PV统计优化设计
  • Twitter赢在开放,三年创造奇迹
  • 复习Javascript专题(四):js中的深浅拷贝
  • 技术:超级实用的电脑小技巧
  • 讲清楚之javascript作用域
  • 我的业余项目总结
  • 在weex里面使用chart图表
  • 怎么把视频里的音乐提取出来
  • 中文输入法与React文本输入框的问题与解决方案
  • 7行Python代码的人脸识别
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #考研#计算机文化知识1(局域网及网络互联)
  • (04)odoo视图操作
  • (07)Hive——窗口函数详解
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转) 深度模型优化性能 调参
  • (转载)Linux 多线程条件变量同步
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET 中让 Task 支持带超时的异步等待
  • .Net多线程总结
  • .NET文档生成工具ADB使用图文教程
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • [ARM]ldr 和 adr 伪指令的区别
  • [Avalon] Avalon中的Conditional Formatting.
  • [BUG] Authentication Error
  • [C#]C# winform部署yolov8目标检测的openvino模型