软件架构技术4:DDD领域驱动架构设计三大核心思想

领域驱动设计核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。这几年之所以开始火起来,主要功劳要归功于队友“微服务”,领域驱动设计与微服务架构天生匹配。

领域驱动设计(DDD)是一种处理高度复杂域的设计思想,试图分离技术实现的复杂性,围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演化等问题。团队利用它可以成功的开发复杂业务软件系统,在系统变大时仍能保持敏捷性。

领域驱动设计分为两个阶段:

领域驱动设计的核心诉求是让业务架构和系统架构形成绑定关系,当我们去响应业务变化调整业务架构时,系统架构的改变也会随之发生。在领域驱动设计中业务架构的梳理和系统架构的梳理是同步进行的,其结果是设计出的业务上下文和系统模块结构是绑定的。同时技术架构也是解耦的,可以根据划分出来的业务上下文的系统架构选择最合适的实现技术。

领域驱动设计可能会给你带来以下收获:

1、领域驱动设计是一套完整而系统的设计方法,它能带给你从战略设计到战术设计的规范过程,使得你的设计思路能够更加清晰,设计过程更加规范。

3、领域驱动设计强调团队与领域专家的合作,能够帮助团队建立一个沟通良好的团队组织,构建一致的架构体系。领域驱动设计强调对架构与模型的精心打磨,尤其善于处理系统架构的演进设计。

4、领域驱动设计的思想、原则与模式有助于提高团队成员的架构设计能力。

5、领域驱动设计与微服务架构天生匹配,无论是在新项目中设计微服务架构,还是将系统从单体架构演进到微服务设计,都可以遵循领域驱动设计的架构原则。

在研究和解决业务问题时,DDD会按照一定的规则将业务领域进行细分,当领域细分到一定的程度后,DDD会将问题范围限定在特定的边界内,在这个边界内建立领域模型,进而用代码实现该领域模型,解决相应的业务问题。简言之,DDD的领域就是这个边界内要解决的业务问题域。

领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或更小的业务范围。

领域的核心思想就是将问题域逐级细分,来降低业务理解和系统实现的复杂度。通过领域细分,逐步缩小服务需要解决的问题域,构建合适的领域模型。

举个简单的例子,对于保险领域,我们可以把保险细分为承保、收付、再保以及理赔等子域,而承保子域还可以继续细分为投保、保全(寿险)、批改(财险)等子子域。

通用语言也有它的上下文环境,为了避免同样的概念或语义在不同的上下文环境中产生歧义,DDD在战略设计上提出了“限界上下文”这个概念,用来确定语义所在的领域边界。

限界上下文是一个显式的语义和语境上的边界,领域模型便存在于边界之内。边界内,通用语言中的所有术语和词组都有特定的含义。把限界上下文拆解开看,限界就是领域的边界,而上下文则是语义环境。

通过领域的限界上下文,我们就可以在统一的领域边界内用统一的语言进行交流

聚合:我们把一些关联性极强、生命周期一致的实体、值对象放到一个聚合里。聚合是领域对象的显式分组,旨在支持领域模型的行为和不变性,同时充当一致性和事务性边界。

聚合在DDD分层架构里属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑。跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现。

如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。首先它作为实体本身,拥有实体的属性和业务行为,实现自身的业务逻辑。其次它作为聚合的管理者,在聚合内部负责协调实体和值对象按照固定的业务规则协同完成共同的业务逻辑。

当一些逻辑不属于某个实体时,可以把这些逻辑单独拿出来放到领域服务中,理想的情况是没有领域服务,如果领域服务使用不恰当,慢慢又演化回了以前逻辑都在service层的局面。

可以使用领域服务的情况:

应用层作为展现层与领域层的桥梁,是用来表达用例和用户故事的主要手段。

