0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:CSDN 2023-03-13 09:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


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

一、专业术语

各种服务

IAAS:基础设施服务,Infrastructure-as-a-service

PAAS:平台服务,Platform-as-a-service

SAAS:软件服务,Software-as-a-service

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二、架构演变

dfd4371c-c02f-11ed-bfe3-dac502259ad0.png

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

SAAS :比如我们最早的就是单体应用,多个业务之间可能都没有进行分层,之后我们业务多了,都各自混淆在一起,后来我们就通过MVC、SSM、分层等方式进行业务拆分,保证业务与业务之间解耦

PAAS :随者业务的增长,我们打算分离出一个子系统,但是成本太高,每次都需要从头搭建一个子系统,效率低下。这时我们就抽取除了一些通用技术,比如mesh、SOA、微服务等方式来隔离系统,且对通用技术复用来快速搭建一个系统

IAAS :比如订单服务并发量高,单台服务器已经无法满足要求,这时我们需要多台服务器,可能有windows的、linux、mac,想要快速部署就需要屏蔽OS,于是就有了VM、Docker、K8S等技术来屏蔽OS

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

三、限界上下文

限界上下文概念

e013d462-c02f-11ed-bfe3-dac502259ad0.png

BC与业务的关系

通过对业务的划分,比如订单系统,订单是一个子域;库存是一个子域;

其中商品再不同的子域中所表示的意义也不同,比如在订单上下文中的商品表示商品的单价、折扣等等;而在库存的上下文中商品表示商品的库存量、成本、存放位置等。

BC与技术的关系

多个子域之间必须需要在应用层进行聚合,而聚合的过程中就引出了技术方案,比如订单到库存到支付,他们应该采用同步方式;这几个子域调用通知都应该是异步,那么可能就需要消息中间件或其它技术方案

限界上下文划分规则

e02b3e7c-c02f-11ed-bfe3-dac502259ad0.png

一般来说,先考虑团队规模,来决定最终需要划分到多细粒度的BC,如果团队规模过小而BC过细,则对后期的运维、部署、上线都会造成很大的负担;

在确定好粒度后,可以对语义相关性、功能相关性-业务方向、功能相关性-非业务方向进行划分

按照以上的规则划分之后就得到了多个BC啦

一个BC代表一个微服务吗?

e03b5672-c02f-11ed-bfe3-dac502259ad0.png

概念 :微服务一般是指将高度相关功能的一个开发部署单元,有自己的技术自治性、技术选型、弹性扩缩容、发布上下频率等,说白了就是各自维护一个业务,然后多个业务组成一个系统,多个业务之间各自管理

关系:这里的BC其实就是一个领域或一个模块或一个业务,如果两个领域相关性很高,就可以包含多个BC,或者如果一个领域访问量非常大,则需要部署在一个微服务中以提高性能

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

e047db86-c02f-11ed-bfe3-dac502259ad0.png

根据上图所示,我们通过四重来进行架构设计:

分而治之 :DDD通过规划四重边界,把领域知识做了合理的固化和分层。业务有核心领域和支持域、业务域中又拆分成多个限界上下文(BC),一个BC中又根据领域知识核心与否进行分层,领域层中按照多个业务(子域)的强相关性进行聚合成一个子域

【第一重边界】确定项目的愿景与目标,确定问题空间,确定核心子领域、通用子领域(多个子领域可以复用)、支撑子领域(额外功能,如数据统计、导出报表)

【第二重边界】解决方案空间里的限界上下文就是一道进程隔离层面的物理边界

【第三重边界】每个限界上下文内,使用分层架构划分为:接口层、领域层、应用层、基础设施层之间的最小隔离

【第四重边界】领域层里为了保证各个领域的完整性和一致性,引入聚合的设计作为隔离领域模型的最小单元

五、整洁分层架构

e07285c0-c02f-11ed-bfe3-dac502259ad0.png

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

六、六边形架构

e08bc814-c02f-11ed-bfe3-dac502259ad0.png

主动适配 :指来⾃于UI、命令⾏等输⼊型命令, controller就是⼀种端⼝,端⼝的具体实现就是应⽤逻

辑⾃身。因此端⼝和具体实现都在应⽤系统的内部。

被动适配 :指访问存储设备,外部服务等。每种访问就是⼀种端⼝,具体实现是各个具体的中间件。因

此端⼝在整个应⽤系统的⾥部,具体实现在系统的外部。

每⼀种输⼊和输出都是⼀个端⼝,每个端⼝都有具体的实现逻辑,因此整个应⽤系统的架构就是⼀些列

的端⼝+适配逻辑组成,架构图就是⼀个多边形形状。有⼏个端⼝需要根据应⽤系统的具体情况⽽定,

只是六个端⼝⽐较形象⽽得名为六边形架构。

特点:1. 外层依赖内层使得依赖更合理。端⼝就是接⼝,依赖接⼝编程。借此保证了应⽤和实现细节之

间的隔离。2. 可测试更好

七、洋葱架构

e0c4d348-c02f-11ed-bfe3-dac502259ad0.png

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

模型层。

特点:

(1)围绕独⽴的领域模型构建应⽤

(2)内层定义接⼝,外层实现接⼝

