DDD - 领域事件_解耦微服务的关键

文章目录

  • Pre
  • 领域事件的核心概念
  • 领域事件的作用
  • 领域事件的识别
  • 领域事件的技术实现
  • 领域事件的运行机制案例
  • 领域事件驱动的优势

在这里插入图片描述


Pre

DDD - 微服务设计与领域驱动设计实战(中)_ 解决微服务拆分难题

EDA - Spring Boot构建基于事件驱动的消息系统


领域事件的核心概念

领域事件(Domain Event)是领域驱动设计(DDD)中的一个重要概念,用于表示在领域中发生的、对业务有重要意义的事件。这些事件通常会导致进一步的业务操作,并且在微服务架构中,领域事件是实现微服务解耦的关键机制之一。

领域事件的作用

  1. 业务解耦:领域事件可以切断微服务之间的强依赖关系,发布方只需发布事件,而不需要关心订阅方的处理结果,从而实现微服务之间的解耦。

  2. 业务闭环:领域事件有助于形成完整的业务闭环。通过事件驱动的方式,业务流程可以在不同的微服务之间流转,确保业务的连续性和一致性。

  3. 最终一致性:在微服务架构中,领域事件通常采用最终一致性,而不是强一致性。这种方式可以减少分布式事务的使用,提升系统的性能和可扩展性。


领域事件的识别

在业务分析过程中,可以通过以下关键词来识别领域事件:

  • “如果发生……,则……”
  • “当做完……的时候,请通知……”
  • “发生……时,则……”

这些场景中的事件通常会导致进一步的业务操作,因此可以被识别为领域事件。

介绍一个保险承保业务过程中有关领域事件的案例。一个保单的生成,经历了很多子域、业务状态变更和跨微服务业务数据的传递。这个过程会产生很多的领域事件,这些领域事件促成了保险业务数据、对象在不同的微服务和子域之间的流转和角色转换。
在下面这张图中,列出了几个关键流程,用来说明如何用领域事件驱动设计来驱动承保业务流程

在这里插入图片描述

事件起点:客户购买保险 - 业务人员完成保单录入 - 生成投保单 - 启动缴费动作

  1. 投保微服务生成缴费通知单,发布第一个事件:缴费通知单已生成,将缴费通知单数据发布到消息中间件。收款微服务订阅缴费通知单事件,完成缴费操作。缴费通知单已生成,领域事件结束。
  2. 收款微服务缴费完成后,发布第二个领域事件:缴费已完成,将缴费数据发布到消息中间件。原来的订阅方收款微服务这时则变成了发布方。原来的事件发布方投保微服务转换为订阅方。投保微服务在收到缴费信息并确认缴费完成后,完成投保单转成保单的操作。缴费已完成,领域事件结束。
  3. 投保微服务在投保单转保单完成后,发布第三个领域事件:保单已生成,将保单数据发布到消息中间件。保单微服务接收到保单数据后,完成保单数据保存操作。保单已生成,领域事件结束。
  4. 保单微服务完成保单数据保存后,后面还会发生一系列的领域事件,以并发的方式将保单数据通过消息中间件发送到佣金、收付费和再保等微服务,一直到财务,完后保单后续所有业务流程。这里就不详细说了。

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


领域事件的技术实现

领域事件的执行需要一系列的组件和技术来支撑。我们来看一下这个领域事件总体技术架构图,领域事件处理包括:事件构建和发布、事件数据持久化、事件总线、消息中间件、事件接收和处理

在这里插入图片描述

领域事件的技术实现通常包括以下几个步骤:

  1. 事件构建和发布

    • 事件的基本属性包括事件唯一标识、发生时间、事件类型和事件源。
    • 事件的业务属性记录事件发生时的业务数据,这些数据会随事件传输到订阅方。
    • 事件发布可以通过应用服务、领域服务或消息中间件来完成。
  2. 事件数据持久化

    • 事件数据持久化可以用于系统之间的数据对账或审计。
    • 事件数据可以持久化到本地业务数据库的事件表中,或者持久化到共享的事件数据库中。
  3. 事件总线(EventBus)

    • 事件总线是微服务内聚合之间领域事件的重要组件,负责事件的分发和接收。
    • 事件总线可以同步或异步地传递数据,确保事件在微服务内外的订阅者之间正确传递。
  4. 消息中间件

    • 跨微服务的领域事件通常使用消息中间件(如Kafka、RabbitMQ)来实现事件的发布和订阅。
    • 消息中间件可以确保事件在微服务之间的可靠传递。
  5. 事件接收和处理

    • 订阅方通过监听机制接收事件数据,并将其持久化到本地数据库。
    • 订阅方在领域服务中处理事件,完成后续的业务操作。

领域事件的运行机制案例

以保险承保业务为例,领域事件的运行机制如下:

