解析DDD开发框架Axon

news2024/12/22 20:04:47

在微服务架构盛行的当下,领域驱动设计(DDD)也得到了崭新的发展。在DDD中包含了聚合、领域事件等核心概念,也需要引入CQRS、事件溯源等架构模式。对于开发人员而言,如何简单而高效的实现这些核心概念和架构模式是一大痛点。一方面,这些概念和模式晦涩难懂,无法直接用简单的技术体系就能实现。另一方面,业界关于如何实现DDD应用程序也没有统一的开发规范。

Axon框架的诞生为开发人员解决这些痛点问题提供了即插即用的解决方案。今天的内容,我们就将围绕Axon框架的各项功能展开详细的讨论。

Axon框架与DDD

在具体介绍Axon框架之前,让我们先简单回顾几个DDD的核心概念。我们知道在一个DDD限界上下文中,内部是以聚合、实体和值对象为代表的一组领域模型对象,而针对领域模型中状态的变化,聚合会生成一系列的领域事件。领域事件可以通过事件存储器进行保存,也可以发布到其他限界上下文中。另一方面,在领域模型对象的外部是应用服务和资源库。应用服务分别命令服务和查询服务,是CQRS架构模式的具体应用。而资源库则完成与各种持久化媒介的集成,如下图所示。


自2010年诞生以来,Axon框架在过去几年中有了很大的发展。围绕上图中的各个DDD核心概念,除了为开发人员提供了一个内核框架之外,还提供了一个服务器选项,其中包括一个事件存储器和一个事件路由器。Axon内核框架与服务器相结合,对实现CQRS和时间溯源架构模式所需的复杂基础设施问题进行了高度抽象。基于Axon框架的应用架构如下图所示。


在上图中,我们看到了一组Axon技术组件,包括领域模型、资源库、命令处理程序和事件处理程序等,这些组件分别与DDD中的领域模型对象、资源库、命令服务、领域事件概念相对应。我们也注意到在Axon中专门提供了一个事件存储器组件用来存储领域事件。

同时,我们在上图中还看到了一个事件总线组件,这是Axon中内置的总线中的一种。基于这些技术组件,开发人员可以不需要从零开始实现CQRS架构模式和事件溯源机制,从而只关注业务逻辑的实现过程。接下来,让我们从Axon的整体架构开始展开,对这些技术组件做进一步的分析。

Axon技术组件

Axon整体架构

从整体架构进行分析,Axon框架由三大部分组成,包括领域模型(Domain Model)组件、分派模型(Dispatch Model)组件和Axon服务器(Server)。


其中:

  1. 领域模型组件:这部分组件是Axon的核心组件,用来帮助开发人员构建以DDD、事件溯源和CQRS为中心的应用程序。
  2. 分派模型组件:这部分组件用来提供针对领域模型的逻辑基础架构,包括支持对命令和查询操作的路由和协调,这些操作在Axon中同样被用来处理领域模型状态。
  3. 服务器:Axon本身也提供了一个服务器组件,该组件用来支持前面提到的领域和分派模型的物理基础架构。

上图进一步展示了Axon框架为我们提供的这些技术组件的详细组成,可以看到Axon框架也提供了一个外部对接组件,可以和MongoDB、Kafka等外部基础设施组件进行交互,从而满足不同场景下的定制化需求。

从上图中,我们可以看到一组DDD中的核心,包括领域模型对象、领域事件、资源库、命令处理程序、事件处理程序,以及通过命令和事件组合在一起的其他组件。这些组件是实现普通面向领域应用程序所需要具备的。Axon对这些组件也做了一定的封装和抽象,从而帮助开发人员更好的实现领域模型。

另一方面,我们也看到了一组前面没有介绍过的组件,例如专门针对事件溯源过程的事件溯源处理程序、包括命令总线、事件总线以及专门针对领域事件的存储库。这些组件主要就是Axon框架我们提供的领域分派组件,除了这里的命令总线、事件总线之外,还有查询总线,开发人员直接使用即可。

基于这些技术组件,Axon框架的整体工作流程如下图所示。


同时,在上图中,我们也可以看出,位于上半部分的组件能够改变应用程序的状态,而位于下半部分的组件则读取或查询应用程序的状态。显然,在这种明确的分离中,我们也嵌入了CQRS架构模式。

围绕图X,可以看到我们发起的命令操作通过命令总线传递到命令处理程序。因为命令操作会引起领域模型状态的变化,所以就需要生成领域事件。领域事件同样通过领域总线进行传播,并被不同的事件处理程序进行处理。最终,领域事件及其处理结果被保存下来,供查询操作获取最新的领域状态。

Axon服务器

