【架构】领域驱动设计(DDD)的几种典型架构介绍

news2024/12/23 0:13:59

文章目录

  • 前言
  • 一、专业术语
  • 二、架构演变
  • 三、限界上下文
  • 四、领域驱动设计的四重边界
  • 五、整洁分层架构
  • 六、六边形架构
  • 七、洋葱架构
  • 总结

前言

我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢?

一、专业术语

  • 各种服务
    • IAAS:基础设施服务,Infrastructure-as-a-service
    • PAAS:平台服务,Platform-as-a-service
    • SAAS:软件服务,Software-as-a-service

二、架构演变

在这里插入图片描述

从图中已经可以很容易看出架构的演进过程,通过对三个层的举例来进行说明:

  • SAAS:比如我们最早的就是单体应用,多个业务之间可能都没有进行分层,之后我们业务多了,都各自混淆在一起,后来我们就通过MVC、SSM、分层等方式进行业务拆分,保证业务与业务之间解耦
  • PAAS:随者业务的增长,我们打算分离出一个子系统,但是成本太高,每次都需要从头搭建一个子系统,效率低下。这时我们就抽取除了一些通用技术,比如mesh、SOA、微服务等方式来隔离系统,且对通用技术复用来快速搭建一个系统
  • IAAS:比如订单服务并发量高,单台服务器已经无法满足要求,这时我们需要多台服务器,可能有windows的、linux、mac,想要快速部署就需要屏蔽OS,于是就有了VM、Docker、K8S等技术来屏蔽OS

三、限界上下文

限界上下文概念
在这里插入图片描述

BC与业务的关系:
通过对业务的划分,比如订单系统,订单是一个子域;库存是一个子域;其中商品再不同的子域中所表示的意义也不同,比如在订单上下文中的商品表示商品的单价、折扣等等;而在库存的上下文中商品表示商品的库存量、成本、存放位置等。
BC与技术的关系:
多个子域之间必须需要在应用层进行聚合,而聚合的过程中就引出了技术方案,比如订单到库存到支付,他们应该采用同步方式;这几个子域调用通知都应该是异步,那么可能就需要消息中间件或其它技术方案
限界上下文划分规则
在这里插入图片描述

一般来说,先考虑团队规模,来决定最终需要划分到多细粒度的BC,如果团队规模过小而BC过细,则对后期的运维、部署、上线都会造成很大的负担;在确定好粒度后,可以对语义相关性、功能相关性-业务方向、功能相关性-非业务方向进行划分按照以上的规则划分之后就得到了多个BC啦
一个BC代表一个微服务吗

在这里插入图片描述

概念:微服务一般是指将高度相关功能的一个开发部署单元,有自己的技术自治性、技术选型、弹性扩缩容、发布上下频率等,说白了就是各自维护一个业务,然后多个业务组成一个系统,多个业务之间各自管理
关系:这里的BC其实就是一个领域或一个模块或一个业务,如果两个领域相关性很高,就可以包含多个BC,或者如果一个领域访问量非常大,则需要部署在一个微服务中以提高性能

四、领域驱动设计的四重边界

在这里插入图片描述

根据上图所示,我们通过四重来进行架构设计:
分而治之:DDD通过规划四重边界,把领域知识做了合理的固化和分层。业务有核心领域和支持域、业务域中又拆分成多个限界上下文(BC),一个BC中又根据领域知识核心与否进行分层,领域层中按照多个业务(子域)的强相关性进行聚合成一个子域。另外,搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。
【第一重边界】确定项目的愿景与目标,确定问题空间,确定核心子领域、通用子领域(多个子领域可以复用)、支撑子领域(额外功能,如数据统计、导出报表)
【第二重边界】解决方案空间里的限界上下文就是一道进程隔离层面的物理边界
【第三重边界】每个限界上下文内,使用分层架构划分为:接口层、领域层、应用层、基础设施层之间的最小隔离
【第四重边界】领域层里为了保证各个领域的完整性和一致性,引入聚合的设计作为隔离领域模型的最小单元

五、整洁分层架构

在这里插入图片描述

具体说明看图中备注,总的来说就是通过实现与接口分离,让domain层尽量独立,而不耦合与任何模块,这里面包含了领域模型的业务逻辑代码,但不会依赖于具体技术实现,可以很方便更换基础设施层,提供给第三方web调用service

