领域驱动模型设计-进阶

08.领域驱动设计:深入理解领域模型的核心概念 领域驱动设计(DDD):深入理解领域模型的核心概念 领域模型是领域驱动设计(DDD)中的核心概念之一,它是对业务领域的概念、实体、规则和行为的抽象表示。 领域模型通过使用领域对象、实体、值对象、聚合根、领域服务等概念,进行描述业务领域的核心概念和关系。 阅读详情

文章内容摘自:欧创新老师的DDD实战课

06 | 领域事件:解耦微服务的关键

重要知识点整理

领域事件

  • 什么事领域事件:这种事件发生后通常会导致进一步的业务操作,在 DDD 中这种事件被称为领域事件。比如投保业务缴费完成后,触发投保单转保单的动作;也可能是定时批处理过程中发生的事件,比如批处理生成季缴保费通知单,触发发送缴费邮件通知操作;或者一个事件发生后触发的后续动作,比如密码连续输错三次,触发锁定账户的动作。
  • 如何识别领域事件:在做用户旅程或者场景分析时,我们要捕捉业务、需求人员或领域专家口中的关键词:“如果发生……,则……”“当做完……的时候,请通知……”“发生……时,则……”等。在这些场景中,如果发生某种事件后,会触发进一步的操作,那么这个事件很可能就是领域事件。
  • 聚合的一个设计原则:在边界之外使用最终一致性。一次事务最多只能更改一个聚合的状态。如果一次业务操作涉及多个聚合状态的更改,应采用领域事件的最终一致性。在领域模型映射到微服务系统架构时,领域事件可以解耦微服务,微服务之间的数据不必要求强一致性,而是基于事件的最终一致性。
  • 微服务内的领域事件:高实时性场景,采用编排和组合的方式。实时性不高的场景,使用消息总线的方式。
  • 微服务之间的领域事件:跨微服务的领域事件会在不同的限界上下文或领域模型之间实现业务协作,其主要目的是实现微服务解耦,减轻微服务之间实时服务访问的压力。跨微服务的事件机制要总体考虑事件构建、发布和订阅、事件数据持久化、消息中间件,甚至事件数据持久化时还可能需要考虑引入分布式事务机制等。微服务之间的访问也可以采用应用服务直接调用的方式,实现数据和服务的实时访问,弊端就是跨微服务的数据同时变更需要引入分布式事务,以确保数据的一致性。分布式事务机制会影响系统性能,增加微服务之间的耦合,所以我们还是要尽量避免使用分布式事务。
  • 领域事件解耦微服务案例:

 

通过领域事件驱动的异步化机制,可以推动业务流程和数据在各个不同微服务之间的流转,实现微服务的解耦,减轻微服务之间服务调用的压力,提升用户体验。

领域事件总体架构

 

  • 事件构建和发布:事件基本属性至少包括:事件唯一标识、发生时间、事件类型和事件源,其中事件唯一标识应该是全局唯一的,以便事件能够无歧义地在多个限界上下文中传递。事件基本属性主要记录事件自身以及事件发生背景的数据。另外事件中还有一项更重要,那就是业务属性,用于记录事件发生那一刻的业务数据,这些数据会随事件传输到订阅方,以开展下一步的业务操作。事件发布的方式有很多种,你可以通过应用服务或者领域服务发布到事件总线或者消息中间件,也可以从事件表中利用定时程序或数据库日志捕获技术获取增量事件数据,发布到消息中间件。
  • 事件数据持久化:事件数据持久化可用于系统之间的数据对账,或者实现发布方和订阅方事件数据的审计。当遇到消息中间件、订阅方系统宕机或者网络中断,在问题解决后仍可继续后续业务流转,保证数据的一致性。事件数据持久化有两种方案,在实施过程中你可以根据自己的业务场景进行选择。持久化到本地业务数据库的事件表中,利用本地事务保证业务和事件数据的一致性。持久化到共享的事件数据库中。这里需要注意的是:业务数据库和事件数据库不在一个数据库中,它们的数据持久化操作会跨数据库,因此需要分布式事务机制来保证业务和事件数据的强一致性,结果就是会对系统性能造成一定的影响。
  • 事件总线:事件总线是实现微服务内聚合之间领域事件的重要组件,它提供事件分发和接收等服务。事件总线是进程内模型,它会在微服务内聚合之间遍历订阅者列表,采取同步或异步的模式传递数据。事件分发流程大致如下:如果是微服务内的订阅者(其它聚合),则直接分发到指定订阅者;如果是微服务外的订阅者,将事件数据保存到事件库(表)并异步发送到消息中间件;如果同时存在微服务内和外订阅者,则先分发到内部订阅者,将事件消息保存到事件库(表),再异步发送到消息中间件。
  • 消息中间件:跨微服务的领域事件大多会用到消息中间件,实现跨微服务的事件发布和订阅。
  • 事件接收和处理:微服务订阅方在应用层采用监听机制,接收消息队列中的事件数据,完成事件数据的持久化后,就可以开始进一步的业务处理。领域事件处理可在领域服务中实现。

 

 

