硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

使用 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:009828
用户头像

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

关注

评论

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

团队建设,凝聚人心打胜战

一笑

管理 团队建设 28天写作

融资融券两融系统搭建开发

v16629866266

区块链真正的价值即将“引爆”行业应用

CECBC

区块链金融

区块链人才能力评价测试机构亮相

CECBC

区块链人才

jdk8 String和StringBuilder对象创建所在位置

ilovealt

Java string StringBuilder

BAT面试Spring全家桶:Spring+SpringBoot+SpringCloud+SpringMVC

Java架构之路

Java 程序员 架构 面试 编程语言

Elasticsearch 是分布式文件存储么 ?

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

架构师训练营第 2 期 第 7 周 作业一

老腊肉

架构师训练营第2期

软件教练说:性能优化与性能设计,“相亲相爱”的一对

华为云开发者联盟

架构 性能优化 设计 程序 软件教练

面试官问:ZooKeeper是强一致的吗?怎么实现的?

Java 编程 程序员 面试 分布式

阿里一线架构师甩出“源码阅读指南”,从源码到实战,一键搞定

比伯

Java 编程 程序员 架构 计算机

成长篇-结构思考力笔记(完整版)

小诚信驿站

程序员 刘晓成 小诚信驿站 成长笔记 28天写作

Soul 源码阅读 06|Nacos 同步数据分析

哼干嘛

架构解读丨Volcano作业资源预留设计原理

华为云开发者联盟

批处理 Volcano 资源预留 作业资源预留

30+程序员竞争力从哪里来?

我心依然

程序员 竞争力

苹果设备电池及充电周期

张老蔫

28天写作

数字货币将如何改变日常生活

CECBC

数字货币

谁,是产品的利益相关方?

不离

极客大学认识产品经理 极客大学产品经理训练营 跟着二爷学产品

NeoKylin-Server-5.0离线部署etcd+flannel集群,实现docker容器跨主机网络通信

星河寒水

Docker etcd flannel 麒麟操作系统 离线部署

奇葩java迭代器笔试题,做对算你厉害

田维常

迭代器模式

产业互联网业务与团队的思考

Geek_vidmje

真狠!涵盖了Netty+Spark+Hadoop+分布式五部分!讲的清清楚楚!

996小迁

redis hadoop 架构 面试 Netty

Java学习笔记整理:Spring+tomcat+Kafka+多线程面试笔记

Java架构之路

Java 程序员 架构 面试 编程语言

14天1000+大集群滚动升级,银行柜台竟然毫无感觉

华为云开发者联盟

大数据 金融 FusionInsight 华为云 集群

【Node.js】事件触发器 - 基础篇

德育处主任

Node 28天写作

两种端到端通用目标检测方法

华为云开发者联盟

训练 目标检测 端到端 DETR DeFCN

老外程序员的Java性能优化方式是什么?JVM调优策略+工具+技巧

Java架构追梦

Java 学习 架构 面试 jvm调优

蚂蚁金服二面被血虐,鬼知道面试的我经历了什么?

Java架构之路

Java 程序员 架构 面试 编程语言

Mybatis【16】-- Mybatis多对一关联查询

秦怀杂货店

数据库 mybatis

浅说 SQLite 的许可证模式

Justin

开源 版权保护 28天写作

localStorage和sessionStorage本地存储

我是哪吒

html html5 面试 大前端 html/css

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