首页
/ 基于事件溯源的银行系统Docker部署指南

基于事件溯源的银行系统Docker部署指南

2025-07-10 02:52:52作者:滕妙奇

本文将以cer/event-sourcing-examples项目中的Java Spring实现为例,详细讲解如何使用Docker Compose部署一个基于事件溯源(Event Sourcing)架构的银行系统。

系统架构概述

这个银行系统示例采用了微服务架构和事件溯源模式,主要包含以下组件:

  1. 基础设施服务:Zookeeper、Kafka、MySQL、MongoDB
  2. 核心业务服务:账户服务、交易服务、客户服务
  3. 查询服务:账户视图服务、客户视图服务
  4. 辅助服务: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访问点,并负责路由请求到各个微服务。

部署与启动

  1. 创建.env文件,设置DOCKER_HOST_IP为你的Docker主机IP
  2. 执行命令:docker-compose -f docker-compose-eventuate-local.yml up -d
  3. 等待所有服务启动完成(首次启动可能需要较长时间下载镜像)

系统验证

  1. 检查Kafka主题是否创建成功
  2. 验证MySQL中是否创建了事件表
  3. 通过API网关测试各个服务接口

生产环境建议

  1. 增加服务副本数以提高可用性
  2. 配置更合理的内存参数
  3. 添加监控和日志收集
  4. 考虑使用更安全的认证机制

总结

通过这个Docker Compose配置,我们完整部署了一个基于事件溯源的银行系统。这种架构的优势在于:

  • 完整保存业务状态变更历史
  • 天然支持审计需求
  • 读写分离提高系统性能
  • 易于实现事件驱动的系统集成

理解这个配置有助于掌握事件溯源和CQRS模式的实际应用,为构建复杂业务系统提供参考。