07 | DDD分层架构:有效降低层与层之间的依赖

重要知识点整理

什么是 DDD 分层架构?

  • DDD分层架构如下:从上到下依次是:用户接口层、应用层、领域层和基础层。

 

  • 用户接口层:用户接口层负责向用户显示信息和解释用户指令。这里的用户可能是:用户、程序、自动化测试和批处理脚本等等。
  • 应用层:应用层是很薄的一层,理论上不应该有业务规则或逻辑,主要面向用例和流程相关的操作。但应用层又位于领域层之上,因为领域层包含多个聚合,所以它可以协调多个聚合的服务和领域对象完成服务编排和组合,协作完成业务操作。此外,应用层也是微服务之间交互的通道,它可以调用其它微服务的应用服务,完成微服务之间的服务组合和编排。这里我要提醒你一下:在设计和开发时,不要将本该放在领域层的业务逻辑放到应用层中实现。因为庞大的应用层会使领域模型失焦,时间一长你的微服务就会演化为传统的三层架构,业务逻辑会变得混乱。另外,应用服务是在应用层的,它负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装,以粗粒度的服务通过 API 网关向前端发布。还有,应用服务还可以进行安全认证、权限校验、事务控制、发送或订阅领域事件等。
  • 领域层:的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性。领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。领域层包含聚合根、实体、值对象、领域服务等领域模型中的领域对象。这里我要特别解释一下其中几个领域对象的关系,以便你在设计领域层的时候能更加清楚。首先,领域模型的业务逻辑主要是由实体和领域服务来实现的,其中实体会采用充血模型来实现所有与之相关的业务功能。其次,你要知道,实体和领域服务在实现业务逻辑上不是同级的,当领域中的某些功能,单一实体(或者值对象)不能实现时,领域服务就会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。
  • 基础层:基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。比较常见的功能还是提供数据库持久化。
  • 传统三层架构和DDD四层架构之间的关系:

 

 

08 | 微服务架构模型:几种常见模型的对比和分析

重要知识点整理

整洁架构

  • 在整洁架构里,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。

 

  • 在洋葱架构中,各层的职能是这样划分的:领域模型实现领域内核心业务逻辑,它封装了企业级的业务规则。领域模型的主体是实体,一个实体可以是一个带方法的对象,也可以是一个数据结构和方法集合。领域服务实现涉及多个实体的复杂业务逻辑。应用服务实现与用户操作相关的服务组合与编排,它包含了应用特有的业务流程规则,封装和实现了系统所有用例。最外层主要提供适配的能力,适配能力分为主动适配和被动适配。主动适配主要实现外部用户、网页、批处理和自动化测试等对内层业务逻辑访问适配。被动适配主要是实现核心业务逻辑对基础资源访问的适配,比如数据库、缓存、文件系统和消息中间件等。红圈内的领域模型、领域服务和应用服务一起组成软件核心业务能力。

