基于事件溯源的银行系统Docker部署指南
2025-07-10 02:52:52作者:滕妙奇
本文将以cer/event-sourcing-examples项目中的Java Spring实现为例,详细讲解如何使用Docker Compose部署一个基于事件溯源(Event Sourcing)架构的银行系统。
系统架构概述
这个银行系统示例采用了微服务架构和事件溯源模式,主要包含以下组件:
- 基础设施服务:Zookeeper、Kafka、MySQL、MongoDB
- 核心业务服务:账户服务、交易服务、客户服务
- 查询服务:账户视图服务、客户视图服务
- 辅助服务:CDC(变更数据捕获)服务、API网关
环境准备
在开始部署前,请确保已安装:
- Docker 19.03+
- Docker Compose 1.25+
详细部署配置解析
1. 基础设施服务配置
Zookeeper服务:
zookeeper:
image: eventuateio/eventuateio-local-zookeeper:0.9.0
ports:
- 2181:2181 # 客户端连接端口
- 2888:2888 # 集群内通信端口
- 3888:3888 # 选举端口
Zookeeper作为分布式协调服务,为Kafka提供集群管理和元数据存储功能。
Kafka服务:
kafka:
image: eventuateio/eventuateio-local-kafka:0.9.0
ports:
- 9092:9092
links:
- zookeeper
environment:
- ADVERTISED_HOST_NAME=${DOCKER_HOST_IP}
- KAFKA_HEAP_OPTS=-Xmx320m -Xms320m
- ZOOKEEPER_SERVERS=zookeeper:2181
Kafka作为事件总线的核心组件,需要注意:
ADVERTISED_HOST_NAME
必须正确设置,否则生产者无法连接- 通过
links
确保Kafka能访问Zookeeper - 内存配置适合开发环境,生产环境需调整
MySQL数据库:
mysql:
image: eventuateio/eventuateio-local-mysql:0.9.0
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_USER=mysqluser
- MYSQL_PASSWORD=mysqlpw
MySQL作为命令端(CQRS中的Command端)的持久化存储,存储领域事件和聚合状态。
MongoDB数据库:
mongodb:
extends:
file: docker-compose-common.yml
service: mongodb
MongoDB作为查询端(CQRS中的Query端)的存储,为视图服务提供高效查询能力。
2. CDC服务配置
cdcservice:
image: eventuateio/eventuateio-local-cdc-service:0.9.0
ports:
- "8099:8080"
links:
- mysql
- kafka
- zookeeper
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate
SPRING_DATASOURCE_USERNAME: mysqluser
SPRING_DATASOURCE_PASSWORD: mysqlpw
SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver
EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092
EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181
EVENTUATELOCAL_CDC_DB_USER_NAME: root
EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword
CDC(Change Data Capture)服务是关键组件,它:
- 监控MySQL中的事件表变更
- 将变更发布到Kafka
- 确保事件可靠传递
- 暴露在8099端口供管理
3. 业务服务配置
账户服务:
accountsservice:
extends:
file: docker-compose-common.yml
service: accountsservice
links:
- mysql
- kafka
- zookeeper
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate
SPRING_DATASOURCE_USERNAME: mysqluser
SPRING_DATASOURCE_PASSWORD: mysqlpw
SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver
EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092
EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181
EVENTUATELOCAL_CDC_DB_USER_NAME: root
EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword
账户服务处理账户相关命令,如创建账户、存款、取款等操作,并将事件持久化到MySQL。
交易服务:
transactionsservice:
extends:
file: docker-compose-common.yml
service: transactionsservice
links:
- mysql
- kafka
- zookeeper
environment: [...]
交易服务处理转账等交易操作,同样遵循事件溯源模式。
客户服务:
customersservice:
extends:
file: docker-compose-common.yml
service: customersservice
links:
- mysql
- kafka
- zookeeper
environment: [...]
客户服务管理客户信息,如注册、更新客户资料等。
4. 视图服务配置
账户视图服务:
accountsviewservice:
extends:
file: docker-compose-common.yml
service: accountsviewservice
links:
- mongodb
- mysql
- kafka
- zookeeper
environment:
SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb
[...]
账户视图服务:
- 订阅账户相关事件
- 在MongoDB中维护账户的当前状态
- 提供高效的查询接口
客户视图服务:
customersviewservice:
extends:
file: docker-compose-common.yml
service: customersviewservice
links:
- mongodb
- mysql
- kafka
- zookeeper
environment:
SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb
[...]
客户视图服务类似,维护客户信息的查询模型。
5. API网关配置
apigateway:
extends:
file: docker-compose-common.yml
service: apigateway
links:
- accountsservice
- transactionsservice
- accountsviewservice
- customersservice
- customersviewservice
- mongodb
API网关作为系统入口,提供统一的API访问点,并负责路由请求到各个微服务。
部署与启动
- 创建
.env
文件,设置DOCKER_HOST_IP
为你的Docker主机IP - 执行命令:
docker-compose -f docker-compose-eventuate-local.yml up -d
- 等待所有服务启动完成(首次启动可能需要较长时间下载镜像)
系统验证
- 检查Kafka主题是否创建成功
- 验证MySQL中是否创建了事件表
- 通过API网关测试各个服务接口
生产环境建议
- 增加服务副本数以提高可用性
- 配置更合理的内存参数
- 添加监控和日志收集
- 考虑使用更安全的认证机制
总结
通过这个Docker Compose配置,我们完整部署了一个基于事件溯源的银行系统。这种架构的优势在于:
- 完整保存业务状态变更历史
- 天然支持审计需求
- 读写分离提高系统性能
- 易于实现事件驱动的系统集成
理解这个配置有助于掌握事件溯源和CQRS模式的实际应用,为构建复杂业务系统提供参考。