AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

使用 Axon 框架实现一个 CQRS 示例应用

  • 2016-02-01
  • 本文字数:1335 字

    阅读完需:约 4 分钟

命令查询职责分离(CQRS)是构建软件系统的一种方式,它的思想是将对状态的查询部分与改变状态的部分进行分离。 Axon 框架是一个基于 Java 实现的 CQRS 框架,提供了对大多数重要构建块的实现,例如聚合、命令与事件总线、以及 repository,以帮助开发者在构建应用程序时使用 CQRS 架构模式。 Dadepo Aderemi 最近撰写了一系列博客文章,讲解了 CQRS 的概念,并通过一个小型的 CQRS 演示应用,探索Axon 框架所提供的各种构建块

Aderemi 是来位于阿姆斯特丹的 Trifork 公司的一位软件开发者,对于他来说,CQRS 中的命令这方面最重要的部分包括:

  • 命令(Command),它负责捕获用户的意图,即接下来应该发生什么事。在 Axon 中,命令被实现为 POJO 对象,因而无需实现任何接口。
  • 命令处理器(Command Handler),它负责执行所发送的命令。在 Axon 中,可以选择通过实现某个接口的方式创建它,也可以通过注解符实现。
  • 命令总线(Command Bus),负责将命令传递给对应的命令处理器。Axon 总共提供了四种实现方式,Aderemi 选择了一种简单的同步总线用于传递命令。另一种实现方式是通过异步总线以异步的方式处理命令。

Aderemi 指出,在 CQRS 的相关讨论中经常会出现源于领域驱动设计(DDD)的一些概念,他相信对于 DDD 的基本了解有助于 CQRS 的学习。这其中有两个重要的概念,一是聚合(Aggregate),这是一种逻辑性的概念,它定义了一个领域对象的集合,处于该集合中的对象具有原子性,表现为一个内聚的总体。另一个概念是聚合根(Aggregate Root),它指的是聚合中的某个实体,它内含其它实体对象,并负责确保整个聚合始终处于一致的、内聚的状态。在 Axon 中提供了一个 _AbstractAggregateRoot_ 类型,可以通过扩展它实现一个聚合根。

在查询这一方面,最重要的部分包括:

  • 领域事件(Domain Event),它表示发生于过去的某事,由领域中的状态变化、命令及命令处理器中所初始化的变化所创建。
  • 事件总线(Event Bus),它负责将事件传递给查询方。Axon 中提供了多种实现方式,Aderemi 选择了一种较简单的实现。
  • 事件处理器(Event Handler),它负责侦听事件,通过事件中所包含的信息,在查询方反应出应用程序的状态。在 Axon 中,可通过注解符定义事件处理器。

通过事件溯源(Event Sourcing),所有对状态造成变化的事件都被保存下来,而不是保存应用当前的状态。可以通过对于原始状态重演所有已发生事件的方式获取当前状态。Axon 对于EventStore 接口提供了多种实现方式,包括NoSQL 和关系型数据库的实现。在Aderemi 的演示应用的后期版本中,他实现了一个事件溯源策略,能够将事件持久化至文件中。

Axon 还提供了一个测试的基础设施,它的实现方式遵循行为驱动开发(BDD)的思想。Aderemi 在他的演示应用中包含了测试代码。他特别指出,该测试基础设施所关注的是作为对所发送的命令的回应而发布的事件,这样可以避免产生对某个API 实现的依赖。

Aderemi 已将他的演示应用 exploringCQRSwithAxon 发布在 GitHub 上。他正准备在一篇总结性的文章中表达他对于 CQRS 这种架构,以及 Axon 如何帮助使用者实现这一架构的观点。

Axon 框架是由同样任职于 Trifork 的 Allard Buijze 所开发的一套开源产品,计划在 2016 年第一季度推出第三个版本。

查看英文原文: CQRS Example Using Axon Framework

2016-02-01 18:009710
用户头像

发布了 428 篇内容, 共 191.1 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

J神出品!让 Compose 从此摆脱 ViewModel

Java-fenn

Java java;

当你 git push 时,极狐GitLab上发生了什么?

极狐GitLab

DevOps gitlab SSH gitops 极狐GitLab

数据湖系列之二 | 打造无限扩展的云存储系统,元数据存储底座的设计和实践

Baidu AICLOUD

数据湖 元数据

最全Java面试攻略,吃透25个技术栈Offer拿到手软

Java-fenn

Java 编程 程序员 java面试 Java面试题

Js 异步处理演进,Callback=>Promise=>Observer

掘金安东尼

前端 异步 函数式 9月月更

我所知道的webpack5那些不太一样的改变

Java-fenn

Java

TiDB Hackathon 2022丨总奖金池超 35 万!邀你唤醒代码世界的更多可能性!

PingCAP

#TiDB

牛客网趋势最热Java八股文,速度赶紧马上打包带走!

Java-fenn

Java 编程 程序员 java面试 Java面试题

金九银十必备!这份java面经让你轻松拿下45kOffer

Java-fenn

Java 程序员 面试 java面试 Java面试题

日系“怎样”系列新版升级,一本书讲透程序运行的方方面面

图灵教育

Python 程序员 C语言 计算机

2022年震荡与加速中前行的新消费

易观分析

疫情 消费

Github最新Java面试1658核心讲,助力百人入大厂!

Java-fenn

Java 编程 程序员 java面试 Java面试题

运维智能化的三大关键技术

穿过生命散发芬芳

9月月更 运维智能化

智慧楼宇:东京建物引入“ZETA+AI”物联监测方案,实现楼宇预测性维护

ZETA开发者

人工智能 AWS 预测性维护 设备预测性维护 ZETA

Kong重构了其事件通知机制

八苦-瞿昙

Event Gateway API Gateway

MyBatis批量插入几千条数据慎用foreach

Java-fenn

Java

【9.16-9.23】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

怎样体面地讲道理?

图灵教育

写作 表达 逻辑

日系“怎样”系列新版升级,一本书讲透程序运行的方方面面

图灵社区

Python 程序员 C语言 计算机

怎样体面地讲道理?

图灵社区

写作 表达 逻辑

CAT 认证敏捷团队教练工作坊 (Coaching Agile Teams) | 2023年1月 7 日开课

ShineScrum

敏捷教练 专业教练

电商黄牛,你被小红书盯上了

小红书技术REDtech

算法 电商风控 黄牛治理

前端必读3.0:如何在 Angular 中使用SpreadJS实现导入和导出 Excel 文件

葡萄城技术团队

2021年中国自然语言处理软件及服务市场规模超200亿,市场保持高速增长,竞争格局远未稳定

易观分析

自然语言处理 市场

聚焦金融行业未来,博睿数据亮相第五届中国银行CIO峰会

博睿数据

AIOPS 金融 银行 博睿数据 ONE平台

测试驱动开发 (TDD) 在线练功房 | 12 月 17 日开课

ShineScrum

通过 Kasten K10 by Veeam 与 SUSE Rancher 实现云原生应用灾备迁移

Java-fenn

Java

关于进阶这件事,这位 Python 大佬有话说

图灵社区

Python 程序员 进阶 计算机

华为云GaussDB——打造金融行业坚实数据底座,共创数字金融新未来

Java-fenn

Java

SelectDB 创始人兼 CEO 连林江荣获 OSCAR 开源产业大会「尖峰开源人物 」奖项

SelectDB

数据库 大数据 数据仓库 企业号九月金秋榜 尖峰开源

安利一个比Gitbook更好用的国内帮助文档制作平台

Baklib

使用Axon框架实现一个CQRS示例应用_语言 & 开发_Jan Stenberg_InfoQ精选文章