解析DDD开发框架Axon

在微服务架构盛行的当下,领域驱动设计(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.mzph.cn/pingmian/46762.shtml

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

相关文章

《简历宝典》13 - 简历中“项目经历”,内功学习 - 下篇

这一小节呢,我们继续说简历中 “项目经历” 的一些内功心法。因为项目经历比较核心,所以说完了,内功呢,我们会着重说一下 实战部分。 目录 1 所用技术的考虑 2 自我成长的突出 3 综合使用STAR法则 4 小节 1 所用技术的考虑 …

【利用Selenium+autoIt实现文件上传】

利用Selenium+autoIt实现文件上传 利用Selenium+autoIT实现文件上传autoIt脚本制作转换成exe文件java代码运行部分利用Selenium+autoIT实现文件上传 当你看到这篇文章时,证明你遇到了和我一样的难题。正常情况下我们利用selenium完全可以实现表单的提交和文件上传等操作。但当…

集群节点状态异常的解决方式

文章目录 集群节点状态异常的解决方式问题概述解决方式1.关闭所有服务2.对所有集群删除Hadoop相关文件2.1 删除Hadoop系统运行时创建的临时数据和文件2.2 删除Hadoop的数据文件 3.重新对Hadoop节点进行初始化和启用4.重启服务,检查节点状态 集群节点状态异常的解决方…

软件测试工作流程

1、目的 有效的保证软件质量;有效的制定不同测试类型(软件系统测试、音频主观性测试、专项测试、自动化测试、性能测试、用户体验测试)的软件测试计划;按照计划进行测试,发现软件中存在的问题;对软件中已经解决的问题进行有效的验证;判定测试过程和问题验证的有效性。2、…

Ext JS适用于哪些开发场景?

Ext JS是一个强大的JavaScript类库,它主要用于创建前端用户界面,是一个与后台技术无关的前端Ajax框架。基于其丰富的功能和特点,Ext JS适用于多种开发场景,主要包括以下几个方面: 1、富客户端AJAX应用 RIA&#xff08…

PostgreSQL(二十一)clog的作用与管理

一、CLOG的概念及作用 1、基础概念 (1)CLOG:记录事务号的状态,可以用其判断行的可见性。每个事务状态占用两个bit位。 tip:事务的状态有4种:IN_PROGRESS,COMMITTED,ABORTED和SUB_…

如何应对AI发展下的伦理挑战

目录 1.概述 2.构建可靠的AI隐私保护机制 2.1. 最小化数据收集 2.2. 数据去标识化 2.3. 加密技术 2.4. 分布式学习和边缘计算 2.5. 强化用户控制权 2.6. 独立审计和合规性检查 2.7. 持续教育和培训 2.8.小结 3.确保AI算法的公正性和透明度 3.1.增强AI决策透明度的方…

第一百五十九节 Java IO教程 - Java输入流、文件输入流、缓冲输入流、推回输入流

Java IO教程 - Java输入流 抽象基本组件是InputStream类。 InputStream|--FileInputStream |--ByteArrayInputStream |--PipedInputStream|--FilterInputStream|--BufferedInputStream |--PushbackInputStream |--DataInputStream |--ObjectInputStream我们有FileInputStream&…

【C++】——类和对象(中)

文章目录 类的默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载运算符重载 const成员函数 类的默认成员函数 在C中,类(class)可以拥有多种成员函数,其中一些成员函数在类定义中没有显式声明时,编译器会隐式地…

JSON传输二进制

0x01 结论 JSON无法传输二进制, 若需要在JSON中传输二进制, 可以对二进制进行编码: 1. HEX To HexString 2. base64编码 若直接传送二进制, 其中无法被UTF-8解码的字节将被替换. Base64将会扩大30%的体积. 0x00 起因 我使用JSON提交了包含二进制的报文, 解析时发现很多字…

Windows上LabVIEW编译生成可执行程序

LabVIEW项目浏览器(Project Explorer)中的"Build Specifications"就是用来配置项目发布方法的。在"Build Specifications"右键菜单中选取"New",可以看到程序有几种不同的发布方法:Application(EXE)、Installer、.Net Inte…

DFS和BFS(c++)

TOC 深度优先遍历dfs Depth First Search, 简称 DFS图解链接: link对每一个分支路径深入到不能再深入为止二叉树的深度优先遍历特殊,分为先序遍历、中序遍历、后序遍历先序遍历,对任一子树,先访问根,然后左子树,最后…

C++第七弹 -- C/C++内存管理

目录 前言一. C/C内存分布二. C语言中动态内存管理方式三. C中动态内存管理四. operator new与operator delete函数五. new和delete的实现原理1.内置类型2. 自定义类型 六. 定位new表达式(placement-new)七. 常见面试题总结 前言 在C/C编程中,内存管理是至关重要的…

超详细Midjourney国际版注册使用全流程

众所周知,目前Midjourney AI绘画的国内版本有很多种,甚至微信、浏览器插件等都有,眼花缭乱,使用门槛低,无需特殊网络手段即可访问使用。 不过,根据一些用户的反馈,尽管国内的那些版本在注册和充…

软件测试——测试用例

工作职责: 1.负责产品系统测试,包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写,包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求: 1.熟练…

ng-container、‌ng-template 和 ng-content 区别

ng-container、‌ng-template 和 ng-content 都是 Angular 中用于处理和组织视图的工具,‌但它们各自具有不同的用途和行为。‌ ng-container:‌ 是一个虚拟的 HTML 容器,‌本身不会在最终渲染的 DOM 中创建任何实际的元素。‌它提供了一个包…

ref 和 reactive 区别

在Vue 3中,ref和reactive都是用于创建响应式数据的API,但它们之间存在一些关键的区别。以下是ref和reactive的主要区别: 1. 数据类型处理 ref:主要用于定义基本类型的数据(如字符串、数字、布尔值等)以及…

高阶面试-mongodb

mongodb的特点,为什么使用他 nosql数据库,前端到后端到数据库,都是json,无模式,数据模型发生变更,不需要强制更新表结构,可以快速实现需求迭代。 天生分布式,高可用,处…

人工智能与伦理挑战:多维度应对策略

人工智能技术近年来取得了迅猛发展,广泛应用于医疗诊断、金融分析、教育辅助、自动驾驶等各个领域,极大地提升了生产效率和服务质量,推动了科技进步和商业创新。然而,伴随其普及和应用的泛滥,AI也带来了数据隐私侵犯、…

C#知识|账号管理系统:添加账号的功能笔记

哈喽,你好啊,我是雷工! 本节记录账号管理系统中添加账号的逻辑过程,以下为学习笔记。 01 实现内容 ①:实现当点击【保存到数据库】按钮时,将账号名称、原创篇数、账号简介、账号类型显示的内容存储到LGAccountManagerDB数据库的Account表中; ②:实现点击【保存到数据库…