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

640?wx_fmt=png

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

  1. 基于数据驱动的CRUD微服务 (比如上图中Catalog Microservice和Basket Microservice)

  2. 基于DDD的微服务(比如上图中的Ordering Microservice 订单微服务)

  目前,我所在的开发团队仍然在使用第一种-基于数据驱动的CRUD微服务,而要面对的业务却逐步变得复杂,已经强烈感到数据驱动的复杂度、不好维护度以及沟通成本,因此需要了解一下为复杂业务而生的DDD。不可否认,很多人是因为微服务才来了解 DDD 的(没错,说的就是我)。

  来自ThoughtWorks的咨询师王威说道:在听说了微服务架构之后,人们觉得采用微服务架构会让系统开发与运维管理变得简单高效,同时实现的系统会更加合理,更加高可用、高性能,但是当他们实际去做微服务架构的时候,有不少人会发现自己做得并不好,没法取得人们“吹捧”的那些效果,“就算用了微服务架构也不能解决他们的问题,反而带来很多开发与运维上的负担”。于是他们去咨询、去找方法,最后发现其实是自己划分微服务的方法出错了,这个时候才知道人们在谈论微服务的时候,其实都没有讲到一个点:应该用 DDD 的思想去指导微服务的实践

  那么,DDD又是什么呢?

DDD 是一种在面向高度复杂的软件系统时,关于如何去建模的方法论,“它的关键点是根据系统的复杂程度,建立合适的模型”。在一个系统中,没有一个人能完全掌握系统的全貌,在多人参与的系统中,DDD 正是可以通过在不同角色之间进行协作,使参与者达成统一认知,对齐系统设计与程序实际所服务的业务领域

摘自 ThoughtWorks资深咨询师 Alberto Brandolini

640?wx_fmt=jpeg

  从上图中来看DDD 的一个生命周期大概是这样的:在设计和实现一个系统的时候,这个系统所要处理问题的领域专家和开发人员以一套统一语言进行协作,共同完成该领域模型的构建,在这个过程中,业务架构和系统架构等问题都得到了解决,之后将领域模型中关于系统架构的主体映射为实现代码,完成系统的实现落地。而用什么方式去做领域模型的构建,方法是多样的,看具体选择了。

  这里有3个要点,借助专家之眼来看看:

  首先,在 DDD 中,使用一个统一语言,可以直接将业务架构与系统架构绑定,不需要进一步去翻译,从而增强系统对业务的响应速度。

  其次,DDD 关注的是要构建的系统中,关于所要解决的问题的业务、流程和数据等内容是如何工作的,在这些东西理清之后,DDD 去构建出一个模型,接着再去选择具体的实现技术。DDD 强调的是解耦具体实现技术,所以它可以迅速梳理核心业务逻辑。

  最后,DDD 并不是直接给你建议某一个系统架构,它的执行结果是呈现一个方案,可以从这个构建出的模型中决定你去用什么技术来实现什么样的架构,进而来完成一个系统的设计。备选的各种技术只是像一个列表一样摆在眼前,它要根据你的领域需求来选择,比如“选择采用微服务架构”。

二、精华笔记

--下面考虑到阅读体验,将其分为两个Part的导图。

2.1 Part 1

640?wx_fmt=png

2.2 Part 2

640?wx_fmt=png

完整版思维导图浏览地址:点此浏览ProcessOn大图

三、后续学习

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

  最后感谢一下圣杰的文章,总结的太好啦!

参考资料

颜圣杰,《DDD理论学习系列文章

Alberto Brandolini、王威,《不用DDD,那你的微服务可能都做错了

原文地址:

https://www.cnblogs.com/edisonchou/p/edc_ddd_foundation_study_notes.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


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

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

相关文章

Intervals on the Ring

Intervals on the Ring 题意: 给出环上的一组区间,需要构造环上的一组区间使得这些区间的交是给定的区间的并 题解: 集合的摩尔定理告诉我们:∪Ai‾∩Ai‾\overline{\cup A_{i}}\cap\overline{A_{i}}∪Ai​​∩Ai​​&#xf…

CodeForces 516E Drazil and His Happy Friends(数学+最短路)

problem 洛谷链接 solution 记 gcd⁡(n,m)d\gcd(n,m)dgcd(n,m)d,则快乐只会在同余 ddd 的关系中传递。 ixn≡ixs⋅d≡i(modd),iym≡iyt⋅d≡i(modd)ixn\equiv ixsd\equiv i\pmod d,iym\equiv iytd\equiv i\pmod dixn≡ixs⋅d≡i(modd),iym≡iyt⋅d≡i(modd)。 所…

.NetCore使用skywalking实现实时性能监控

一、简介很久之前写了一篇 《.Net Core 2.0 InfluxDBGrafanaApp Metrics 实现跨平台的实时性能监控》关于NetCore性能监控的文章,使用InfluxdbAppMetrics进行项目性能监控,由于技术有限,在正式环境使用一段时间后,莫名的AppMetric…

Hamburger Steak

Hamburger Steak 题意: 有m个锅,n块肉,每个肉需要煎ai分钟才能熟,每个锅同时最多煎一块肉,一块肉最多可以被两个锅煎(但不能同时),问最少多长时间能全部煎熟,并输出方案 题解: 我…

「ROI 2017 Day 2」反物质(单调队列优化dp)

