当前位置: 首页 > news >正文

Spring Boot与Axon Framework整合教程

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


简介

Axon Framework是一个用于构建CQRS(命令查询职责分离)和事件溯源(Event Sourcing)应用的框架,而Spring Boot提供了快速开发能力。二者结合可高效实现高扩展性、可维护的分布式系统。


环境准备

  • JDK 17+
  • Spring Boot 3.2+
  • Axon Framework 4.9+
  • Maven/Gradle

步骤详解

1. 创建Spring Boot项目

使用start.spring.io生成基础项目,选择:

  • Spring Web
  • Lombok(可选)

2. 添加Axon依赖

<!-- pom.xml -->
<dependency><groupId>org.axonframework</groupId><artifactId>axon-spring-boot-starter</artifactId><version>4.9.0</version>
</dependency>

3. 配置Axon(可选)

# application.yml
axon:serializer:general: jacksoneventhandling:processors:default: tracking

示例:银行账户管理

1. 定义命令(Command)

// 开户命令
public record CreateAccountCommand(String accountId, int initialBalance) {}// 存款命令
public record DepositMoneyCommand(String accountId, int amount) {}// 取款命令
public record WithdrawMoneyCommand(String accountId, int amount) {}

2. 定义事件(Event)

// 账户创建事件
public record AccountCreatedEvent(String accountId, int initialBalance) {}// 存款事件
public record MoneyDepositedEvent(String accountId, int amount) {}// 取款事件
public record MoneyWithdrawnEvent(String accountId, int amount) {}

3. 创建聚合根(Aggregate)

@Aggregate
@Getter
@NoArgsConstructor
public class BankAccountAggregate {@AggregateIdentifierprivate String accountId;private int balance;@CommandHandlerpublic BankAccountAggregate(CreateAccountCommand command) {apply(new AccountCreatedEvent(command.accountId(), command.initialBalance()));}@CommandHandlerpublic void handle(DepositMoneyCommand command) {apply(new MoneyDepositedEvent(command.accountId(), command.amount()));}@CommandHandlerpublic void handle(WithdrawMoneyCommand command) {if (balance < command.amount()) {throw new InsufficientBalanceException();}apply(new MoneyWithdrawnEvent(command.accountId(), command.amount()));}@EventSourcingHandlerpublic void on(AccountCreatedEvent event) {this.accountId = event.accountId();this.balance = event.initialBalance();}@EventSourcingHandlerpublic void on(MoneyDepositedEvent event) {balance += event.amount();}@EventSourcingHandlerpublic void on(MoneyWithdrawnEvent event) {balance -= event.amount();}
}

4. 创建Query处理

@Service
public class AccountQueryService {private final Map<String, Integer> accounts = new ConcurrentHashMap<>();@EventHandlerpublic void on(AccountCreatedEvent event) {accounts.put(event.accountId(), event.initialBalance());}@EventHandlerpublic void on(MoneyDepositedEvent event) {accounts.computeIfPresent(event.accountId(), (k, v) -> v + event.amount());}@EventHandlerpublic void on(MoneyWithdrawnEvent event) {accounts.computeIfPresent(event.accountId(), (k, v) -> v - event.amount());}@QueryHandlerpublic Integer handle(GetBalanceQuery query) {return accounts.get(query.accountId());}
}

5. 创建REST接口

@RestController
@RequestMapping("/accounts")
@RequiredArgsConstructor
public class AccountController {private final CommandGateway commandGateway;private final QueryGateway queryGateway;@PostMappingpublic CompletableFuture<String> createAccount(@RequestBody CreateAccountRequest request) {return commandGateway.send(new CreateAccountCommand(UUID.randomUUID().toString(),request.initialBalance()));}@GetMapping("/{accountId}/balance")public CompletableFuture<Integer> getBalance(@PathVariable String accountId) {return queryGateway.query(new GetBalanceQuery(accountId), Integer.class);}
}

运行与测试

  1. 启动Spring Boot应用
  2. 使用curl测试:
# 创建账户
curl -X POST -H "Content-Type: application/json" -d '{"initialBalance":1000}' http://localhost:8080/accounts# 查询余额(替换{accountId})
curl http://localhost:8080/accounts/{accountId}/balance

关键配置说明

  1. 序列化配置:建议使用Jackson进行JSON序列化
  2. 事件存储:默认使用内存存储,生产环境可配置JPA或JDBC
  3. 分布式处理:通过axon-distributed-command-bus实现命令总线扩展

扩展方向

  1. 添加JPA事件存储
  2. 集成Spring Security进行权限控制
  3. 配置Saga实现复杂事务
  4. 使用Axon Server进行集群管理

通过本教程,您已完成了一个基础的CQRS/ES系统实现。建议通过Axon Dashboard监控事件流,并逐步添加更复杂的业务逻辑。

相关文章:

Spring Boot与Axon Framework整合教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 Axon Framework是一个用于构建CQRS&#xff08;命令查询职责分离&#xff09;和事件溯源&#xff08;Event Sourcing&#xff09;应用的框架&#xff0…...

深度学习Dropout

一、概念 Dropout是为了解决过拟合&#xff0c;当层数加深&#xff0c;就有可能过拟合&#xff0c;这个时候模型太复杂就会过拟合&#xff0c;那么可以让模型变得简单一点&#xff0c;所以就可以随机挑一些神经元&#xff0c;让某些神经元的输出是0&#xff0c;只保留部分神经…...

