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

ops/2025/2/4 18:52:49/

文章目录

在这里插入图片描述


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

在这里插入图片描述


http://www.ppmy.cn/ops/155649.html

相关文章

四、jQuery笔记

(一)jQuery概述 jQuery本身是js的一个轻量级的库,封装了一个对象jQuery,jquery的所有语法都在jQuery对象中 浏览器不认识jquery,只渲染html、css和js代码,需要先导入jQuery文件,官网下载即可 jQuery中文说明文档:https://hemin.cn/jq/ (二)jQuery要点 1、jQuery对象 …

在AWS上使用Flume搜集分布在不同EC2实例上的应用程序日志具体流程和代码

在AWS上使用Flume搜集日志的一个典型应用案例涉及将分布在不同EC2实例上的应用程序日志实时收集并集中存储到Amazon S3或Amazon HDFS(如果已部署)中,以供后续分析和处理。以下是该案例的详细步骤: 环境准备 • 确保在AWS上有一组…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

数据的添加、更新与删除

一,添加数据 INSERT INTO 表名 VALUES(); 存在两种书写形式: (1)自主填写 自主填写的形式: ①根据创建表的字段结构,依次填入数据。 ②填入数据时,自己指明字段结构,依据就近…

【数据结构】_链表经典算法OJ:链表判环问题

目录 1. 题目1:环形链表判环是否存在 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 关于快慢指针的追击问题 2.1 试分析快指针步长为2的可行性? 2.2 试分析快指针步长为3的可行性? 3. 题目2:环形链表判环是否存在并返回入…

【Validator】自定义字段、结构体补充及自定义验证,go案例讲解ReportError和errors.As在其中的使用

自定义字段名称的显示 RegisterTagNameFunc,自定义字段名称的显示,以便于从字段标签(tag)中提取更有意义的名称。 代码示例:自定义字段名称 package mainimport ("fmt""reflect""strings&q…

网络安全攻防实战:从基础防护到高级对抗

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在信息化时代,网络安全已经成为企业、政府和个人必须重视的问题。从数据泄露到勒索软件攻击,每一次…

实验六 项目二 简易信号发生器的设计与实现 (HEU)

声明:代码部分使用了AI工具 实验六 综合考核 Quartus 18.0 FPGA 5CSXFC6D6F31C6N 1. 实验项目 要求利用硬件描述语言Verilog(或VHDL)、图形描述方式、IP核,结合数字系统设计方法,在Quartus开发环境下&#xff…