problem LOJ2772 solution 这道题求的是“保证最多”,这个“保证”真的屑啊! 因为我们无法确定实验生成的克数,所以我们应当计算的是最坏情况。 又因为我们可以选择做哪些实验,所以要的是所有实验组合最坏情况下的最大价值。…

netcore开发windows普通服务(非Web)并一键发布到服务器

netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run改为host.RunAsService就可以了。但是普通的netcore的控制台项目我终于找到了如下方式来实现:Microsoft.Extensions.HostingSystem.ServiceProcess.S…

Hopping Rabbit

Hopping Rabbit 题意: 给你n个矩阵,每个矩阵(给出左上标和右下标),现在让你给出一个点的位置,这个点每次只能上下左右四个方向移动,且移动距离为d,是否存在一个这样的点,其所有落点都不在矩阵…

删好串(区间dp)

problem 定义长度为 nnn 的“好”的串 aaa 满足: ∣ai−ai−1∣1,i∈[2,n]|a_i-a_{i-1}|1,i\in[2,n]∣ai​−ai−1​∣1,i∈[2,n]。ai≥ai−1ai12,i∈[2,n−1]a_i\ge \frac{a_{i-1}a_{i1}}{2},i\in[2,n-1]ai​≥2ai−1​ai1​​,i∈[2,n−1]。 给定长度为 nnn 的序…

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境,已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具,微软自己给Visual Studio 的定位是 “更快、更可靠,对个人和团队更具生产力,更易于使用,并且更容易…

Delete Edges

Delete Edges 题意&#xff1a; 给出一个n个点的完全图&#xff0c;删一些三元环使得边数<n 输出所删的三元环 3<n<2000 题解&#xff1a; 肯定是结论题&#xff0c;但是我不会。。 结论&#xff1a;xyz0(mod n)1<x<y<z<n所有解即可 证明过程可以看看…

.NET 机器学习生态调查

机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习&#xff0c;计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和设备更智能。 在线购物时&#xff0c;机器学习基于历史购买推荐你可能喜欢的其他产品。 刷信用…

图中异色点对最短距离(最小生成树+线段树)

problem 给定一个 nnn 个点&#xff0c;mmm 条边的无向连通图&#xff0c;图有边权&#xff0c;每个点有一个颜色。 有 qqq 次操作&#xff0c;每次操作可更改某一个点颜色。 求每次操作后图中不同颜色点之间的最短距离。 若图中点颜色全相同&#xff0c;输出 000。 一行给…

Defend Your Country

Defend Your Country 题意&#xff1a; n个点&#xff0c;m条边的简单无向连通图&#xff0c;每个点一个权值ai,一个连通块的贡献&#xff1a;(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内] 可以…

SkyWalking Liunx 环境搭建NetCore接入

背景前两天看见有小哥介绍windows下安装skywalking的介绍地址。正好最近也在搭建linux环境的SkyWalking&#xff0c;顺便把linux环境搭建的经验分享下&#xff0c;帮助下使用linux部署DotNetCore项目的同学。介绍SkyWalking是开源的apm工具&#xff0c;服务器端使用java编写&am…

AtCoder 2305 [AGC010D] Decrementing(博弈)

problem Luogu链接 solution case1&#xff1a;aaa 中如果有 111 的存在&#xff0c;那么相当于第二步失效&#xff0c;最后的结果仅由 ∑ai−1\sum a_i-1∑ai​−1 的奇偶性决定&#xff08;奇数先手赢&#xff0c;偶数后手赢&#xff09; 奇数先手赢&#xff0c;偶数后手…

P4568 [JLOI2011]飞行路线

P4568 [JLOI2011]飞行路线 题意&#xff1a; n个城市&#xff0c;m个航班&#xff0c;你有k次免费坐航班的机会&#xff0c;问从s到t最少花费是多少&#xff1f; 题解&#xff1a; 分层图问题 简单说说什么是分层图&#xff1a; 其实就是将一个平面的图重新建图&#xff0c…

.NET 基金会完成第一次全面改选

.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目指导&#xff0c;指导&#xff0c;法律和营销帮助&#xff0c;技术和财务支持设置等&#xff0c;2014年微软组织成立.NET…

一般图带权多重匹配(欧拉图+最小费用流)

problem 给定 nnn 个数 {ai}\{a_i\}{ai​}&#xff0c;其中 kkk 个 aia_iai​ 是奇数&#xff0c;再给一个 nnn\times nnn 的矩阵 {ci,j}\{c_{i,j}\}{ci,j​}&#xff0c;无论是 aaa 还是 ccc&#xff0c;都保证是非负整数。 现在可以做一类操作&#xff1a;将 ai−1,aj−1a_…

xay loves trees

xay loves trees 题意&#xff1a; 有两棵树&#xff0c;现在让你找到一个最大的点集合S&#xff0c;要求S中的点在第一棵树中任意两点存在祖先儿子关系且所有点是连接的&#xff0c;在第二棵树中任意两点都不存在祖先儿子关系&#xff0c;问S集合的最大是多少&#xff1f; …

特来电混沌工程实践

一、导语随着大型分布式系统架构的演进和广泛应用&#xff0c;软件工程的最佳实践也随之改变。我们通过分布式、服务化、DevOps、敏捷开发&#xff0c;快速响应业务的需求变化&#xff0c;支持大规模分布式应用。但这些做法带来效益的同时&#xff0c;也带来了另一个紧迫问题&a…