Wild Workouts Go DDD 示例项目中的Docker Compose架构解析
2025-07-07 08:27:48作者:霍妲思
项目概述
Wild Workouts是一个基于Go语言实现的健身应用示例项目,采用领域驱动设计(DDD)架构。该项目通过Docker Compose文件展示了如何组织和管理多个微服务及其依赖项。
Docker Compose文件结构分析
该docker-compose.yml文件定义了一个完整的微服务系统,包含以下核心组件:
1. 前端服务(web)
web:
build:
context: docker/web
dockerfile: Dockerfile
working_dir: /web
volumes:
- ./web:/web
- /web/node_modules/
ports:
- "127.0.0.1:8080:8080"
- 使用独立的Dockerfile构建前端应用
- 采用卷映射实现开发环境的热重载
- 隔离node_modules目录避免主机与容器冲突
- 暴露8080端口供本地访问
2. 微服务架构
项目包含多个微服务,每个服务都有HTTP和gRPC两种接口形式:
训练师服务(trainer)
- HTTP接口:3000端口
- gRPC接口:3010端口
训练服务(trainings)
- HTTP接口:3001端口
用户服务(users)
- HTTP接口:3002端口
- gRPC接口:3020端口
所有Go服务共享以下配置特点:
- 使用相同的应用构建上下文(docker/app)
- 挂载内部代码目录实现开发热重载
- 配置Go模块缓存和构建缓存提高构建效率
- 依赖Firestore数据库服务
3. 数据存储服务
Firestore模拟器
firestore:
build:
context: docker/firestore-emulator
ports:
- "127.0.0.1:8787:8787"
- "127.0.0.1:4000:4000"
- 提供本地开发用的Firestore模拟环境
- 8787端口用于管理界面
- 4000端口用于API访问
MySQL数据库
mysql:
image: mariadb:10
volumes:
- ./sql/schema.sql:/docker-entrypoint-initdb.d/schema.sql
ports:
- "127.0.0.1:3306:3306"
- 使用MariaDB 10镜像
- 自动执行提供的SQL模式初始化脚本
- 标准MySQL 3306端口
环境配置与依赖管理
所有服务都支持.env文件配置:
env_file:
- .env
关键环境变量包括:
- GOCACHE:控制Go构建缓存位置
- SERVER_TO_RUN:决定服务启动HTTP还是gRPC接口
- 各种数据库连接配置
开发环境最佳实践
-
依赖隔离:每个服务都有明确的依赖声明,如
depends_on
确保数据库先启动 -
构建优化:
- 共享Go模块缓存(.go/pkg)
- 独立Go构建缓存(.go-cache)
-
端口管理:
- 所有服务都绑定到127.0.0.1,避免意外暴露到网络
- 端口分配清晰有序(3000系列)
-
热重载支持:
- 前端:直接映射源码目录
- 后端:映射internal目录
部署考量
虽然这是一个开发环境配置,但体现了生产环境的多个重要原则:
- 服务分离:不同功能拆分为独立服务
- 接口多样性:同时支持HTTP和gRPC
- 数据持久化:数据库服务配置了自动重启策略
- 配置集中管理:通过.env文件统一配置
总结
这个Docker Compose配置展示了如何在开发环境中组织一个基于DDD的Go微服务项目。它清晰地划分了服务边界,提供了高效的开发工作流,同时保持了接近生产环境的架构设计。对于学习现代Go微服务开发的工程师来说,这是一个非常有参考价值的实例。