在这里插入图片描述
事件起点:出单员生成投保单,核保通过后,发起生成缴费通知单的操作。

  1. 缴费通知单生成

    • 投保微服务生成缴费通知单,并发布“缴费通知单已生成”事件。
    • 收款微服务订阅该事件,完成缴费操作。
  2. 缴费完成

    • 收款微服务缴费完成后,发布“缴费已完成”事件。
    • 投保微服务订阅该事件,完成投保单转保单的操作。
  3. 保单生成

    • 投保微服务在投保单转保单完成后,发布“保单已生成”事件。
    • 保单微服务订阅该事件,完成保单数据的保存操作。
  4. 后续业务流程

    • 保单微服务完成保单数据保存后,会触发一系列后续的领域事件,推动业务流程在佣金、收付费、再保等微服务之间流转。

领域事件驱动的优势

  1. 解耦微服务:通过领域事件,微服务之间的依赖关系被弱化,发布方和订阅方可以独立演化。

  2. 提升系统性能:领域事件采用最终一致性,减少了分布式事务的使用,提升了系统的性能和可扩展性。

  3. 支持复杂业务流程:领域事件可以支持复杂的业务流程,尤其是在跨多个微服务的场景中,事件驱动的方式可以简化系统的设计和维护。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MacBook Pro(M1芯片)Qt环境配置

MacBook Pro(M1芯片)Qt环境配置 1、准备 试图写一个跨平台的桌面应用,此时想到了使用Qt,于是开始了搭建开发环境~ 在M1芯片的电脑上安装,使用brew工具比较方便 Apple Silicon(ARM/M1&#xf…

简单本地部署deepseek(软件版)

Download Ollama on Windows 下载 下载安装 winr 输入 cmd 然后输入ollama -v,出现ollama版本,安装成功 deepseek-r1 选择1.5b 输入 cmd 下面代码 ollama run deepseek-r1:1.5b 删除deepseek的代码如下: ollama rm deepseek-r1:1.5b 使用…

Linux生成自签证书【Nginx】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

MySQL表的CURD

目录 一、Create 1.1单行数据全列插入 1.2多行数据指定列插入 1.3插入否则更新 1.4替换 2.Retrieve 2.1 select列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2where条件 2.3结果排序 2.4筛选分页结果 三…

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前,我们需要先弄清楚 3 个问题。第一,回收发生在哪里?第二,对象在 什么时候可以被回收?第三,如何回收这些对象? 回收发生在哪里? JVM 的内存区域中&…

基于SpringBoot的体检预约管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

PostgreSQL / PostGIS:创建地理要素

PostGIS详细教程可以参考官方文档:https://postgis.net/workshops/zh_Hans/postgis-intro/,并且官方文档提供了练习数据、教程、PPT版本教程。我这里参考QGIS文档中关于PostGIS的教程进行学习。 PostGIS 可以被认为是一组数据库内函数的集合&#xff0c…

embeddingbag词袋

文章目录 1. embeddingbag2. pytorch 1. embeddingbag 词袋embeddingbag 是在embedding词表的基础上演变起来的,nn.embedding的作用是构建一个词表,通过输入index序号来索引词对应的词向量,是可以根据词索引index进行forward计算的,embeddin…

分享|通过Self-Instruct框架将语言模型与自生成指令对齐

结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限, 从而阻碍模型通用性的背景下, Self - Instruct 框架, 通过 自动生成 并 筛选指令数据 微调预训练语言模型, 有效提升了其指令遵循能…

无穿戴动捕数字人互动方案 展馆展览创新引擎,推动文旅数字化转型

随着经济社会的发展和文旅融合的加速推进,“博物馆热”已成为一种不可忽视的社会现象,成为文化领域最具潜力的增长点之一。在信息技术的迅猛推动下,科技赋能的博物馆展览日益受到公众的关注,其中,“元宇宙”等创新概念…

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录 前言一、Mybatis Generator简介二、Maven插件运行方式三、生成配置 generatorConfig.xml MyBatis3Simple风格MyBatis3风格MyBatis3DynamicSql风格 四、Java代码运行方式五、MGB生成全部表六、增加Ext包七、Git提交总结 前言 本文我们主要实战Mybatis官方的代码生成器…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数(C11起)默认移动赋值运算符(C11起)取地址及const取地址操作符重载取地址操作符重…

Ext文件系统

文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件,按照参…

免费接入DeepSeek等多种大模型

核心代码 import cn.hutool.core.collection.CollUtil; import com.tool4j.pasteshare.entity.params.AiParams; import com.tool4j.pasteshare.entity.params.Message; import com.tool4j.pasteshare.service.AiCompletionService; import com.tool4j.pasteshare.util.deepse…

PostIn简明安装教程(入门级)

PostIn是一款开源免费的接口管理工具,包含接口调试、接口文档设计、数据MOCK等模块,本文将介绍如何快速安装配置,以快速入门上手。 1、服务端安装 私有部署版本支持多种操作系统,包括 Linux、Docker、Windows及macOS,…

java Fx进阶操作

1.java Fx基本介绍 JavaFX是用于构建富互联网应用程序的Java库。 使用此库编写的应用程序可以跨多个平台一致运行。 使用JavaFX开发的应用程序可以在各种设备上运行,如台式计算机,手机,电视,平板电脑等。 要使用Java编程语言开…

java-重载与重写

介绍 在 Java 中,重载(Overloading) 和 重写(Overriding) 是两个重要的概念,它们都与方法有关,但它们的应用场景和行为完全不同。 通过理解重载和重写的区别,可以更好地设计类的继承…

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…