六边形架构

  • 六边形架构的核心理念是:应用是通过端口与外部进行交互的。我想这也是微服务架构下 API 网关盛行的主要原因吧。也就是说,在下图的六边形架构中,红圈内的核心业务逻辑(应用程序和领域模型)与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互。它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。六边形架构各层的依赖关系与整洁架构一样,都是由外向内依赖。

 

  • 六边形架构将系统分为内六边形和外六边形两层,这两层的职能划分如下:红圈内的六边形实现应用的核心业务逻辑;外六边形完成外部应用、驱动和基础资源等的交互和访问,对前端应用以 API 主动适配的方式提供服务,对基础资源以依赖倒置被动适配的方式实现资源访问

 

三种模型之际的对比

 

可以说,这三种架构都考虑了前端需求的变与领域模型的不变。需求变幻无穷,但变化总是有矩可循的,用户体验、操作习惯、市场环境以及管理流程的变化,往往会导致界面逻辑和流程的多变。但总体来说,不管前端如何变化,在企业没有大的变革的情况下,核心领域逻辑基本不会大变,所以领域模型相对稳定,而用例和流程则会随着外部应用需求而随时调整。把握好这个规律,我们就知道该如何设计应用层和领域层了。

 

架构设计之路 - DDD领域驱动模型设计 - 补充中20220315 文章目录前言一、架构的演变历程二、领域驱动初窥1 传统软件开发中的痛点2 什么是领域驱动设计战略设计战术设计总结3 领域模型4 分层架构模型三层架构四层架构六边形架构三、架构设计进阶1 DDD下的项目目录结构2 XXXX总结 前言 DDD 领域驱动模型设计 文章目录 《领域驱动设计》—— Thoughtworks洞见 《实现领域驱动设计》—— 沃恩·弗农 DDD-领域驱动设计 - 知乎 (zhihu.com) 一、架构的演变历程 ​ 学习DDD之前,先了解大致的架构模式,因为DD 阅读详情

相关推荐

领域驱动模型(DDD)设计讲解

一. 什么是领域驱动模型(DDD)? 领域驱动模型一种设计思想,我们又称为DDD设计思想。是一种为了解决传统设计思想带来的维护困难,沟通困难和交互困难而产生的一种新的思想。也解决了在部分公司中,一个项目组就是一套服务,不同项目组中又相互通过RPC访问,相互之间交互的安全保障。 二. 领域驱动模型解决了什么问题 在传统微服务的单服务设计上,我们通常只顾自己开发,只顾自己业务,只管理自己数据库,一旦其他服务需要使用另一个服务上的某些功能时,我们通常需要使用HTTP来内网访问达到目的,或是使用RPC来访问业务。首

qq_37743433的博客 4724

领域驱动模型(DDD)

领域模型是对具有某个边界的领域的一个抽象,反映了领域内用户业务需求的本质;领域模型是有边界的,只反映了我们在领域内所关注的部分;

weixin_45866849的博客 4999

P8 课程 - 领域驱动模型设计与微服务架构落地

实际上领域驱动设计的英文是为什么会出现一个这样的概念呢?这是由于软件其实对于行业并没有什么非常高的要求,因为软件本身就是为了能够帮助某一些业务进行更好的发展。软件本身其实是赋能以及变革。软件具有行业兼容性,同时又带来固有的复杂性。比如医疗行业跟金融行业,都能够去使用软件进行业务开发,但是他们的业务完全不一样,这个时候我们就需要进行大量的业务梳理,甚至需要专门的岗位(产品经理)去完成这个工作。

智者之家 1117

DDD领域驱动模型设计

Domain Driven Design(领域驱动设计, DDD)是一种软件设计思想和方法论,以领域为核心构建软件设计体系,将业务模型抽象成领域模型进行拆解和封装。Domain Driven Design(领域驱动设计, DDD),不是一种架构,而是一种架构方法论,是一种拆解业务、划分业务、确定业务边界的方法,是一种领域设计思想。

Jin的随手笔记 2万+

Zemax单模光纤耦合仿真避坑指南:数值孔径、模式匹配与镀膜影响详解

本文详细解析了Zemax单模光纤耦合仿真中的关键避坑要点,包括数值孔径的多重定义与换算、模式匹配度评估及镀膜影响分析。通过实际案例和技术公式,帮助工程师避免常见仿真误差,提升激光通信和光纤传感系统的设计精度。特别针对OpticStudio用户提供了实用的参数设置建议和优化策略。

