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

server/2024/9/21 11:57:00/

博主介绍: 大家好,我是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能够帮助系统快速响应业务变化,降低因业务变动导致的开发成本。


文章目录

优势与不足

优势:

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


http://www.ppmy.cn/server/119804.html

相关文章

Idea开发Gradle多模块项目踩坑纪实之一:Java模块无法执行

最近尝试了使用Idea尝试使用Gradle开发多模块项目,结果遇到一个见鬼的问题: 首先,总项目是一个空项目。 第二,我首先建立了两个Java模块,然后建立了一个Spring boot程序模块。 当我建立第四个Java模块的时候发现问题…

6.C_数据结构_查询_哈希表

概述 哈希表的查询是通过计算的方式获取数据的地址,而不是依次比较。在哈希表中,有一个键值key,通过一些函数转换为哈希表的索引值。 其中:这个函数被称为哈希函数、散列函数、杂凑函数,记为:H(key) 哈希…

【JVM】判断对象能否回收的两种方法:引用计数算法,可达性分析算法

1、引用计数算法: 给对象添加一个引用计数器,当该对象被其它对象引用时计数加一,引用失效时计数减一,计数为0时,可以回收。 特点:占用了一些额外的内存空间来进行计数,原理简单,判…

系统架构设计师 需求分析篇一

📘 结构化分析SA 思想 自顶向下:像剥洋葱一样,层层深入,大问题拆成小问题,再拆成更小的问题。 核心模型 数据字典 📔:记录数据元素的点点滴滴,从属性到使用方式,无所…

科研绘图系列:R语言散点图和小提琴图(scatter plot violin plot)

文章目录 介绍加载R包导入数据数据预处理函数画图系统信息介绍 提取模型的结果并对模型的结果进行可视化。 加载R包 library(ggplot2) library(ggridges) library(patchwork) library(party) library(caret) library(dplyr

SpringDataJpa自关联映射时出现StackOverflowError

使用Jpa自关联时,存在子数据的记录会报内存溢出问题StackOverflowError 原因: 使用了 lombok 插件中的Data注解来标注类,生成 gettet/setter 以及 toString lombok 在生成时会出现循环比较两类中的 hashcode,导致内存溢出。 解决…

一条sql是如何执行的详解

一条sql是如何执行的详解 1. SQL 解析(Parsing) 2. 查询重写(Query Rewrite) 3. 查询规划(Query Planning) 4. 查询执行(Query Execution) 5. 结果返回 示例:查询执…

vue2中使用vue-office库预览pdf /docx/excel文件

vue2中使用vue-office库预览pdf /docx/excel文件 - 简书 vue引用vue-office实现docx、excel、pdf等文件预览_vue-office-excel-CSDN博客