前言
1.介绍
Axon Framework是一个用于构建可扩展和高度可维护的企业级Java应用程序的开源框架。Axon是一个CQRS(命令查询责任分离)框架,它将命令和事件驱动的开发模式引入到领域驱动设计(DDD)中,可以帮助开发人员更容易地实现DDD模式。Axon框架提供了很多组件,如聚合、事件总线、命令总线、事件存储和查询模型等
下图是一个典型的基于Axon框架的系统设计:
2.整体架构
从整体架构进行分析,Axon框架由三大部分组成,包括领域模型组件、分派模型组件和Axon Server
其中,领域模型组件是Axon的核心组件,能帮助开发人员构建符合事件溯源和CQRS模式的DDD应用程序
分派模型组件提供针对领域模型的逻辑基础架构,包括支持对命令和查询的路由及协调操作,这些操作在Axon框架中同样被用来处理领域模型状态
Axon Server为前面提到的领域和分派模型组件提供物理基础架构
下图展示了Axon框架提供的技术组件的详细组成,可以看到Axon框架内置了一个外部对接组件,可以和MongoDB、Kafka等第三方基础设施组件进行交互,从而满足不同场景下的定制化需求
3.工作流程概述
基于这些技术组件,Axon框架的整体工作流程如下图所示:
在上图中,我们可以看出,位于上半部分的组件能够改变应用程序的状态,而位于下半部分的组件则读取或查询应用程序的状态。显然,在这种明确的分离状态中,我们嵌入了CQRS架构模式
我们可以进一步梳理整个DDD应用程序的工作流程。首先发起改变状态的操作,这类操作被建模为命令。而命令被传递到命令总线,命令总线找到针对这一命令的命令处理程序。我们知道,状态的变更过程是在命令处理程序中进行的,该处理程序使用资源库加载领域对象并执行业务逻辑,将业务逻辑处理所引起的变化作用到它的状态。一旦状态发生变化,代表状态变更的领域事件将被发布到事件总线,事件总线则确保将领域事件传递到必要的事件处理程序。最终,事件处理程序完成对领域事件的处理并把它们保存到事件存储器中,这样我们就可以查询到最新的领域状态信息
基于Axon框架提供的这些技术组件,开发人员无须从零开始实现CQRS架构模式和事件溯源机制,从而可以专注于业务逻辑的实现过程
4.Axon Server
介绍
Axon服务器是Axon框架为开发人员提供的一个可视化服务器组件,包括一批即插即用的功能组件
下载与启动
从官网下载即可,它就是一个SpringBoot程序,使用java -jar启动后,访问8024端口,就可以见到如下界面:
可以看到,这个控制台提供了一组监控和管理Axon服务器的功能,既包括设置、搜索、概览、用户等常规功能,也包括命令、查询等与CQRS直接相关的浏览界面,还包括与第三方组件进行集成的插件界面
5.DDD与Axon的映射关系
| DDD 概念 | Axon 实现 |
|---|---|
| 聚合 | @Aggregate |
| 实体 | @AggregateMember |
| 命令 | Command Message |
| 领域事件 | Event Message |
| 事件存储 | Event Store |
| 读模型 | Projection / Query Model |
| 值对象 | 无 |
6.相关组件
领域模型组件
- @Aggregate:表示当前类是聚合
- @CommandHandler:表示当前方法用于处理Command
- @QueryHandler:表示当前方法用来处理Query
- @EventHandler:表示当前方法用来处理Event
- @EventSourceHandler:事件溯源支持
- @AggregateMember:表是当前属性是实体
分派模型组件
- CommandBus:命令总线
- EventBus:事件总线
- QueryBus:查询总线