领域驱动模型设计(二)

article/2025/8/9 7:35:25

目录

领域事件

领域、子域、核心域、通用域和支撑域

限界上下文

划分限界上下文

数据流转

上下文映射图

上下文集成

上一篇粗略地介绍了为什么需要使用领域驱动模型设计?下面我们将一一讲解下领域驱动设计中的一些比较难懂,但是却十分基础的概念。这些概念包括领域事件、领域、子域、核心域、通用域和支撑域,限界上下文,实体和值对象,聚合和聚合根。

领域事件

导致进一步的业务操作的事件,在 DDD 中这种事件被称为领域事件。

如果一次业务操作导致多个聚合状态的变更,应采用领域事件的最终一致性。

DDD“一次事务只更新一个聚合”的原则。

领域事件处理包括:事件构建和发布、事件数据持久化、事件总线、消息中间件、事件接收和处理等。

  • 事件构建和发布

事件基本属性事件唯一标识发生时间事件类型事件源,其中事件唯一标识应该是全局唯一的,以便事件能够无歧义地在多个限界上下文中传递。

业务属性:

记录事件发生那一刻的业务数据,这些数据会随事件传输到订阅方,以开展下一步的业务操作。

事件发布之前需要先构建事件实体并持久化

②事件数据持久化

  1. 持久化到本地业务数据库的事件表中,利用本地事务保证业务和事件数据的一致性。
  2. 持久化到共享的事件数据库中。这里需要注意的是:业务数据库和事件数据库不在一个数据库中,它们的数据持久化操作会跨数据库,因此需要分布式事务机制来保证业务和事件数据的强一致性,结果就是会对系统性能造成一定的影响。

事件总线 (EventBus)

事件总线是实现微服务内聚合之间领域事件的重要组件,它提供事件分发和接收等服务。事件总线是进程内模型,它会在微服务内聚合之间遍历订阅者列表,采取同步或异步的模式传递数据。

④消息中间件

跨微服务的领域事件大多会用到消息中间件,实现跨微服务的事件发布和订阅。消息中间件的产品非常成熟,市场上可选的技术也非常多,比如 Kafka,RabbitMQ 等。

事件接收和处理

微服务订阅方在应用层采用监听机制,接收消息队列中的事件数据,完成事件数据的持久化后,就可以开始进一步的业务处理。领域事件处理可在领域服务中实现。

领域事件运行机制相关案例

领域、子域、核心域、通用域和支撑域

现实世界中,领域包含了问题域解系统。一般认为软件是对现实世界的部分模拟。在DDD中,解系统可以映射为一个个限界上下文,限界上下文就是软件对于问题域的一个特定的、有限的解决方案。比如从事外卖业务,那么我们就需要解决商家和客户之间的问题,因此我们有了美团和饿了么。打车行业从传统出租车到互联网线上滴滴打车,为了解决私家车运力调度和用户打不到车的问题,就有了后面的滴滴打车。还有共享单车业务,解决我们最后一公里的问题,有了小黄车、小蓝车、小绿车。

在复杂和大规模软件开发过程中,我们可以通过分治的方法来解决。所以子域就是为了拆分各个复杂的领域,是问题逐步精细化,更加高类聚、低耦合,职责单一。比如我们要解决外卖问题,就自然产生了商家和客户两个子域。在客户子域下又可以划分为商品、下单、支付、派单等子子域,这时每个子子域可以对应一个微服务。

核心域是一个公司业务的核心,是公司建设的主体和战略发展的支撑点。例如不同的电商平台业务重心不同,核心域就有所不同。像拼过多的核心域就是拼购主打低价,跨境电商主打海外市场,京东主打物流和电子等。

通用域是一些基础功能,不包含业务概念,比如鉴权、日志、监控等。

支撑域就是有业务特点,作为业务的基础支撑,像一些业务状态码、数据字典等。

限界上下文

一个由显示边界限定的特定职责。领域模型便存在于这个边界之内。在边界内,每一个模型概念,包括它的属性和操作,都具有特殊的含义。一个给定的业务领域会包含多个限界上下文,想与一个限界上下文沟通,则需要通过显示边界进行通信。系统通过确定的限界上下文来进行解耦,而每一个上下文内部紧密组织,职责明确,具有较高的内聚性。一个很形象的隐喻:细胞质所以能够存在,是因为细胞膜限定了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜。

限界上下文是让业务在一定的范围内没有二义性。比如商品在电商领域中不同阶段的表现不同,在销售的时候是商品,在配送过程中是包裹。业务领域的不同,职责和含义就有所不同。所以界限上下文需要从业务出发,按领域划分。

划分限界上下文

