一篇带你了解大厂都在用的DDD领域驱动设计

news2024/11/24 0:20:38

一、DDD到底是什么

DDD全称Domain Driven Design,领域驱动设计。

为了解决快速变化、复杂系统的设计问题的

领域驱动设计是Eric Evans在2004年发表的Domain Driven Design(领域驱动设计,DDD)著作中提出的一种从系统分析到软件建模的一套方法论。以领域为核心驱动力的设计体系。

从领域驱动定义来看,领域驱动设计-软件核心复杂性应对之道,从Eric 定义中可以看出,领域驱动设计是为了解决复杂的软件设计,而且只是解决软件复杂性的一种方式,并不是唯一选择。另外不是所有的业务服务都合适做DDD架构,DDD适合产品化,可持续迭代,业务逻辑足够复杂的业务系统,对于系统初期业务逻辑相对比较简单的应用,传统MVC架构更具有优势,可以减少一部分认知成本与开发成本。而且领域驱动设计并不是万金油,只是解决复杂软件的一种方案,领域驱动设计本身只提供了理论思想,具体的落地方案一定是结合具体的业务场景实现的。

从领域驱动对应关系来看,一方面目前很多建设中台的时候大多采用DDD思想落地,DDD很多思想比如领域划分,领域事件,领域服务,边界上下文划分,充血模型,代码防腐,统一语义等等可以很好的帮助实现中台的落地,但是中台落地DDD并不是唯一选择。另一方面对于DDD的这些思想,与DDD的关系更多是聚合关系,而不是组合关系,也就是在具体应用开发中,即使采用传统的MVC架构,这些思想依然可以很好的发挥其作用。

二、DDD的由来

早期都是面向过程的代码,发现很难做到复用,结构体复用,对于结构体操作operatioin不能复用

于是就诞生了面向对象,属性和方法的统一。

需求不断变化,并且需要从产品客户不断平滑的传递到研发端,进入了第一次软件危机

第一次软件危机解决:敏捷开发-TDD-快速原型-MVC-Spring-ORM 

2003年DDD诞生,201X年,微服务流行,业务的快速发展-团队快速膨胀,于是DDD就来了

三、MVC到DDD的演进

先来看看mvc三层结构的代码

包的组织:

  • controller
  • service
  • dao

再来看看DDD架构下的代码

1、抽象CheckService,应对业务变化(防腐层)

业务检查也放到了checkService里面,因为这个选课的业务检查是可以换的,今年可以这样,明年可以那样,我们只需要那service抽出来,换具体实现就可以了,这样业务代码就不用变了。从而实现应对业务变化,这个也叫防腐层

2、抽象MQ基础设施层,防止第三方组件的变化(rocketMQ0->kafka)

另外我现在的MQ可能是kafka直接templete来set过去,如果我的mq不用kafka那么标准格式就得跟着变,我们的基础支撑层是不会确定用哪种mq,会在mq上面封装一个msgSender,在他的实现类里完全可以有各种mq来实现,假如我要换一直mq的话只要实现msgSender就可以了

3、贫血模型vs充血模型

充血模型和其他充血模型怎么做交互?

Student假如是贫血模型,会被各种sevice调用,选课,借书,体育等等,会分布到各个业务中,你还敢改student信息吗?除非你读懂每一个servcie的调用过程!

改成冲血模型,加入upgrade和run等和自身相关的业务逻辑

比如我现在有个学生领域和课程领域,我们可以单独有个服务交选课service(领域服务),来做他们两个的业务逻辑,将来我们假如他们有了新的业务,只需要在这里面加就行了,然后他们各自领域内自治,可以自我发展。

充血模型是怎么和数据库打交道的?

我们知道存储可以是各式各样的, 我们一般用仓库StudentRepository来管理Student的存储,他也是个抽象层防腐层,可以用MqSQL也好MongoDB也好具体落地

如果是复杂的对象,我们就可以用工厂模式,仓库中集成Factory/Builder应对复杂对象的组装。student里面除了有简单的属性id,name,age,可能还有address要存到另一个库里面,phone要看是不是骚扰号码存另一个库,这种复杂就需要用到组装器来组装

4、他们的对比

MVC保证了实现最差也不会差到那里去(但基本总是最差),DDD如果做的不好,可能比MVC还差,领域之间划分不清晰,可能会浪费很长一段时间也很难落地。如果做的好,确实可以做到应对业务变化(得非常了解业务,预测业务变化才能做到),也不会出现屎山代码。总的来说要让DDD真正落地,需要公司工程师有很高的素质。

5、DDD和微服务的关系

其实DDD和微服务没有什么关系,DDD是设计思想,微服务是具体实现。DDD可以用微服务实现也可以用单体来实现。如果是上面的例子,两个领域学生和课程。全部放一起就是单体,单体上学生域到课程域的领域服务单体也可以实现;如果是微服务,他们之间的领域服务可能用rpc来实现,也可用中间件来实现。

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

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

相关文章

K8s基础2——部署单Master节点K8s集群、切换containerd容器运行时

文章目录 一、部署K8S集群方式二、kubeadm工具搭建K8s集群2.1 资源配置2.2 服务器规划2.3 搭建流程2.3.1 操作系统初始化2.3.2 使用docker容器引擎2.3.3 安装cri-dockerd2.3.4 安装kubeadm,kubelet和kubectl2.3.5 master节点初始化2.3.6 加入node节点2.3.7 部署容器…

redhat 7.9 安装oracle 11g-11.2.0.4

redhat 7.9 安装oracle 11g-11.2.0.4 1、数据库下载和安装文档1.1、查看oracle 11g 适合安装的linux版本1.2、安装文档1.3、license种类解释( XE版 标准本 个人版 企业版)1.4、在安装完oracle后再创建数据库1.5、DBA的文档1.6、Automatic Storage Manage…