应用层通过应用服务接口来暴露系统的全部功能。在应用服务的实现中,它负责编排和转发,它将要实现的功能委托给一个或多个领域对象来实现,它本身只负责处理业务用例的执行顺序以及结果的拼装。通过这样一种方式,它隐藏了领域层的复杂性及其内部实现机制

应用层相对来说是较“薄”的一层,除了定义应用服务之外,在该层我们可以进行安全认证,权限校验,持久化事务控制,或者向其他系统发生基于事件的消息通知,另外还可以用于创建邮件以发送给客户等

领域事件=事件发布+事件存储+事件分发+事件处理。

下面简单说明领域事件:

比如下订单后,给用户增长积分与赠送优惠券的需求。如果使用瀑布流的方式写代码。一个个逻辑调用,那么不同用户,赠送的东西不同,逻辑就会变得又臭又长。

这里的比较好的方式是,用户下订单成功后,发布领域事件,积分聚合与优惠券聚合监听订单发布的领域事件进行处理

二、领域驱动设计三大核心思想

1、领域模型驱动架构

限定上下文,我理解下来就是能够实施统一语言的一个范围。所谓上下文,就是保持理解的一致。比如利润,在财务系统中利润包含成本、收入、计算方法等,是个很重要的Entity。而在商品系统中,它只是商品的一个属性,商品只需要利润的一个总值而已。这里我们所说利润在财务与商品两个上下文中有不同的含义。再说一下限定上下文与微服务。限定上下文是对于领域的划分,在一个限定上下文大家对模型的理解一致就行。而微服务更多是对应用的拆分。多个微服务应用,可以在一个限定上下文里面,比如财务域限定上下文,里面可以有结算服务、计费服务等。再者就是模块与限定上下文的区分,限定上下文就不说了,模块更多的时指一下命令空间,不管是应用代码中的模块,还是业务上的模块,都是给代码或者业务加上一个空间范围。

限界上下文划分规则

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

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

领域驱动设计的四重边界

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

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

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

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

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

2、SOA和横向分层

为什么领域驱动设计是微服务架构的最佳设计方法?

领域驱动设计作为一种架构设计方法,微服务作为一种架构风格,两者从本质上都是为追求高响应力目标而从业务视角去分离复杂度的手段。两者都强调从业务出发,其核心要义强调根据业务发展,合理划分领域边界,持续调整现有架构,优化现有代码,以保持架构和代码的生命力(演进式架构)。

如果你的业务焦点在领域和领域逻辑,那么你就可以选择DDD进行微服务架构设计。

严格分层架构:某层只能与直接位于的下层发生耦合

松散分层架构:允许上层与任意下层发生耦合

在领域驱动设计(DDD)中采用的是松散分层架构,层间关系不那么严格。每层都可能使用它下面所有层的服务,而不仅仅是下一层的服务。每层都可能是半透明的,这意味着有些服务只对上一层可见,而有些服务对上面的所有层都可见。

主动适配:指来于UI、命令等输型命令,controller就是种端,端的具体实现就是应逻辑身。因此端和具体实现都在应系统的内部。

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

每种输和输出都是个端,每个端都有具体的实现逻辑,因此整个应系统的架构就是些列的端+适配逻辑组成,架构图就是个多边形形状。有个端需要根据应系统的具体情况定,只是六个端较形象得名为六边形架构。

特点:

1.外层依赖内层使得依赖更合理。端就是接,依赖接编程。借此保证了应和实现细节之间的隔离。

2.可测试更好

3、EDA事件驱动架构

事件驱动架构

光从作法来看,EDA与传统架构的区别主要在于将传统架构处理数据库变更或者DDD中处理模型的变更转化成一个个标准的事件,至于事件的消费、事件的追溯则有具体的服务完成。

在《实现领域驱动设计》一书中提出采用EDA结合六边形架构的思路。

一个系统的输出端口所发出的领域事件将被发送到另一个系统的输人端口,此后输人端口的事件订阅方将对事件进行处理。对于不同的BC来说,不同的领域事件具有不同含义。在一个BC处理某个事件时,应用程序API将采用该事件中的属性值来执行相应的操作。