我们的实践是,考虑产品所讲的通用语言,从中提取一些术语称之为概念对象,寻找对象之间的联系;或者从需求里提取一些动词,观察动词和对象之间的关系;我们将紧耦合的各自圈在一起,观察他们内在的联系,从而形成对应的界限上下文。形成之后,我们可以尝试用语言来描述下界限上下文的职责,看它是否清晰、准确、简洁和完整。简言之,限界上下文应该从需求出发,按领域划分

像外卖可以划分用户上下文、商家上下文、配送上下文。用户关注与外卖的价格、优惠、配送时长,商家关注商品对客户吸引力、利润,配送关注的是时长、配送费用、距离等。

数据流转

先领域的开放服务通过信息传输对象(DTO)来完成与外界的数据交互;在领域内部,我们通过领域对象(DO)作为领域内部的数据和行为载体;在资源库内部,我们沿袭了原有的数据库持久化对象(PO)进行数据库资源的交互。同时,DTO与DO的转换发生在领域服务内,DO与PO的转换发生在资源库内

与以往的业务服务相比,当前的编码规范可能多造成了一次数据转换,但每种数据对象职责明确,数据流转更加清晰

上下文映射图

康威(梅尔·康威)定律

任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。

团队结构(无论是内部组织还是团队间组织)就是组织结构,限界上下文就是系统的业务结构。

限界上下文之间的映射关系

  • 合作关系(Partnership):两个上下文紧密合作的关系,一荣俱荣,一损俱损。
  • 共享内核(Shared Kernel):两个上下文依赖部分共享的模型。
  • 客户方-供应方开发(Customer-Supplier Development):上下文之间有组织的上下游依赖。
  • 遵奉者(Conformist):下游上下文只能盲目依赖上游上下文。
  • 防腐层(Anticorruption Layer):一个上下文通过一些适配和转换与另一个上下文交互。
  • 开放主机服务(Open Host Service):定义一种协议来让其他上下文来对本上下文进行访问。
  • 发布语言(Published Language):通常与OHS一起使用,用于定义开放主机的协议。
  • 大泥球(Big Ball of Mud):混杂在一起的上下文关系,边界不清晰。
  • 另谋他路(SeparateWay):两个完全没有任何联系的上下文。

通过上下文映射关系,我们明确的限制了限界上下文的耦合性,即在抽奖平台中,无论是上下文内部交互(合作关系)还是与外部上下文交互(防腐层),耦合度都限定在数据耦合(Data Coupling)的层级。

上下文集成

通常集成上下文的手段有多种,常见的手段包括开放领域服务接口、开放HTTP服务以及消息发布-订阅机制

在抽奖系统中,我们使用的是开放服务接口进行交互的。最明显的体现是计数上下文,它作为一个通用上下文,对抽奖、风控、活动准入等上下文都提供了访问接口。 同时,如果在一个上下文对另一个上下文进行集成时,若需要一定的隔离和适配,可以引入防腐层的概念。这一部分的示例可以参考前文的防腐层代码示例。

下一篇:领域驱动模型设计(三)_张家老院子的博客-CSDN博客


http://chatgpt.dhexx.cn/article/vtwqsvq8.shtml

相关文章

什么是DDD(领域驱动设计)?

领域驱动设计的基本概念 领域驱动设计作为一个针对大型复杂业务系统的领域建模方法体系(不仅限于面向对象的领 域建模),它改变了传统软件开发工程师针对数据库建模的方式,通过面向领域的思维方式,将要 解决的业务概念…

实现领域驱动

什么是领域驱动? 领域驱动设计 (domain-driver-design) 是有别于MVC开发模式的一种思想,它是面向对象编程的一种表现形式,请记住:领域驱动是一种思想,而不是技术! 领域驱动核心是通过对模型抽象出属性和行…

浅析 DDD 领域驱动设计

一、前言 最近公司一场有关于领域驱动设计的技术分享会,主要讲解了服务的划分,Restful API的设计,如何将抽象具有统一业务的范畴的Model,使其模块化,同时能够提炼组合多个模块,使得业务能够独立服务化&…

领域驱动设计-架构篇

目录 1、软件架构概述 1.1 软件架构概念 1.2 软件架构分类 1.3 软件架构模式 1.4 软件架构风格 2、领域驱动软件架构 2.1 架构风格 六边行架构(领域驱动设计首选) 为什么选择REST架构 松耦合 可伸缩性 易用性 约束性 2.2 架构模型 命令和…

DDD领域驱动设计

DDD领域驱动设计是什么 1 DDD是什么? DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有17年。 2 为什么需要DDD 当软件越来越复杂,实际开发中,大量的业务逻辑堆积在一个巨型类中的例子屡见不鲜,…

【领域驱动设计】三分钟搞懂领域驱动设计

今天的企业应用程序无疑是复杂的,并依赖一些专门技术(持久性,AJAX,Web服务等)来完成它们的工作。作为开发人员,我们倾向于关注这些技术细节是可以理解的。但事实是,一个不能解决业务需求的系统对…

