DDD领域驱动设计理论篇 - 学习笔记
一、Why DDD?
在加入X公司后,开始了ASP.NET Core+Docker+Linux的技术实践,也开始了微服务架构的实践。在微服务的学习中,有一本微软官方出品的《.NET微服务:容器化.NET应用架构指南》是我们学习的葵花宝典,纵观微软官方放出来的Demo项目的演变历史(可以参见杨晓东《我眼中的ASP.NET Core微服务》一文):
(1)PetShop:WebForm 的示例程序。典型的三层架构风格的应用程序。
(2)MusicStore: 针对于 MVC3~5 框架和 EF 的一个示例程序。无明显架构风格。
(3)eShop: 针对于 ASP.NET Core 的示例程序,它是一个 REST架构风格的应用程序。
分析其架构风格的转变可以看出,现代应用程序架构已经从单一的传统风格架构(N-Layered)转向了多种混合风格架构(Mixed-Style),像最新的eShopOnWeb/Container项目就包含了以下多种架构风格:

我们可以看到,其中主要包括了以下两种架构风格(虽然看起来好像有四种):
- 基于数据驱动的CRUD微服务 (比如上图中Catalog Microservice和Basket Microservice)
- 基于DDD的微服务(比如上图中的Ordering Microservice 订单微服务)
目前,我所在的开发团队仍然在使用第一种-基于数据驱动的CRUD微服务,而要面对的业务却逐步变得复杂,已经强烈感到数据驱动的复杂度、不好维护度以及沟通成本,因此需要了解一下为复杂业务而生的DDD。不可否认,很多人是因为微服务才来了解 DDD 的(没错,说的就是我)。
来自ThoughtWorks的咨询师王威说道:在听说了微服务架构之后,人们觉得采用微服务架构会让系统开发与运维管理变得简单高效,同时实现的系统会更加合理,更加高可用、高性能,但是当他们实际去做微服务架构的时候,有不少人会发现自己做得并不好,没法取得人们“吹捧”的那些效果,“就算用了微服务架构也不能解决他们的问题,反而带来很多开发与运维上的负担”。于是他们去咨询、去找方法,最后发现其实是自己划分微服务的方法出错了,这个时候才知道人们在谈论微服务的时候,其实都没有讲到一个点:应该用 DDD 的思想去指导微服务的实践。
那么,DDD又是什么呢?
DDD 是一种在面向高度复杂的软件系统时,关于如何去建模的方法论,“它的关键点是根据系统的复杂程度,建立合适的模型”。在一个系统中,没有一个人能完全掌握系统的全貌,在多人参与的系统中,DDD 正是可以通过在不同角色之间进行协作,使参与者达成统一认知,对齐系统设计与程序实际所服务的业务领域。
摘自 ThoughtWorks资深咨询师 Alberto Brandolini

从上图中来看DDD 的一个生命周期大概是这样的:在设计和实现一个系统的时候,这个系统所要处理问题的领域专家和开发人员以一套统一语言进行协作,共同完成该领域模型的构建,在这个过程中,业务架构和系统架构等问题都得到了解决,之后将领域模型中关于系统架构的主体映射为实现代码,完成系统的实现落地。而用什么方式去做领域模型的构建,方法是多样的,看具体选择了。
这里有3个要点,借助专家之眼来看看:
首先,在 DDD 中,使用一个统一语言,可以直接将业务架构与系统架构绑定,不需要进一步去翻译,从而增强系统对业务的响应速度。
其次,DDD 关注的是要构建的系统中,关于所要解决的问题的业务、流程和数据等内容是如何工作的,在这些东西理清之后,DDD 去构建出一个模型,接着再去选择具体的实现技术。DDD 强调的是解耦具体实现技术,所以它可以迅速梳理核心业务逻辑。
最后,DDD 并不是直接给你建议某一个系统架构,它的执行结果是呈现一个方案,可以从这个构建出的模型中决定你去用什么技术来实现什么样的架构,进而来完成一个系统的设计。备选的各种技术只是像一个列表一样摆在眼前,它要根据你的领域需求来选择,比如“选择采用微服务架构”。
二、精华笔记
--下面考虑到阅读体验,将其分为两个Part的导图。
2.1 Part 1

