DDD(领域驱动设计)系列主题:领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)

本文主要是介绍DDD(领域驱动设计)系列主题:领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、专业术语

二、架构演变

三、限界上下文

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

五、整洁分层架构

六、六边形架构

七、洋葱架构

八、总结


我们生活中都听说了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)所有的应⽤代码可以独⽴于基础设施编译和运⾏

八、总结

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

这篇关于DDD(领域驱动设计)系列主题:领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050378

相关文章

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串