微服务项目部署配置文件示例:从开发到生产的完整指南

作者: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

配置要点解析:

  1. 数据持久化:使用命名卷确保数据安全
  2. 字符集配置:MySQL 使用 utf8mb4 支持完整 Unicode
  3. 管理界面:RabbitMQ 提供 Web 管理界面(15672端口)
  4. 单机模式: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

微服务配置策略:

  1. 服务发现:通过 Nacos 实现动态服务注册与发现
  2. 环境隔离:使用 SPRING_PROFILES_ACTIVE=prod 激活生产配置
  3. 服务依赖:通过 Docker 网络 DNS 实现服务间通信
  4. 端口映射:每个服务暴露特定端口供外部访问

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 最佳实践:

  1. 轻量基础镜像:使用 Alpine Linux 减少镜像大小
  2. 明确维护者:便于问题追踪和联系
  3. JVM 优化:设置合理的堆内存参数
  4. 安全随机数:使用 /dev/./urandom 提高启动速度
  5. 配置文件:通过命令行参数指定激活的生产环境配置

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中相同的配置属性部分

  1. 服务发现集成:所有服务注册到 Nacos 统一管理
  2. 数据库连接优化:启用公钥检索,禁用 SSL 简化连接
  3. 消息队列配置:指定虚拟主机实现资源隔离
  4. 配置中心:使用 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

网络设计优势:

  1. 服务发现:容器间通过服务名直接通信
  2. 网络隔离:与宿主机网络隔离,提高安全性
  3. IP 管理:固定子网段便于管理和故障排查

7. 数据持久化策略

7.1 卷挂载配置

volumes:
  mysql_data:
    driver: local
  redis_data:
    driver: local
  rabbitmq_data:
    driver: local
  nacos_data:
    driver: local

持久化优势:

  1. 数据安全:容器重启或重建不影响数据
  2. 备份方便:可直接备份卷数据
  3. 迁移简单:卷可轻松迁移到其他宿主机

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 化部署配置。关键要点包括:

  1. 环境分离:基础设施与业务服务分开部署
  2. 配置管理:多环境配置与集中式配置中心结合
  3. 网络设计:自定义网络实现服务隔离与通信
  4. 数据持久化:卷挂载确保数据安全
  5. 健康管理:完善的健康检查与自动恢复机制

这种配置方案具有良好的可扩展性和可维护性,适合中小型微服务项目的生产环境部署。随着业务规模的增长,可进一步引入 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

通过以上配置和命令,您可以快速部署一个完整的微服务系统。希望本文对您的微服务部署实践有所帮助!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