Axon服务器是Axon为开发人员提供了一个可视化服务器组件,包括一批即插即用的功能组件,例如:

  1. 专门用来存储事件的事件存储库,基于H2内存数据库进行实现
  2. 内置对领域事件的路由机制
  3. 提供简洁明了的用户界面控制台
  4. 提供对系统数据的备份和版本控制
  5. 提供对系统行为的监控和度量机制
  6. 提供对系统访问的安全控制机制
  7. 提供对系统运行的集群管理机制

Axon服务器在物理上就是一个Spring Boot应用程序,并作为常规的JAR文件进行发布,我们可以从Axon的官方网站www.axoniq.io上进行下载。

当我们使用java -jar axonserver.jar命令启动Axon服务器,并在浏览器中访问http://localhost:8024/,可以得到如下图所示的用户操作界面。


可以看到这个控制台提供监控和管理Axon服务器的一组功能,包括设置、搜索、概览、用户等常规功能,包括命令、查询等于CQRS直接相关的浏览界面,也包括用于与第三方组件进行集成的插件界面。

Axon应用方式

如果你已经开发了一个DDD应用程序,那么想要引入Axon框架,就需要对现有系统进行重构。重构的对象主要是两个方面,一个是领域模型,一个是应用服务。

对于领域模型而言,针对聚合对象,我们需要引入命令处理程序来重构对命令的处理过程。而当领域事件被发送之后,我们同样需要对聚合中如何处理领域事件的过程进行重构,并引入全新的事件溯源组件。在这个组件中,我们就可以对聚合的状态做相应的调整。对于领域事件而言,Axon内置了完整的事件存储器和事件发布和消费机制。

应用服务是我们重构的重点对象之一,因为在Axon中,对命令服务和查询服务所应该具备的操作做了明确的定义,我们需要引入命令总线和查询总线来分派命令和查询操作,并使用命令处理程序和查询处理程序来分别处理命令和查询对象。在引入了Axon框架之后,我们需要对原有的命令服务和查询服务的代码组织方式和功能实现过程都做出相应的调整,才能符合基于Axon中CQRS架构的开发需求。

如果你正在开发一个DDD应用程序,那么引入Axon框架是一个明智的选择。Axon能够帮助开发人员显著简化开发过程和难度。Axon之所以能做到这一点,是因为它内置了一组即插即用的领域模型组件和分派模型组件,前者包括命令处理程序、查询处理程序、事件处理程序等,而后者则包含命令总线、查询总线和事件总线等。除此之外,Axon还专门提供了一个服务器组件用来提供可视化的管理界面。今天的内容对Axon中的这些技术组件都做了详细的展开,并在最后总结了该框架的具体应用方式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++11之constexpr

注:大前提,本篇文章是在介绍C11中的constexpr,自C14以来constexpr有了非常大的改动,如在实验中遇见与本文不符的地方还先请查阅其他资料,确定为本文错误后可留言,我会虚心接受并改正。 constexpr定义编译…

惠海H5112A降压恒流芯片IC 60V72V80V100V转24V36V48V多路共阳输出景观LED点光源

H5112A是一款外围电路简单的多功能平均电流型LED恒流驱动器,适用于5-90V电压范围的非隔离式大功率恒流LED驱动领域。芯片采用了平均电流模式控制,输出电流精度在士3%;输出电流对输入输出电压以及电感不敏感;芯片内部集成了环路补偿,外围电路更…

学习测试9-接口测试 2-抓包工具Fiddler

Fiddler 抓包工具的使用 怎么找接口信息,可以通过浏览器的开发者工具 Fiddler 是一个 HTTP 协议调试代理工具 File 菜单: Capture Traffic(或 F12):是个开关,可以控制是否把 Fiddler 注册为系统代理。当把…

Mac系统能装虚拟机吗 Mac装双系统虚拟机详细教程 macos可以用虚拟机装windows吗

随着科技的进步和用户需求的多样化,越来越多的用户希望在一台设备上运行多个操作系统。特别是对于Mac用户来说,安装虚拟机或者双系统已成为常见需求。这不仅可以满足用户在不同操作系统工作的需求,也可以让开发人员在不同的操作系统上进行测试…

【题目/训练】二叉树的创建遍历(递归非递归)

一、根据二叉树创建字符串 思路:在正常前序递归遍历的基础上,单独加上一个考虑到右子树为空的情况,如下:其结果为 1(2(4(5)(6)))&…

财伯乐伯乐遇马税务师事务所品牌发布会圆满落幕!

7月14日 ,由财伯乐主办,伯乐遇马集团、HRS卓玥学社联合主办的财伯乐&伯乐遇马税务师事务所品牌发布会在上海闵行区隆重召开。这场盛会不仅标志着财伯乐品牌的正式亮相,更预示着企业服务领域的一次创新和突破。来自行业的领袖、合作伙伴共…

React+TS前台项目实战(二十九)-- 首页构建之性能优化实现首页Echarts模块数据渲染