领域驱动设计(DDD,Domain-Driven Design)

领域驱动设计 前言正文领域驱动设计基本概念什么是领域模型?什么是领域服务(Domain Service)?什么是领域事件? 秒杀项目中的领域分析一、秒杀活动领域设计秒杀活动领域模型领域服务领域事件 二、秒杀品领域设计领域模型…

领域驱动(自己理解)

代码层级编写规范 1、什么是领域驱动? 核心是维护一个反应领域概念的模型,然后通过大量模式来指导模型设计与开发。 一般过程:通过产品同学所写出的prd,利用领域模型的概念与业务相结合,完善出xmind,现在…

DDD领域驱动设计详解

DDD领域驱动设计详解 1. 领域驱动概述1.1 领域驱动简介1.2 领域驱动优点1.3 领域驱动解决复杂度方式1.4 领域驱动疑问 2. 领域驱动核心知识2.1 领域知识概念2.2 领域战略战术设计 3. 领域驱动战略设计3.1 战略设计概述3.2 领域与子域3.3 限界上下文3.4 领域场景分析3.5 四色建模…

领域驱动介绍

大纲 软件设计发展史什么是领域驱动设计领域驱动设计解决什么问题领域驱动设计包含哪些要素领域驱动设计的架构样例分析 软件设计发展史 单体->前后端->微服务->服务网格 SSH->ssm->spring boot-> SideCar/ Istio 单体 早期功能侧重功能实现 ESB 基于服…

阿里云负载均衡简介和购买使用流程

目录 一,阿里云负载均衡简介 二,阿里云准备工作 三,阿里云负载均衡原理和说明 四,阿里云负载均衡应用场景说明 五,阿里云负载均衡特点和优势 六,阿里云负载均衡应用场景 七,总结 一&…

阿里云负载均衡【SLB】使用实践方案

负载均衡(Server Load Balancer,下文简称 SLB)的引入,可以降低单台云服务器 ECS(下文简称 ECS)出现异常时对业务的冲击,提升业务的可用性。同时,结合弹性伸缩服务,通过动…

阿里云负载均衡

1.环境搭建 准备两台ECS 然后在ECS中配置http服务 yum install httpd -y echo "this is wwq2"> /var/www/html/index.html 2.负载均衡 进入负载均衡控制台 创建负载均衡实例 配置监听 并且添加服务器 测试

使用阿里云负载均衡SLB还需要自己配置Nginx吗?

购买阿里云负载均衡SLB后,还需要自己设置Nginx吗?不需要,阿里云负载均衡SLB本身就是流量转发产品,不需要自己配置Nginx进行流量转发。负载均衡SLB将访问流量根据转发策略分发到后端多台云服务器ECS实例上,提高应用可用…

阿里云负载均衡实验

1.创建ECS 2.开放80端口 3.安装httpd起服务 yum install httpd -y echo " web passage.hostname -I" > /var/www/html/index.html //hostname -I 查看IP地址 systemctl start httpd [rootiZbp10x14xc3r5wy59stlkZ ~]# curl localhost web passage.172.18.180.10…

阿里云负载均衡SLB,HTTPS动态网站部署负载均衡,实现高并发流量分发

第一步购买服务器,测的话一般就用按量付费几毛钱一小时 我是用了三台,一台是常用的服务器,两台临时服务器进行部署项目 2:服务器购买完之后,开始安装项目运行环境,我是宝塔一键按键的,PHP7.1。…

阿里云培训-负载均衡(CLB/ALB)

什么是传统型负载均衡CLB 传统型负载均衡CLB(Classic Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。CLB扩展了应用的服务能力,增强了应用的可用性。 概述 CLB通过设…

阿里云SLB负载均衡

阿里云SLB负载均衡 四层和七层是什么意思调度算法轮询(RR)加权最小连接数(WLC)加权轮询(WRR) 会话保持健康检查 四层和七层是什么意思 四层: 通过IP和端口转发 七层:通过主机名和域名转发 四层就是 TCP 和 UDP;七层就是http和https. 调度算法 轮询(RR) 假定有2台…

阿里云负载均衡理论

目录 负载均衡概念 总结: CLB与ALB 负载均衡包含的模块 使用ECS的优势 负载均衡的使用场景 SLB的优势 SLB提供的功能 SLB的应用场景 负载均衡概念 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量…

阿里云cdn以及阿里云负载均衡配置方法

阿里云cdn以及阿里云负载均衡配置方法 1、阿里云CDN1、全站加速1、添加域名2、配置cname3、配置服务器访问4、配置https 2、阿里云负载均衡配置1、创建负载均衡2、将域名解析到负载均衡的ip中3、添加后端服务器4、配置监听规则5、https 1、阿里云CDN 一开始请先注意全站加速和…