2.2 Part 2

完整版思维导图浏览地址:点此浏览ProcessOn大图
三、后续学习
本次学习只是一个简单的DDD的相关基础理论学习,后续会阅读Scott Millett和Nick Tune编著的《领域驱动设计模式、原理与实践》一书进行深入学习,然后会研究经典DDD分层架构与eShopOnContainers示例项目中的简化DDD微服务架构,最后也会总结一下要点分享出来。

最后感谢一下圣杰的文章,总结的太好啦!
参考资料
颜圣杰,《DDD理论学习系列文章》
Alberto Brandolini、王威,《不用DDD,那你的微服务可能都做错了》
DDD领域驱动设计理论篇 - 学习笔记的更多相关文章
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- DDD 领域驱动设计-三个问题思考实体和值对象
消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...
- DDD领域驱动设计的理解
DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- DDD 领域驱动设计-两个实体的碰撞火花
上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- C#进阶系列——DDD领域驱动设计初探(一):聚合
前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...
- C#进阶系列——DDD领域驱动设计初探(四):WCF搭建
前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...
随机推荐
- 七个人生工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理、二八原则
本文为转载 心理导读:今天为大家分享几个实用的工具,来源网络. SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您 ...
- Elasticsearch 编程API入门系列---说在前面的话
前提,是 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) setting.xml配置文件 如何在Maven官网下载历史版本 HBase 开发环境搭建(Eclipse ...
- CSS层叠和继承
CSS具有两个核心的概念--继承和层叠.一般文本类的属性会被继承,即某个元素的CSS属性会传递给内部嵌套的元素.一个元素可能有一个或者多个样式的来源,当属性发生冲突时,就会根据加载顺序和权重大小决定层 ...
- centOS7固定IP
接续安装完成centOS虚拟机后,重启完成后,会出现如下的界面: 这里,我们使用root帐号和已配置的root密码进行登陆,登陆完成后,输入如下命令,运行结果如下图: dhclient 通过上述命令, ...
- 结构化您的Python工程
我们对于"结构化"的定义是您关注于怎样使您的项目最好地满足它的对象性,我们 需要去考虑如何更好地利用Python的特性来创造简洁.高效的代码.在实践层面, "结构化&qu ...
- [ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis
上一章 [ 搭建Redis本地服务器实践系列 ] :序言 作为开场白介绍了下为什么要写这个系列,从这个章节我们就开始真正的进入正题,开始搭建我们本地的Redis服务器.那么关于Redis的基本概念,什 ...
- linux dialog详解(图形化shell)
liunx 下的dialog 工具是一个可以和shell脚本配合使用的文本界面下的创建对话框的工具.每个对话框提供的输出有两种形式: 1. 将所有输出到stderr 输出,不显示到屏幕. 2 ...
- Windows 安装 Vue
引言 在公司 linux 环境下安装不顺利,回家在 windows 下操作感觉到一种幸福 nginx 先安装了 nginx,其实跟 vue 没关系,只是打算用它做 web 服务,此处略过 nginx ...
- MySQL,简单了解下、
第一章 数据备份与导入导出 1.1.备份基本概念介绍 1.2.mysqldump详解 1.3.mydumper浅析 1.4.MySQL物理备份基本操作 1.5.了解mysqlpump工具 1.6.数据 ...
- Scrapy 1.4 文档 02 安装指南
安装 Scrapy Scrapy 运行在 Python 2.7 和 Python 3.3 或更高版本上. 如果您使用的是 Anaconda 或 Miniconda,则可以从 conda-forge 通 ...