文章目录 前言Echart模块源码功能分析数据渲染一、HashRateEchart统计图1. 功能分析2. 代码详细注释 二、BlockTimeChart统计图1. 功能分析2. 代码详细注释 三、使用方式四. 数据渲染后效果如下 总结 前言 还记得之前我们创建的 高性能可配置Echarts组件 吗?今天我…

【刷题汇总 -- 乒乓球筐、组队竞赛、删除相邻数字的最大分数】

C日常刷题积累 今日刷题汇总 - day0141、乒乓球筐1.1、题目1.2、思路1.3、程序实现 2、组队竞赛2.1、题目2.2、思路2.3、程序实现 3、删除相邻数字的最大分数3.1、题目3.2、思路3.3、程序实现 -- dphash 4、题目链接 今日刷题汇总 - day014 1、乒乓球筐 1.1、题目 1.2、思路 …

RflySim工具链常见问题解答

7月10日,卓翼飞思实验室暑期公益培训首场直播圆满落幕,共吸引2400余名学员参与。本期直播培训以“RflySim-智能无人集群系统快速开发与验证工具链”为主题,对RflySim工具链的功能和资源框架进行了全面详细的介绍。本文将针对使用RflySim工具链…

数据结构-java中链表的存储原理及使用方式

目录 链表(线性表的链式存储) 代码实例:(链表构建,头插尾插) LinkedList LinkedList的使用: 1、构造方法 2、操作方法 LinkedList 和 ArrayList 的区别 链表(线性表的链式存储…

论文AI疑似度太高?AIGC降痕工具助你快速降低

面对论文降痕的挑战,许多人都感受过其中的困难和挑战。论文里面如果出现“引用”过多的内容,AIGC率高的情况,这个时候怎么办呢,相信大多数的人就是替换同义词或词组、删除冗余的词汇和句子,从而来增加论文的原创性。然…

数仓实践:数据回滚的实现思路

目录 一、什么是数据回滚? 二、数据回滚的作用 1. 增量更新过程中的错误处理 2.维护数据的一致性 3.支持数据同步的可靠性 三、数据回滚的实现思路 1.标识字段的应用 2.数据同步失败的处理 3.数据同步成功后的处理 四、实战案例 在数据同步时,当历史数据…

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析?

如何用Claude 3 Sonnet Artifacts实现对数据文件的可视化分析? Prompt模板: Initial Request: 初始请求: I have uploaded data of the number of Software Engineering Jobs in the US since May 2020. I need different visual creative…

Package hyperref Warning: Ignoring empty anchor on input line 202.

问题 使用https://github.com/yaoyz96/els-cas-templates下载的复杂模板使用overleaf编译会出现警告 解决方案 将cas-dc.cls文件中的代码调换位置,例如将下述代码位置放到文件的最后即可解决问题 \RequirePackage[colorlinks]{hyperref} \colorlet{scolor}{blac…

干货分享 | TSMaster RPC 基础入门:编程指导和使用说明

介绍RPC模块前,我们先浅聊一下RPC的相关说明,以及在什么样的情况下需要了解本文 。 1. RPC 说明 远程过程调用(RPC, Remote Procedure Call)是一种网络通信协议,使得程序可以调用另一台计算机上的程序或服务&#xff…

# Redis 入门到精通(五)-- redis 持久化(2)

Redis 入门到精通(五)-- redis 持久化(2) 一、redis 持久化–save 配置与工作原理 1、RDB 启动方式:反复执行保存指令,忘记了怎么办?不知道数据产生了多少变化,何时保存&#xff1…

多核并行加速 tokenizer

import multiprocessingdef tokenize_text(text):return tokenizer(text, truncationTrue, paddingTrue, max_length256)def parallel_tokenize(texts, num_processesNone):"""使用多核并行处理文本分词"""with multiprocessing.Pool(processesn…

uniapp开发APP,主动连接mqtt,订阅消息

一、安装依赖 通过查阅资料,了解到现在mqtt.js库的最新版本已经是5,但是目前应该mqtt3.0.0版本最为稳定,我项目开发中使用的也是mqtt3.0.0版本 npm install mqtt3.0.0 参考插件:MQTT使用-模板项目 - DCloud 插件市场 参考文档…

鸿蒙Harmony--文本组件Text属性详解

金樽清酒斗十千,玉盘珍羞直万钱。 停杯投箸不能食,拔剑四顾心茫然。 欲渡黄河冰塞川,将登太行雪满山。 闲来垂钓碧溪上,忽复乘舟梦日边。 行路难,行路难,多歧路,今安在? 长风破浪会有…

java中的String 以及其方法(超详细!!!)

文章目录 一、String类型是什么String不可变的原因(经典面试题)String不可变的好处 二、String的常用构造形式1.使用常量串构造2.使用newString对象构造3.字符串数组构造 三、常用方法1. length() 获取字符串的长度2. charAt() 获取字符串中指定字符的值 (代码单元)3. codePoin…