2025华为OD机试真题E卷 - 螺旋数字矩阵【Java】

题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,…,n,最终形成一个 m 行矩阵。小明对这个矩阵有些要求: 1、…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)示例3: 行选择

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

Linux驱动开发(1.基础创建)

序言&#xff1a;从高层逻辑到底层硬件的回归 在当今的软件开发中&#xff0c;我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增&#xff0c;却也逐渐模糊了我们对计算机本质的认知&#xff1a;一切代码终将落地为…...

mmseg

系列文章目录 文章目录 系列文章目录bug bug File "/public/home/rsinfo/project/mmsegmentation/mmseg/__init__.py", line 61, in <module>assert (mmcv_min_version < mmcv_version < mmcv_max_version), \ AssertionError: MMCV2.2.0 is used but i…...

LangChain核心概念

下面整理的LangChain部分核心概念&#xff1a; 聊天模型【Chat models】&#xff1a;通过聊天 API 暴露的大语言模型&#xff08;LLMs&#xff09;&#xff0c;将消息序列作为输入&#xff0c;并输出一条消息。消息【Messages】&#xff1a;聊天模型中的通信单元&#xff0c;…...

阿里巴巴全新推理模型QwQ-32B:性能比肩DeepSeek-R1,开源引领未来

摘要 阿里巴巴集团于深夜正式发布全新推理模型QwQ-32B&#xff0c;其性能与DeepSeek-R1完整版相当。该模型已通过Apache 2.0开源协议在Hugging Face和ModelScope平台发布。用户可通过Qwen Chat平台直接体验QwQ-32B的强大功能。这一举措不仅展示了阿里巴巴在人工智能领域的技术实…...

使用Arduino和ESP8266进行基于物联网的垃圾箱监控

使用 Arduino 和 ESP8266 的基于 IOT 的垃圾箱监控系统 在这个 DIY 中,我们将制作一个基于 IOT 的垃圾箱/垃圾监控系统,该系统将通过网络服务器告诉我们垃圾桶是空的还是满的,并且您可以通过互联网从世界任何地方了解“垃圾桶”或“垃圾箱”的状态。它将非常有用,可以安装…...

【Python爬虫】爬取公共交通路网数据

程序来自于Github&#xff0c;以下这篇博客作为完整的学习记录&#xff0c;也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据&#xff0c;并生成shp文件&#xff0c;…...

基于Matlab的人脸识别的二维PCA

一、基本原理 传统 PCA 在处理图像数据时&#xff0c;需将二维图像矩阵拉伸为一维向量&#xff0c;这使得数据维度剧增&#xff0c;引发高计算成本与存储压力。与之不同&#xff0c;2DPCA 直接基于二维图像矩阵展开运算。 它着眼于图像矩阵的列向量&#xff0c;构建协方差矩阵…...

SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放

序言&#xff1a; 本文介绍通过SSM架构 NginxFFmpeg实现rtsp流转hls流&#xff0c;在前端html上实现视频播放功能。此方法可用于网络摄像头RTSP视频流WEB端实时播放。&#xff08;海康和大华都可以&#xff09;&#xff0c;我使用的是海康 步骤一&#xff1a;安装软件 FFmpeg…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-3.2.3 案例:新闻搜索引擎的相关性优化

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch新闻搜索引擎相关性优化实战3.2.3 案例&#xff1a;新闻搜索引擎的相关性优化项目背景1. 相关性问题诊断与分析1.1 初始查询DSL示例1.2 问题诊断矩阵1.3 性能基…...

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…...

体验开源openeuler openharmony stratovirt模拟器

文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统…...

【C++】:STL详解 —— 红黑树

目录 平衡二叉查找树 红黑树的概念 红黑树的五大性质 红黑树的效率 红黑树和AVL树的比较 插入与删除操作 内存与实现复杂度 经典性能数据对比 总结 对旋转的基本理解 旋转的作用 左旋&#xff08;Left Rotation&#xff09; 右旋&#xff08;Right Rotation&#xf…...

蓝桥试题:蓝桥勇士(LIS)

一、题目描述 小明是蓝桥王国的勇士&#xff0c;他晋升为蓝桥骑士&#xff0c;于是他决定不断突破自我。 这天蓝桥首席骑士长给他安排了 N 个对手&#xff0c;他们的战力值分别为 a1,a2,...,an​&#xff0c;且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战&#xf…...

Trae IDE新建C#工程

目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说&#xff0c;Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…...

Linux基础--进程管理

目录 静态查看进程 使用命令: ps 动态查看进程 使用命令: top 关闭进程: 使用命令: kill 查看进程占用端口 使用命令: ss ​编辑 查看某端口是否被进程占用 使用命令: lsof 作业管理 进程后台运行: 使用命令: jobs 将后台进程调回前台 使用指令: fg 将前台进…...

Java面向对象(详细解释)

第一章 Static关键字 1.static的介绍以及基本使用 1.概述&#xff1a;static是一个静态关键字 2.使用&#xff1a; a.修饰一个成员变量&#xff1a; static 数据类型 变量名 b.修饰一个方法&#xff1a; 修饰符 static 返回值类型 方法名&#xff08;形参&#xff09;{…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...