weixin_30836759的博客 465

【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型之python实现

文章目录1. 引言2. Brinson多期归因模型的Python实现2.1 基准数据读取模块2.2 持仓数据读取模块2.3 持仓收益与基准计算模块2.4 Brinson多期归因模型核心算法Brinson_Multiple2.5 主函数模块3. 归因结果写在最后 1. 引言 在上文中,我们已经介绍了Brinson归因模型的基本思想。那么,就让我们动起手来,实现这一方法吧! 在Brinson多期归因模型实现的过程中,本文使用模块化方法,将整个实现过程划分为如下五个功能板块: Module 1: 基准数据读取模

Mikey_Sun的博客 2万+

DDD领域驱动模式

DDD领域驱动模式-个人小总结

Fengkx518的博客 2853

QT使用高精度定时器

精度相对第二种方法高许多。

ljjjjjjjjjjj的博客 4097

什么是领域驱动模型

领域驱动模型(DDD)是一种软件开发方法,它的主要目标是将领域知识和专业术语转化为可用于开发软件的模型。它强调通过与专家合作,了解和模拟实际世界中的业务过程,并将这些过程映射到软件系统中。这有助于解决软件系统开发过程中的复杂性,并帮助开发人员构建出更具可理解性和可维护性的软件系统。 ...

weixin_42596214的博客 390

HFSS实战项目——微带带通滤波器设计

本文详细介绍并设计了一款微带带通滤波器,通过HFSS三位电磁仿真软件对其进行仿真设计及优化,仿真结果表明,本文设计的滤波器表现出优良的滤波性能,符合设计要求。

2401_87464239的博客 5393

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1493

领域驱动设计DDD实战进阶第一波(九):订单上下文POCO模型

DDD实战进阶第一波(九):开发一般业务的大健康行业直销系统(订单上下文POCO模型) 在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对DDD的方法与架构已经有了初步的了解。 但是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容。从这篇文章...

chuhe0321的专栏 1056

潇洒郎: 小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

小白一次性成功——红米 Note 12 5G Android12 系统13.0.16/14.0.9 小米红米手机解BL锁+ROOT-刷面具—官方ROM下载-线刷降级—解锁system系统分区

潇洒郎的博客 4585

DDD领域驱动设计详解

DDD领域驱动设计1. 领域驱动设计1.1 什么是领域驱动设计1.2 为什么用领域驱动设计2. DDD核心知识体系2.1 DDD核心概念2.2 DDD战略战术设计2.2.1 DDD战略设计2.2.1 DDD战术设计3. DDD微服务架构模型3.1 基本架构3.1.1 DDD分层架构3.1.1 六边形理论3.1.1 CQRS架构设计3.2 代码结构3.3 服务调用 1. 领域驱动设计 1.1 什么是领域驱动设计 领域驱动设计(Domain Driven Design) 是一种从系统分析到软件建模的一套方法论

靖节先生的博客 6万+

SAP 系统和银行系统通过 SM2 加密算法进行集成

SM2 是基于椭圆曲线离散对数问题(ECDLP)的一种公钥密码算法。椭圆曲线加密的核心原理,是利用了一个数学难题:在椭圆曲线群上,已知曲线上两点的运算结果,逆向推导出这两个点的具体信息是非常困难的。这样的复杂度使得基于椭圆曲线的密码体制比传统的 RSA 更加难以破解。在 SM2 加密中,公钥和私钥的生成与传统的椭圆曲线加密类似。选择一个椭圆曲线和一个基点 P。使用私钥 d,计算公钥 P’ = d * P。私钥 d 保密,而公钥 P’ 可公开分发,用于加密数据。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1212

如何在 SAP BTP 上使用 Integration Suite 消费 S/4HANA Cloud API

SAP Integration Suite是一个集成平台即服务(iPaaS),允许开发人员顺利地将内部部署和基于云的应用程序和流程与SAP管理的工具和预构建内容进行集成。登录 SAP Business Technology Platform Cockpit,进入 integration suite:再点击 API management 进入 API Portal:或者直接从收藏夹里打开链接:https://304a49cetrial.integrationsuitetrial-apiportal.cfapp

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1699