六、六边形架构

在这里插入图片描述

主动适配:指来⾃于UI、命令⾏等输⼊型命令, controller就是⼀种端⼝,端⼝的具体实现就是应⽤逻辑⾃身。因此端⼝和具体实现都在应⽤系统的内部。
被动适配:指访问存储设备,外部服务等。每种访问就是⼀种端⼝,具体实现是各个具体的中间件。因此端⼝在整个应⽤系统的⾥部,具体实现在系统的外部。每⼀种输⼊和输出都是⼀个端⼝,每个端⼝都有具体的实现逻辑,因此整个应⽤系统的架构就是⼀些列的端⼝+适配逻辑组成,架构图就是⼀个多边形形状。有⼏个端⼝需要根据应⽤系统的具体情况⽽定,只是六个端⼝⽐较形象⽽得名为六边形架构。特点:1. 外层依赖内层使得依赖更合理。端⼝就是接⼝,依赖接⼝编程。借此保证了应⽤和实现细节之间的隔离。2. 可测试更好

七、洋葱架构

在这里插入图片描述

洋葱架构针对六边形架构更进⼀步把内层的业务逻辑分为了DDD概念的应⽤服务层、领域服务层和领域模型层。
特点:

  1. 围绕独⽴的领域模型构建应⽤
  2. 内层定义接⼝,外层实现接⼝
  3. 依赖的⽅向指向圆⼼(注意:洋葱架构提倡不破坏耦合⽅向的依赖都是合理的,外层可以依赖直接内层,也可以依赖更⾥⾯的层)
  4. 所有的应⽤代码可以独⽴于基础设施编译和运⾏

总结

目前领域驱动设计是目前比较流行的一种架构设计,只需要按照领域驱动设计的四重边界进行架构设计,就能够很好的对各个领域解耦,对后期的业务垂直扩展、功能的水平扩展提供了良好的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web自动化测试】如何生成高质量的测试报告

运行了所有测试用例,控制台输入的结果,如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错误情况。 web自动化测试实战之批量执行测试用例场景: 运行 AllTest.py 文件后得到的测试结果不够专业,无法直观的分析测试结果,我们能否…

如何学习和提高CAPL语言编程能力

CAPL是Vector公司开发的,用来配合它的系列产品使用的一款面向过程的语言。CAPL是Communication Access Programming Language的缩写,从字面意思来说,是专门用于通信访问的编程语言。 最初访问CAN总线,现在已扩展到所有的汽车总线…

代理模式(Proxy)

定义 代理是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。 前言 1. 问题 举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需…

mac部署fastadmin踩坑记录

粘贴一下解决配置,主要Nginx配置问题 //后台NGINX location / {if (!-e $request_filename) {rewrite ^(.?\.php)(/.)$ /$1?s$2 last;# 加上这一句配置试试rewrite ^(.*)$ /ewgadmin.php?s$1 last; # 对应项目修改对应入口文件break;}}//接口文档Nginx配置 loca…

sql server还原新数据库,解决原库还原中...

1)用studyDB库,备份出数据库备份文件 studyDB_backup_2023_06_19.bak 2)用备份文件 studyDB_backup_2023_06_19.bak还原数据新库CollegeStudyDB和原库studyDB到同一服务器 3)数据库CollegeStudyDB按原成功,但是原库s…

Linux环境准备以及CentOS7.6系统安装

(该图由AI绘制 本人提供教学 FREE) 运维概述与Linux系统安装 一、VMware虚拟机 1、什么是虚拟机 其实虚拟机就是在Windows的真机上创建一个独立的其他操作系统的运行环境而且其对宿主机(Windows)没有任何影响。 2、虚拟机的种…

《操作系统》by李治军 | 实验7 - 地址映射与共享

目录 一、实验目的 二、实验内容 (一)跟踪地址翻译过程 (二)基于共享内存的生产者—消费者程序 (三)共享内存的实现 三、实验准备 1. Linux 中的共享内存 2. 获得空闲物理页面 3. 地址映射 4. 寻…

TS学习笔记——模块

