微服务项目部署配置文件示例:从开发到生产的完整指南
·
微服务项目部署配置文件示例:从开发到生产的完整指南
作者:xiaoliu
日期:2025年10月2日
项目:XiaoXOJ 在线判题系统
引言
在微服务架构中,合理的部署配置是确保系统稳定运行的关键。本文将基于 XiaoXOJ 在线判题系统的实际案例,详细介绍微服务项目的 Docker 化部署配置,涵盖环境隔离、服务发现、数据持久化等核心概念。
项目架构概览
XiaoXOJ 系统采用典型的微服务架构,包含以下核心服务:
- 基础设施服务:MySQL、Redis、RabbitMQ、Nacos
- 业务微服务:用户服务、题目服务、判题服务、API网关
- 网络架构:自定义桥接网络实现服务间通信
1. 基础设施服务配置
1.1 Docker Compose 环境配置文件 (docker-compose.env.yml)
version: '3.8'
services:
# MySQL 数据库配置
mysql:
image: mysql:5.7
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
container_name: xiaoxoj-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: xiaoxoj
MYSQL_USER: xiaoxoj
MYSQL_PASSWORD: xiaoxoj123
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql:/docker-entrypoint-initdb.d
networks:
- xiaoxoj-network
restart: unless-stopped
# Redis 缓存配置
redis:
image: redis:7-alpine
container_name: xiaoxoj-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- xiaoxoj-network
restart: unless-stopped
# RabbitMQ 消息队列配置
rabbitmq:
image: rabbitmq:3-management
container_name: xiaoxoj-rabbitmq
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin123
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- xiaoxoj-network
restart: unless-stopped
# Nacos 服务发现配置
nacos:
image: nacos/nacos-server:2.0.3
container_name: xiaoxoj-nacos
environment:
MODE: standalone
ports:
- "8848:8848"
volumes:
- nacos_data:/home/nacos/data
networks:
- xiaoxoj-network
restart: unless-stopped
volumes:
mysql_data:
redis_data:
rabbitmq_data:
nacos_data:
networks:
xiaoxoj-network:
driver: bridge
配置要点解析:
- 数据持久化:使用命名卷确保数据安全
- 字符集配置:MySQL 使用 utf8mb4 支持完整 Unicode
- 管理界面:RabbitMQ 提供 Web 管理界面(15672端口)
- 单机模式:Nacos 使用 standalone 模式简化部署
2. 业务微服务配置
2.1 Docker Compose 服务配置文件 (docker-compose.service.yml)
version: '3.8'
services:
# 用户服务配置
user-service:
build:
context: ./xiaoxoj-backend-user-service
dockerfile: Dockerfile
container_name: xiaoxoj-user-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=false
SPRING_REDIS_HOST: redis
ports:
- "8102:8102"
networks:
- xiaoxoj-network
restart: unless-stopped
# 题目服务配置
question-service:
build:
context: ./xiaoxoj-backend-question-service
dockerfile: Dockerfile
container_name: xiaoxoj-question-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=false
SPRING_REDIS_HOST: redis
SPRING_RABBITMQ_HOST: rabbitmq
ports:
- "8103:8103"
networks:
- xiaoxoj-network
restart: unless-stopped
# 判题服务配置
judge-service:
build:
context: ./xiaoxoj-backend-judge-service
dockerfile: Dockerfile
container_name: xiaoxoj-judge-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_RABBITMQ_HOST: rabbitmq
ports:
- "8104:8104"
networks:
- xiaoxoj-network
restart: unless-stopped
# API 网关配置
gateway:
build:
context: ./xiaoxoj-backend-gateway
dockerfile: Dockerfile
container_name: xiaoxoj-gateway
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
ports:
- "8101:8101"
networks:
- xiaoxoj-network
restart: unless-stopped
volumes:
mysql_data:
redis_data:
rabbitmq_data:
nacos_data:
networks:
xiaoxoj-network:
driver: bridge
微服务配置策略:
- 服务发现:通过 Nacos 实现动态服务注册与发现
- 环境隔离:使用
SPRING_PROFILES_ACTIVE=prod激活生产配置 - 服务依赖:通过 Docker 网络 DNS 实现服务间通信
- 端口映射:每个服务暴露特定端口供外部访问
3. Dockerfile 配置详解
3.1 统一的 Dockerfile 模板
# 基础镜像
FROM openjdk:8-jdk-alpine
# 维护者信息
LABEL maintainer="3440958688@qq.com"
# 设置工作目录
WORKDIR /app
# 复制jar包到容器中
COPY target/xiaoxoj-backend-*-service-*.jar app.jar
# 暴露端口
EXPOSE <服务端口>
# 设置JVM参数
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar --spring.profiles.active=prod"]
Dockerfile 最佳实践:
- 轻量基础镜像:使用 Alpine Linux 减少镜像大小
- 明确维护者:便于问题追踪和联系
- JVM 优化:设置合理的堆内存参数
- 安全随机数:使用
/dev/./urandom提高启动速度 - 配置文件:通过命令行参数指定激活的生产环境配置
4. 生产环境配置策略
4.1 应用配置文件 (application-prod.yml)
spring:
datasource:
url: jdbc:mysql://mysql:3306/xiaoxoj?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: rootpassword
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: redis
port: 6379
database: 0
rabbitmq:
host: rabbitmq
port: 5672
username: admin
password: admin123
virtual-host: /
cloud:
nacos:
discovery:
server-addr: nacos:8848
config:
server-addr: nacos:8848
file-extension: yaml
生产环境配置要点:
在每个服务目录下创建application-prod.yml文件(生成环境配置文件),在spring启动时激活这个文件,spring会把它和application.yml(主配置文件)合并,覆盖与application.yml中相同的配置属性部分
- 服务发现集成:所有服务注册到 Nacos 统一管理
- 数据库连接优化:启用公钥检索,禁用 SSL 简化连接
- 消息队列配置:指定虚拟主机实现资源隔离
- 配置中心:使用 Nacos 作为分布式配置中心
5. 部署流程与命令
5.1 分阶段部署策略
# 第一阶段:启动基础设施
docker-compose -f docker-compose.env.yml up -d
# 等待基础设施就绪
sleep 30
# 第二阶段:构建并启动业务服务
docker-compose -f docker-compose.service.yml up -d --build
# 查看服务状态
docker-compose -f docker-compose.service.yml ps
# 查看服务日志
docker-compose -f docker-compose.service.yml logs -f
5.2 健康检查与监控
# 检查服务健康状态
curl http://localhost:8101/actuator/health
# 查看 Nacos 服务注册情况
curl http://localhost:8848/nacos/v1/ns/service/list
# 监控容器资源使用
docker stats
# 查看服务日志
docker logs -f xiaoxoj-gateway --tail 100
6. 网络架构设计
6.1 自定义桥接网络配置
networks:
xiaoxoj-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.1
网络设计优势:
- 服务发现:容器间通过服务名直接通信
- 网络隔离:与宿主机网络隔离,提高安全性
- IP 管理:固定子网段便于管理和故障排查
7. 数据持久化策略
7.1 卷挂载配置
volumes:
mysql_data:
driver: local
redis_data:
driver: local
rabbitmq_data:
driver: local
nacos_data:
driver: local
持久化优势:
- 数据安全:容器重启或重建不影响数据
- 备份方便:可直接备份卷数据
- 迁移简单:卷可轻松迁移到其他宿主机
8. 故障恢复与高可用
8.1 自动重启策略
restart: unless-stopped
重启策略说明:
unless-stopped:除非手动停止,否则自动重启- 确保服务异常退出后能够自动恢复
8.2 依赖管理策略
# 注释掉的 depends_on 示例
# depends_on:
# - mysql
# - redis
# - nacos
依赖管理说明:
- 使用应用级健康检查替代容器级依赖
- 避免虚假的"就绪"状态,提高可靠性
9. 安全配置建议
9.1 生产环境安全加固
# MySQL 安全配置
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_PASSWORD: ${DB_APP_PASSWORD}
# 使用环境变量文件
env_file:
- .env.production
9.2 网络访问控制
# 限制不必要的端口暴露
ports:
- "8101:8101" # 仅暴露网关端口
10. 性能优化建议
10.1 资源限制配置
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
reservations:
memory: 512M
cpus: '0.25'
10.2 JVM 调优参数
ENV JAVA_OPTS="-Xmx512m -Xms256m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
总结
本文通过 XiaoXOJ 项目的实际案例,详细介绍了微服务项目的 Docker 化部署配置。关键要点包括:
- 环境分离:基础设施与业务服务分开部署
- 配置管理:多环境配置与集中式配置中心结合
- 网络设计:自定义网络实现服务隔离与通信
- 数据持久化:卷挂载确保数据安全
- 健康管理:完善的健康检查与自动恢复机制
这种配置方案具有良好的可扩展性和可维护性,适合中小型微服务项目的生产环境部署。随着业务规模的增长,可进一步引入 Kubernetes 等更复杂的编排工具。
附录:完整部署命令示例
# 克隆项目
git clone https://github.com/your-repo/xiaoxoj-backend-microservice.git
cd xiaoxoj-backend-microservice
# 构建项目
mvn clean package -DskipTests
# 部署基础设施
docker-compose -f docker-compose.env.yml up -d
# 部署业务服务
docker-compose -f docker-compose.service.yml up -d --build
# 验证部署
curl http://localhost:8101/actuator/health
通过以上配置和命令,您可以快速部署一个完整的微服务系统。希望本文对您的微服务部署实践有所帮助!
更多推荐



所有评论(0)