(3)依赖的⽅向指向圆⼼(注意:洋葱架构提倡不破坏耦合⽅向的依赖都是合理的,外层可以依赖直接内层,也可以依赖更⾥⾯的层)

(4)所有的应⽤代码可以独⽴于基础设施编译和运⾏

八、总结

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



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    14

    文章

    10456

    浏览量

    91863
  • 代码
    +关注

    关注

    30

    文章

    4984

    浏览量

    74563
  • 架构
    +关注

    关注

    1

    文章

    537

    浏览量

    26671

原文标题:领域驱动设计(DDD)的几种典型架构介绍

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LED区域照明驱动架构典型设计

    从应用领域来看,照明涵盖住宅照明、工业照明、街道照明和餐厅、零售及服务业照明等不同类别。本文着重于LED区域照明驱动架构典型设计。##适合洗墙灯、外墙灯等应用的整体式/单段式方案。#
    发表于 01-20 10:18 1w次阅读
    LED区域照明<b class='flag-5'>驱动</b><b class='flag-5'>架构</b>与<b class='flag-5'>典型</b>设计

    几种典型的金属边框的设计方法以及设计思路介绍

    目前市面上主流的智能机都是采用金属边框的工艺,而金属边框的机器对于天线调试难度很大。金属边框天线设计主要是利用金属边框做为天线的一部分进行辐射,这种方式一般只有以下几种天线形式:IFA,Monopole,Loop。下面就为大家介绍几种
    发表于 06-13 06:46

    几种驱动解决方案介绍和比较

    专用芯片的主要参数是什么?几种驱动解决方案介绍和比较
    发表于 06-04 06:05

    ARM总共有几种架构?ARM各架构之间的区别在哪?

    ARM总共有几种架构?ARM各架构之间的区别在哪?基于各ARM架构设计的内核型号有哪些?分别有哪些应用领域
    发表于 07-01 09:10

    ARM领域管理扩展(RME)系统架构介绍

    本章介绍Realm Management Extension(RME)系统架构。RME架构是在[1]中指定,并且被定义为Armv9体系结构的A轮廓的扩展。 RME体系结构定义了符合Arm要求的一组
    发表于 08-09 07:52

    黑客攻防入门与进阶ddd

    黑客攻防入门与进阶ddd黑客攻防入门与进阶ddd
    发表于 02-23 15:45 9次下载

    详解领域驱动设计和spring

    领域驱动设计 Eric Evans的《领域驱动设计》无疑是软件设计领域最重要的几本书之一。 这本书主要集中在软件开发中如何处理
    发表于 09-27 12:51 0次下载
    详解<b class='flag-5'>领域</b><b class='flag-5'>驱动</b>设计和spring

    详解领域驱动设计和spring

    领域驱动设计 Eric Evans的《领域驱动设计》无疑是软件设计领域最重要的几本书之一。 这本书主要集中在软件开发中如何处理
    发表于 09-27 12:51 0次下载
    详解<b class='flag-5'>领域</b><b class='flag-5'>驱动</b>设计和spring

    用好DDD必须先过Spring Data这关

    DDD 是一种领域驱动的设计方法,旨在通过建立对领域模型的清晰理解来解决业务问题。和事务脚本不同,DDD 使用面向对象设计来应对复杂的业务场
    的头像 发表于 03-07 09:38 2869次阅读

    一文理解DDD领域驱动设计

    2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD
    的头像 发表于 05-25 14:21 1741次阅读
    一文理解<b class='flag-5'>DDD</b><b class='flag-5'>领域</b><b class='flag-5'>驱动</b>设计

    DDD驱动如何设计?如何进行领域建模?

    DDD是Eric Evans在2003年出版的《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design: Tackling Complexity in the Heart
    的头像 发表于 07-18 14:11 2135次阅读
    <b class='flag-5'>DDD</b><b class='flag-5'>驱动</b>如何设计?如何进行<b class='flag-5'>领域</b>建模?

    谈谈后端架构的演进过程:N-Layered和DDD架构介绍

    在本文中,我们讨论了 N-layered、DDD、六边形、洋葱和清洁架构。这些只是众多存在的架构中的一部分,是一些比较出名的架构。你可能还听说过 BCE、DCI 等。
    发表于 08-16 10:08 1342次阅读
    谈谈后端<b class='flag-5'>架构</b>的演进过程:N-Layered和<b class='flag-5'>DDD</b><b class='flag-5'>架构</b><b class='flag-5'>介绍</b>

    DDD是什么?DDD核心概念梳理

    DDD 是什么,DDD 的英文全称是 Domain-Driven Design,翻译过来就是领域驱动设计。
    的头像 发表于 09-07 11:12 1.2w次阅读
    <b class='flag-5'>DDD</b>是什么?<b class='flag-5'>DDD</b>核心概念梳理

    典型的卫星系统架构介绍

    本文对典型的卫星系统架构进行介绍,里面涉及的调制解调、数字变频、天线收发等具体技术方案不在本文的讨论之内。
    发表于 12-18 14:31 6722次阅读
    <b class='flag-5'>典型</b>的卫星系统<b class='flag-5'>架构</b><b class='flag-5'>介绍</b>

    DDD学习与感悟——向屎山冲锋

    软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计中的其中
    的头像 发表于 09-24 13:31 1171次阅读
    <b class='flag-5'>DDD</b>学习与感悟——向屎山冲锋