背景

本文是《Java 后端从小白到大神》修仙系列之框架学习,Spring Cloud 微服务实战系列的 第十篇。Spring Cloud 是构建微服务架构的基石,拥有完整的服务治理生态,在云原生架构中广泛应用。本系列将从架构认知到实际工程,逐步构建一套企业级 Spring Cloud 微服务项目。若想详细学习请点击首篇博文开始,现在开始学习。

文章概览

微服务 DevOps 实战:Jenkins + Docker + docker-compose:

  1. 多模块微服务项目构建策略(Maven + CI/CD)
  2. 编写 Jenkinsfile + 通过 Gitee 自动触发构建
  3. 构建 Docker 镜像并推送私有仓库
  4. 使用 docker-compose 编排服务集群启动
  5. 容器内服务配置隔离与统一日志管理实践

1. 项目构建策略:多模块 + Maven + CI/CD

原理理解,微服务架构推荐使用多模块聚合结构来增强模块隔离性和可维护性。CI/CD 则通过流水线自动完成从源码提交到应用部署的全流程。

项目结构推荐,这里没有展示全部,只是为了阐述

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cloud-task/
├── pom.xml                   # 父级聚合模块
├── common/                  # 工具/通用代码模块
├── user-api/                # 接口模块(Feign等)
├── auth-service/            # 认证服务
├── user-service/            # 用户服务
├── task-service/            # 任务服务
├── gateway-service/         # 网关服务
├── starter-task-common/     # 自定义 starter
└── Jenkinsfile              # Jenkins流水线脚本

Maven 构建命令

1
mvn clean package -DskipTests
  • 所有子模块由顶层 pom.xml 管理版本与依赖
  • 服务模块各自生成 jar,用于 Docker 构建

2. Jenkins 自动化构建 + Gitee Webhook 触发

Gitee Webhook 配置

在 Gitee 仓库 → 设置 → Webhook:

  • URL: http://your-jenkins-host/gitee-webhook/
  • 类型:Push 事件
  • Token:与 Jenkins 中 Webhook 插件配置一致

Jenkinsfile 脚本示例(核心阶段说明)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
pipeline {
    agent any
    environment {
        IMAGE_REPO = 'registry.mycompany.com/cloud-task'
    }
    stages {
        stage('Checkout') {
            steps {
                git credentialsId: 'gitee-cred-id', url: 'https://gitee.com/xxx/cloud-task.git'
            }
        }

        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('Docker Build & Push') {
            steps {
                script {
                    def services = ['auth-service', 'user-service', 'task-service', 'gateway-service']
                    for (svc in services) {
                        def tag = "${IMAGE_REPO}/${svc}:latest"
                        sh "docker build -t ${tag} ${svc}"
                        sh "docker push ${tag}"
                    }
                }
            }
        }

        stage('Deploy') {
            steps {
                sh 'docker-compose down && docker-compose up -d'
            }
        }
    }
}

3. Docker 镜像构建与私有仓库管理

每个服务模块都需提供 Dockerfile

示例:auth-service/Dockerfile

1
2
3
4
FROM openjdk:17-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

私有镜像仓库(Docker Registry)

部署简易私有仓库:

1
docker run -d -p 5000:5000 --name registry registry:2

推荐使用 Harbor 作为企业级镜像仓库,支持:

  • 认证、权限控制
  • 镜像版本管理
  • 镜像安全扫描

推送镜像前需登录:

1
docker login registry.mycompany.com

然后按模块推送镜像:

1
docker push registry.mycompany.com/cloud-task/auth-service:latest

4. 使用 Docker Compose 编排服务集群

docker-compose.yml 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3.8'
services:
  auth-service:
    image: registry.mycompany.com/cloud-task/auth-service:latest
    ports:
      - "8001:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    depends_on:
      - nacos

  gateway-service:
    image: registry.mycompany.com/cloud-task/gateway-service:latest
    ports:
      - "8888:8080"

  nacos:
    image: nacos/nacos-server:2.2.0
    ports:
      - "8848:8848"
    environment:
      - MODE=standalone

启动命令

1
docker-compose up -d

或在更新镜像后:

1
docker-compose pull && docker-compose up -d --build

5. 容器内配置隔离与日志统一管理

环境隔离(Nacos + Spring Profiles)

每个服务支持以下方式激活环境配置:

1
2
environment:
  - SPRING_PROFILES_ACTIVE=dev

Nacos 配置结构:

1
2
3
4
auth-service-dev.yaml
auth-service-prod.yaml
user-service-dev.yaml
...

服务在启动时自动拉取对应环境配置。

日志策略

推荐日志输出路径:

1
<file>/logs/${spring.application.name}.log</file>

Compose 中统一挂载日志:

1
2
volumes:
  - ./logs:/logs

日志格式建议为 JSON,方便接入 ELK、Loki 等日志系统。

总结

本篇内容围绕 Spring Cloud 微服务的 DevOps 实践路径,提供从源代码到容器部署、配置隔离、统一日志的完整链路,实现了:

  • 持续集成:Jenkins + Webhook + Maven
  • 容器化构建:Dockerfile + Registry
  • 快速部署:docker-compose 编排服务集群
  • 配置统一:Nacos 配置中心 + Profiles 分环境
  • 日志集中:日志路径统一 + 挂载目录清晰