2.4 等比数列

学习步骤: 如果我要学习等比数列,我会按照以下步骤进行学习: 定义和性质:首先了解等比数列的定义和性质,包括公比、首项、通项公式、求和公式等。 例题练习:通过练习一些简单的例题来理解等比数列的概念和…

BMS的菊花链技术和AFE

文章目录 菊花链在BMS中的位置菊花链拓扑菊花链通信AFE(Analog Front End)AFE均衡电路菊花链应用示例MC33665AMC33665A SPI通信 MC33775AMC33775A 硬件资源 文章参考 菊花链在BMS中的位置 如下图,AFE在从板中,用来采集电池电压和…

ChatGPT在语音识别技术领域的应用

第一章:引言 近年来,随着深度学习技术的飞速发展,语音识别技术已经成为了人工智能领域中备受关注的重要领域之一。在语音识别技术的应用中,ChatGPT作为一款先进的语言模型,可以发挥其强大的文本生成和自然语言处理能力…

#详细介绍!!! 文件系统的一点相关知识

本文主要是介绍了一些计算机文件相关的基础知识,帮助读者更好的认识文件 目录 1.内存和外存 内存 特性1:读写速度快 特性2:内存中的数据不能永久存储 特性3:容量小,价格贵 外存 内存和外存对比总结 2.认识文件 …

Linux Ansible导入剧本、任务滚动执行、任务并行执行

目录 任务滚动更新 配置并行 包含和导入剧本 任务滚动更新 实现在多台被管理节点执行任务时,第一台的整个playbook执行完成后再在下一台主机执行任务;通过serial元素来实现 serial:1 表示一台一台执行playbook(serial也可以指定…

【白嫖系列】教育邮箱申请最新专业绘图软件OriginPro(官方渠道)

🥑 Welcome to Aedream同学 s blog! 🥑 文章目录 预备简单介绍有效期与申请条件申请链接查看邮箱切换中文 预备 以edu结尾的邮箱,毕业也可使用校友邮箱等。 简单介绍 Origin是一款数据分析和绘图的软件,具备统计、峰值分析和曲线…

[oeasy]python0144_try的完全体_否则_else_最终_finally

try的完全体 回忆上次内容 上次细化了主控程序(main.py) 导入(get_fruits.py)处理(process.py)输出(output.py) 使用了 try 结构 tryexcept发现异常就报错 输入部分的错误 应该在 输入部分来报 具体怎么报呢?🤔 完善输入 输入的时候 应该包括 对于输…

新写了的 AOP 日志切面,方便以后直接使用。

前言 最近项目进入联调阶段,服务层的接口需要和协议层进行交互,协议层需要将入参[json字符串]组装成服务层所需的json字符串,组装的过程中很容易出错。入参出错导致接口调试失败问题在联调中出现很多次,因此就想写一个请求日志切…

AI 时代,知识工作者的生存指南

最近,大家可能已经见识过 AI 的威力了吧,以 ChatGPT 为代表的 人工智能(AI)展现出接近人一样的回答水准。 来自 Craft AI Assitant AI 就在那里,是房间里的大象,大家不能总装做对自己没有影响。要知道&…

Python使用CV2库捕获、播放和保存摄像头视频

Python使用CV2库捕获、播放和保存摄像头视频 特别提示:CV2指的是OpenCV2(Open Source Computer Vision Library),安装的时候是 opencv_python,但在导入的时候采用 import cv2。 若想使用cv2库必须先安装,P…

2023年最新5A景区有多少个?Python可视化告诉你

2023年最新5A景区有多少个?Python可视化告诉你 五一小长假来了,很多人想抓住小长假的机会去旅游。 5A景区是大多数人的首选,全国最新有多少个5A景区呢,应该还有很多人不知道。本文用Python进行可视化,告诉你答案。 …

【五一创作】【Mycat】Mycat2 Bugs 及修改建议(V1.22_2022-10-13)

Bug 1 : wrapper.conf 数字类型参数配置有误,多了末尾的单位 M https://wrapper.tanukisoftware.com/doc/english/prop-java-initmemory.html wrapper.log 产生警告: WARN | wrapper | 2023/04/20 22:42:00 | Encountered an invalid numerical val…

【Git 入门教程】第八节、Git流程管理

Git是一个非常流行的分布式版本控制系统,它提供了许多强大的功能来帮助开发者管理和协调代码库。在团队协作中,如何使用Git来管理开发流程是非常重要的。本文将介绍一些Git流程管理的最佳实践,包括分支策略、代码审核等。 一、分支策略 在团…

【实战】jenkins api 接口

jenkins api 接口实战 一、Jenkins Api简介二、Jenkins Api 环境准备1、获取所有job接口2、获取所有job名字接口3、获取所有job名字和url接口 三、使用curl调用 获取所有构建队列四、使用curl调用 获取Job信息五、使用curl调用操作Job1、操作Job需要验证crumba、使用token发起接…

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题,就是它的模型训练数据,迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代,相隔两小时,消息都有可能滞后,更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

eLife:情绪学习对人脑记忆整合的回溯性促进机制

所谓“一朝被蛇咬,十年怕井绳”,带有强烈情绪色彩的事件不仅令人记忆深刻,还会影响与之相关的其他事件。我们的日常生活中充满了无数平凡琐碎的小事,这些事情并不会给我们留下深刻印象。但是,当一件微不足道的小事事后…

计算机网络中常见的数据传输方式(电路交换,报文交换,分组交换)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍计算机网络中常见的数据传输方式,如电路交换,报文交换,分组交换。 如果文章有什么需要改进的地方还请大佬不吝赐教&…