我眼中的领域驱动设计

有幸参与了一些领域驱动的项目,读了一些文章,也见识了一些不伦不类的架构,感觉对领域驱动有了更进一步的认识。所以今天跟大伙探讨一下领域驱动设计,同时也对一些想要实践领域驱动设计却又无处下手,或者一些正在实践却又说不上领域驱动设计到底好在哪的朋友一些指引方向。当然对于”领域驱动设计”这个主题而言从来不乏争论,所以大家可以在畅所欲言。 为什么要使用领域驱动设计? 从Eric Evans的《领域驱动设...

three_bird的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

程序设计——领域驱动设计

DDD是什么,DDD应用场景,DDD构件块,DDD如何建模

chyohn的博客 1666

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

领域驱动模型设计(一)

三层架构的问题? 我们平时的开发流程通常分为下面的三个步骤: 技术选型,搭建基础技术框架。如我们使用java作为开发语言,使用SpringBoot、SpringCloud等框架,采用redis、mq等中间件,使用mysql、es存储数据。 然后我们搭建了基础的开发环境后,会在数据库中建表,然后用表数据映射到我们的数据实体。 采用mvc三层架构的模型开发我们的业务逻辑,所有业务逻辑写在service中,我们的实体通常只作为service操作的数据载体。 下图是三层架构中我们主要的工程结构: 在小

大张 4718

DDD专家张逸:构建领域驱动设计知识体系

张逸读完需要5分钟速读仅需 2 分钟领域驱动设计专家,曾就职于 ThoughtWorks,作为 Lead Consultant 为客户提供架构设计、大数据分析、持续交付、代码质量、敏捷管...

中生代技术 2735

一文告诉你什么是领域驱动设计?

1 领域驱动设计的基本概念 领域驱动设计作为一个针对大型复杂业务系统的领域建模方法体系(不仅限于面向对象的领 域建模),它改变了传统软件开发工程师针对数据库建模的方式,通过面向领域的思维方式,将要 解决的业务概念和业务规则等内容提炼为领域知识,然后借由不同的建模范式将这些领域知识抽象 为能够反映真实世界的领域模型。 Eric Evans之所以提出这套方法体系, 并非刻意地另辟蹊径,创造出与众不同的设计方法与 模式,而是希望恢复业务系统设计核心关注点的本来面貌,也就是认识到领域建模和设计的重要 性,然而在

人邮异步社区 2643

【DDD】学习笔记-领域驱动设计的代码模型

理解了限界上下文和分层架构的本质,要确认系统的代码模型自然也就水到渠成。没有必要要求每个团队都遵守一套代码模型,但在同一个项目中,代码模型应作为架构规范要求每个团队成员必须遵守。

xqdd的专栏 1590

领域驱动设计-- 模型

什么是模型 从领域驱动的战略设计进入战术设计,简单说来,就是跨过系统视角的限界上下文边界进入它的内部,从分层架构的逻辑分层进入到每一层的内部。在思考内部的设计细节时,首先需要思考的问题就是:什么是模型(Model)? 模型是从哪里来的,怎么得出来的。注:这里的模型不仅仅是我们数据库建模 还是来看看 Eric Evans 对模型的阐述: 为了创建真正能为用户活动所用的软件,开发团队必须运用一整套与...

K-Darker的专栏 903

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

本文转载自:http://www.cnblogs.com/landeanfen/p/4816706.html 作者:landeanfen 转载请注明该声明。前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的。今天看到一篇博文里面写道:越是忙人越有时间写博客。呵呵,似乎有点道理,博主为了证明自己也是忙人,这不就来学习下DDD这么一个听上去高大上的东西。前面介绍了下MEF和AOP的相关知识...

zhengxiuchen86的博客 1122

DDD领域驱动设计基本理论知识总结

领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章。 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD。领域驱动设计分为两个阶段: 以一种领域专家、设计人员、开发人员都能理解的通用语言作为相互交流的工具,在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型; 由领域模型驱动软件设计,用代码来实现该领域模型;

纸上得来终觉浅,绝知此事要躬行 1647
上一篇: 领域驱动模型设计-基础
下一篇: 领域驱动模型设计-实战
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值