模块 module 模块:在自身的作用域里执行,不是在全局作用域中,若是外部想要使用需要导入导出。 好处:1、提高了代码的复用性 2、解决命名冲突 3、提高代码的可维护性 模块导入导出:export (interface…

同步和异步、同步复位、异步复位、同步释放

文章目录 同步和异步同步复位、异步复位、同步释放同步复位异步复位同步释放(异步信号和CLK信号存在时序检查、Recover time&Removel time)典型的异步复位同步释放的verilog电路设计 同步和异步 数字电路根据逻辑功能的不同特点,可以分成…

如何判断端口有没有被占用

第一步:打开cmd 输入netstat -ano 可以查看自己的所有端口,第一行的本地地址是端口22,最右面对应的pid13260 第二步:打开任务管理器对应的PID就知道那个服务项占用了22端口了 第二种查看指定方法: netstat -ano|finds…

将数据库与LLMs结合,增强模型的长期记忆能力--ChatDB

ChatDB: AUGMENTING LLMS WITH DATABASES AS THEIR SYMBOLIC MEMORY 返回论文和资料目录 论文地址 项目地址 1.导读 清华团队针对大模型LLMs的长期记忆能力进行的改进。改进思路是将LLMs与数据库结合,将信息以符号化的形式存储在数据库中。同时,使用大…

极致呈现系列之:Echarts日历坐标系的时光流转

目录 什么是日历坐标系Echarts日历坐标系的特性Echarts日历坐标系的应用场景Echarts日历坐标系中常用的配置项Vue3中使用Echats日历坐标系实现健康可视化图表日历饼图 什么是日历坐标系 日历坐标系是一种用于展示时间数据的坐标系,将数据按照日期呈现在一个日历形式…

「Java核心技术大会 2023」6月重磅启动,邀你共同探讨Java生态 ~文末福利

Java核心技术大会 2023 大会简介直播预约:视频号“IT阅读排行榜”PART 1 特邀启动专场PART 2 Java语言、平台和趋势专场PART 3 Java应用开发专场PART 4 Java应用与系统架构专场PART 5 Java应用性能优化专场PART 6 大数据与数据库专场PART 7 云原生与Serverless专场P…

STM32学习 6月27日

51单片机中有时钟和时钟树的概念,外设只有GPIO、定时器、和一个串口,使用的都是11.0592MHZ的频率,除了定时器外,其他外设只要上电就可以使用。 stm32每个外设都有对应控制的开关,其所使用的频率各不相同,需…

[Windows] ImageGlass Kobe v8.9便携版

这款ImageGlass Kobe 神仙看图软件,UI漂亮,而且官方收费95元限时免费,打开大图速度极快,界面简洁纯净无广告,简直就是我的梦中情软,看图体验真的嘎嘎好!是优秀的 Windows 照片查看器替代品。 具…

数据库监控与调优【十一】—— 索引调优技巧

索引调优技巧 长字段的索引调优使用组合索引的技巧覆盖索引排序优化冗余、重复索引的优化 长字段的索引调优 举例 实际项目中,我们可能需要给很长的字段添加索引。 比如以下first_name字段里面存储的数据普遍在200以上。 SELECT* FROMemployees WHEREfirst_…

Qt 动态手势识别“握拳”

系列文章目录 通过Qt实现手势识别控制软件操作相关系列技术方案 (一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现 (二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆…

永磁同步电机无位置传感器控制,采用的是龙贝格,基于模型的 定点开发,仿真效果和实际95%高度吻合

永磁同步电机无位置传感器控制,采用的是龙贝格,基于模型的 定点开发,仿真效果和实际95%高度吻合,可以仿真学习,也可以直接移植到项目中 YID:32768642079012761

深度学习框架背景

深度学习框架背景 本文目录: 一、深度学习框架概念 二、为何要用深度学习框架 三、掌握深度学习框架要做哪些准备 四、深度学习主要应用场景 五、常见深度学习框架的对比 六、深度学习框架在市场上的占比 七、中国深度学习开源框架状况 八、备注 一、深度学…

redis------Hash操作(字典)

Hash操作,redis中Hash在内存中的存储格式如下图: # hash类型就是咱们python中的字典,key-value,字典又叫hash类型 字典的key必须可hash -字典类型在底层存储,基于数组存的 key---{key:value,key:value} hset(name, key, val…