在一个多任务处理过程中,如果这个事务只有在所有的参与事件都得到处理之后,我们才能认为这个多任务处理过程完成了,某种领域事件只能表示该过程中的一部分。这时候这个过程的处理就需要结合其他架构进行处理。如果处理事件和消息在下面章节做介绍。

THE END
1.设计模式学习笔记本章,先来回顾下整个专栏的知识体系,主要包括面向对象、设计原则、编码规范、重构技巧、设计模式五个部分。 面向对象 相对于面向过程、函数式编程,面向对象是现在最主流的编程范式。纯面向过程的编程方法,现在已经不多见了,而新的函数式编程,因为它的应用场景比较局限,所以大多作为面向对象编程的一种补充,用在科学技https://blog.csdn.net/chenjian723122704/article/details/138358499
2.软件设计思想与流程9篇(全文)软件设计思想与流程 第1篇 关键词:CAI:计算机辅助教学,超链接,交互 1 教学系统软件的设计原则 一个优秀的CAI计算机辅助教学系统软件应充分地发挥计算机多媒体的特点, 在制作过程中应注重视听教学的特征, 突出启发教学, 还应注重教学过程的科学性和合理性, 应做到构图合理、美观, 画面清晰、稳定, 色彩分明、色调悦目https://www.99xueshu.com/w/ikeyfqfio8gg.html
3.了解这些软件设计思想,你的思维至少上升一个段位设计模式其实不是一项新技术,而是众多软件开发人员经过相当长的一段时间的试用和试错总结出来的一套软件设计开发实践方案,学习这些知识有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。 本文转载自微信公众号「Java极客技术」,作者鸭血粉丝。转载本文请联系Java极客技术公众号。 https://www.51cto.com/article/675861.html
4.软件设计思想与流程(精选十篇)针对软件开发项目人工成本管理中存在的问题, 主要解决思路是, 学习掌握先进的估算方法, 依据即将颁布的行业估算标准, 进行科学的估算, 从源头上控制人工成本基准, 并在此基础上设计控制流程, 在各个环节设置明确的控制点, 通过信息系统保障管理思想落地实施。具体如下: 2.1 跟踪行业标准, 掌握标准内容, 在实际估算操https://www.360wenmi.com/f/cnkeyr5z9i3q.html
5.设计模式概述以上五个原则是设计模式的基础,它们为我们提供了设计软件的指导思想。在实际的软件开发中,我们应该尽可能的遵循这些原则,以提高软件的可维护性、可复用性和可扩展性。 设计模式的分类 设计模式可以分为三大类:创建型、结构型和行为型。 创建型模式 单例模式:确保一个类只有一个实例,并提供一个全局访问点。 https://www.jianshu.com/p/376798f7804e
6.软件工程导论作业1.7 软件过程的通用过程框架包含哪两类活动? 答:一类是框架活动,还有一类是保护性活动。 1.8 描述基于构件开发的思想以及目前的发展情况。 答:基于构件开发强调将被设计的系统分解成功能的或逻辑的构件,构件用定义好的接口进行通信。 它是现在软件复理论实用化的研究热点,在构件对象模型的支持下,通过复用已有的构件,https://www.unjs.com/zuixinxiaoxi/ziliao/20170805000008_1416273.html
7.软件架构设计的思想与模式◆中科院计算所培训中心 高级软件系统架构师培训 软件架构设计的思想与模式 中科院计算所培训中心 谢新华 第一章 软件架构设计思想与体系创建 在软件组织中,架构师的作用是举足轻重的。本课程针对企业开发最关注的问题深入研讨,抓住投入产出比这个企业的核心价值,讨论架构设计如何使这个核心价值得以实现。我们认为,一个https://doc.mbalib.com/view/427991202f65834e2051e167ce09573b.html
8.教学软件开发思想和模式三、传统媒体的开发思想和模式是问题产生的根源 辅助教学软件所运用的是软件技术,是一个有别于传统媒体技术的交互式系统。但就目前的计算机辅助教学软件开发的主流理论来看,却较少运用软件工程理论,而是遵循普通媒体制作的基本方法,集中体现在对“脚本”的重视。其开发模式可以表述为“教学设计——脚本编写——编码实现https://www.fwsir.com/jy/html/jy_20070401201421_32195.html
9.阿里技术专家:架构制图方法论康威定律指出,软件架构反映了组织结构。这个结论反过来也成立:好的架构也会让组织结构变得更高效。 越庞大和复杂的系统,架构越重要,因为只有好的架构才能有效控制、管理和降低系统复杂度。 是不是越听越糊涂,仿佛架构有无数种诠释和意义?不必过于纠结,按照GoF的设计模式所述:Architecture is about the important stuffhttps://www.easemob.com/news/5399
10.软件工程专业培养方案(2022)毕业要求3(设计/开发解决方案):能够设计针对软件工程领域复杂工程问题的解决方案,设计和开发满足特定需求的软件系统、模块,并能够在设计环节中体现创新意识,考虑社会、健康、安全、法律、文化以及环境等因素。 3.1 掌握软件工程设计和产品开发的全周期、各流程的基本理论和方法和技术,并了解影响设计目标和技术方案的各种制https://www.csust.edu.cn/jtxy/info/1302/20908.htm
11.进阶必看!大厂设计超爱用的敏捷开发指南优设网传统的开发模式,像瀑布模型、喷泉模型、螺旋模型等等,虽然有不断的进化与创新,但始终没有一款能快速、灵活地适应市场变化。进而发展了很多轻量化的软件开发方法,比如 Scrum、水晶清透法、极限编程法等等,它们都起源于敏捷开发宣言之前,但都统称为敏捷软件开发法,因为他们都是迭代和增量式的开发。 https://www.uisdc.com/agile-development-guide
12.2020级五年制人才培养方案引导学生掌握马克思主义的相关基本观点和我国社会主义经济建设、政治建设、文化建设、社会建设的有关知识;提高思想政治素质,坚定走中国特色社会主义道路的信念;提高辨析社会现象、主动参与社会生活的能力。方法: 1.启发式教学方法 2.讨论式教学方法 3.情景教学法 http://www.jxxdjsxy.com/jiaowuzaixian/zhuanyeshezhi/2022-06-19/8135.html
13.信息管理系统中系统集成技术的应用论文(通用7篇)1.1设计思想 超市信息管理系统的设计思想主要分为以下几个方面:首先是为避免员工之间的冒名顶替,身份识别应用指纹识别技术,采集员工的指纹信息,当处理出货、入货或盘点业务时,要验证员工的指纹信息。其次是设置和管理不同管理级别员工的权限,建立不同数据表,建立专门员工数据库。最后是无线网络技术采用数据实时传输,以保https://www.yjbys.com/bylw/guanlixue/155033.html
14.软件架构设计的思想与模式中文PDF版电子书下载重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断 解压密码:www.jb51.net或者0daydown,希望大家看清楚,[分享码的获取方法]可以参考这篇文章 软件架构设计的思想与模式 中文PDF版 使用鲁大师安全下载 电信安全下载 https://www.jb51.net/books/508629.html
15.计算机教室工作计划(精选12篇)(3)课时监督:上课过程中监督好每位学生的`使用情况,如有不按要求练习,而是去运行其它软件或进行其它操作的,马上给予批评警告,以防止学生乱删除,乱操作,导致计算机系统崩溃现象。 3、建设“绿色机房”和“无游戏机房”,对学校机房建立“绿色机房”,学校计划,除上信息技术课外,每周有计划的对学生开放,为广大学生提供健https://www.yuwenmi.com/fanwen/jihua/3317397.html
16.《软件工程与UML》课程教学中融入思政元素三、《软件工程与UML》课程思政具体课程设计举例 笔者以《软件测试》这一章节为例,举例说明怎么实现我们的思政课堂课程设计。《软件测试》主要讲述了软件测试的目的,原则和方法。 我们的课程设计是把社会责任和爱国情怀融入到了我们的课程教学中。 在讲软件测试的目的的时候,老师会举例说明软件缺陷,造成的严重问题,增强https://www.fx361.com/page/2021/1202/9346542.shtml
17.研发部工作总结十五篇学习先进的系统分析和设计的思想,可以完成更高质量要求的软件项目;学习各种体系结构优缺点及适应情况,可以设计出满足系统需求的软件体系结构;学习国外成功的设计模式,可以使代码的编写满足更高质量的需求。 (九)、建立新技术预研机制: 明确团队成员的优势技术组成结构,建立技术知识体系。确立每个技术研究方向,并责任至每个https://www.diyifanwen.com/fanwen/gongzuozongjie2/14383725.html
18..NET中SerialPort类在短信收发软件中的应用AET.NET中SerialPort类在短信收发软件中的应用 摘要:介绍了SerialPort类常用的属性和方法,对操作无线通信模块M1206的主要AT命令格式及功能进行了描述,针对短信传输采用的PDU数据格式单元及编码方式进行了阐述,重点论述了在C#语言中,使用SerialPort类发送短信的程序设计思想和实现方法。在网络应用程序开发中,使用短信收发功能http://www.chinaaet.com/article/208378
19.网络设计方案(通用15篇)为有力保证事情或工作开展的水平质量,通常需要提前准备好一份方案,方案是阐明具体行动的时间,地点,目的,预期效果,预算及方法等的企划案。方案的格式和要求是什么样的呢?下面是小编帮大家整理的网络设计方案,欢迎大家借鉴与参考,希望对大家有所帮助。 网络设计方案 1 https://www.ruiwen.com/shejifangan/8180085.html
20.DPC驱动模块和性能监控系统的功能及如何实现应用设计4.1 软件设计思想 ARM控制器在整个性能监控系统中起着十分重要的作用。一方面,要向DPC发送以一定间隔递增的数据信号(0~4095);另一方面,又要接收AD检测光强后转换出来的数据,并将其传送给计算机,供专门软件描绘半波电压曲线。ARM控制器的软件流程图,如图4所示。 https://www.elecfans.com/d/1547799.html
21.书单8月新书速递!首先,立足于并发程序基础,详细介绍Java中进行并行程序设计的基本方法。其次,进一步详细介绍了JDK中对并行程序的强大支持,帮助读者可以快速、稳健地进行并行程序开发。再次,详细讨论了有关”锁”的优化和提高并行程序性能级别的方法和思路。第四,介绍了并行的基本设计模式以及Java 8、9、10对并行程序的支持和改进。第五http://www.broadview.com.cn/article/420192
22.关于印发《国家生态工业示范园区申报命名和管理规定(试行)》等用生态工业思想改造现有经济技术开发区和高新技术开发区。在现有园区内引进生态工业和循环经济理念,采用生命周期观点和生态设计方法,使产品生命周期中资源消耗最少、废物产生最小、易于拆卸回收,由此优化产品结构,并合理构建和完善产品链,从而提高资源效率,降低环境排放,为园区寻找新的增长点,促进园区的持续发展。对新建的https://www.mee.gov.cn/gkml/zj/wj/200910/t20091022_172253.htm
23.关于改进方案合集5篇①让学生台灯设计的展示与评价中,在交流讨论中,表达设计思想,提升学生的语言表达能力,感受创意的精彩,认识到设计的灵感来源于生活。 ②了解对设计成果评价的目的性与必要性,知道评价的基本方法,进一步体会评价的原则。 ③了解交流的目的与方式,理解设计过程需要不断优化。 https://www.oh100.com/a/202210/5469349.html