一、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项目就包含了以下多种架构风格:

  我们可以看到,其中主要包括了以下两种架构风格(虽然看起来好像有四种):

  1. 基于数据驱动的CRUD微服务 (比如上图中Catalog Microservice和Basket Microservice)
  2. 基于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,那你的微服务可能都做错了》

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

DDD领域驱动设计理论篇 - 学习笔记的更多相关文章

  1. 关于DDD领域驱动设计的理论知识收集汇总

    原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...

  2. DDD 领域驱动设计-三个问题思考实体和值对象

    消息场景:用户 A 发送一个消息给用户 B,用户 B 回复一个消息给用户 A... 现有设计:消息设计为实体并为聚合根,发件人.收件人设计为值对象. 三个问题: 实体最重要的特性是什么? Messag ...

  3. DDD领域驱动设计的理解

    DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...

  4. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  5. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

  6. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  7. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  8. C#进阶系列——DDD领域驱动设计初探(一):聚合

    前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的.今天看到一篇博文里面写道:越是忙人越有时间写博客.呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的 ...

  9. C#进阶系列——DDD领域驱动设计初探(四):WCF搭建

    前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...

随机推荐

  1. 在Windows上安装FFmpeg程序的方法(you-get下载视频必备程序)

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...

  2. Flask类的属性和方法大全

    Flask Property__class____dict____doc____module__app_ctx_globals_classconfig_classdebugdefault_config ...

  3. LocalDB + IIS

    Win7 + IIS7 1. 安装 (1)LocalDB SQL Express 2012 选中:ENU\x64\SqlLocalDB.MSI (2).net4.5 .net4.5 然后,再配置IIS ...

  4. birt4.6部署到tomcat及启动服务报错解决方法

    一.下载birt-runtime-4.6.0-20160607.zip包 解压后birt-runtime-4.6.0-20160607\WebViewerExample将WebViewerExampl ...

  5. ORA-01658: 无法为表空间 YJXT 中的段创建 INITIAL 区

    oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ...

  6. 记一次webpack打包优化

    未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...

  7. 洛谷 P1272 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  8. 关于overfit的随笔

    看到@ 爱可可-爱生活转发的文章.稍微看了下,在这里记录下. overfit是机器学习的一个重要概念.在狭义上可以定义为模型过于复杂,导致模型的generalization不够好.我认为应采用一个更广 ...

  9. 【转】JavaScript的异常处理

    当 JavaScript 引擎执行 JavaScript 代码时,有可能会发生各种异常,例如是语法异常,语言中缺少的功能,由于来自服务器或用户的异常输出而导致的异常. 而 Javascript 引擎是 ...

  10. Maven install命令理解

    每一个构建都需要唯一的坐标来标识位置,我们根据坐标位置就能够下载构建至本地仓库.那么如果我们是内部项目,自定义的构建并不公开至网络上,项目成员又想依赖他怎么办呢?想想maven找寻构建的步骤. 先找寻 ...