背景

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

文章概览

多环境 + 多集群部署实战(dev/test/prod):

  1. Nacos 命名空间与环境隔离策略设计
  2. 多环境配置文件管理方案(DataId 命名规范)
  3. Jenkins 中实现多环境部署与参数化控制
  4. 服务之间基于环境自动路由与适配机制
  5. 多环境日志、链路、监控分离与聚合方案

1. 环境部署背景与目标

在公司实际部署中,不可能直接在生产环境调试代码,因此通常会划分如下多个环境:

  • dev:开发调试使用
  • test / staging:用于联调、验收测试
  • prod:正式上线环境

通过环境隔离,实现以下目标:

  • 各环境配置解耦、部署独立
  • 构建流程中自动选择目标环境
  • 日志、链路跟踪、监控指标独立管理

2. Jenkins 参数化部署(选择 dev / test / prod)

2.1 命名空间作用

Nacos 中的命名空间(Namespace)可以隔离配置与服务注册:

  • 每个命名空间相当于一套独立的配置中心
  • 微服务注册也按命名空间隔离,防止跨环境调用

2.2 创建命名空间

进入 Nacos 控制台 → 配置管理 → 命名空间:

  • dev:开发环境
  • test:测试环境
  • prod:生产环境

每个命名空间会生成一个 namespaceId

2.3 配置应用使用指定命名空间

在每个服务的 bootstrap.yml 配置中添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
spring:
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        namespace: ${NACOS_NAMESPACE:dev-namespace-id}
        server-addr: localhost:8848
        group: DEFAULT_GROUP
        file-extension: yaml

通过变量控制,支持外部传入 namespace。

3. 多环境配置文件管理方案(DataId 命名规范)

3.1 命名规则

为了统一管理,建议采用如下命名规范:

<application-name>-<profile>.yaml

例如:

user-service-dev.yaml
user-service-test.yaml
user-service-prod.yaml

3.2 应用配置读取逻辑

bootstrap.yml 中配置 name 即可自动加载:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
spring:
  application:
    name: user-service
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        prefix: ${spring.application.name}
        file-extension: yaml
        name: ${spring.application.name}-${spring.profiles.active}

此时会自动拉取:user-service-dev.yaml

4. Jenkins 中实现多环境部署与参数化控制

4.1 Jenkinsfile 中定义参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
pipeline {
    agent any
    parameters {
        choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署环境')
    }
    environment {
        IMAGE_NAME = "user-service"
        NACOS_NAMESPACE = credentials("${params.ENV}_NAMESPACE_ID")
    }
    stages {
        stage('构建镜像') {
            steps {
                sh "docker build -t ${IMAGE_NAME}:${params.ENV} ."
            }
        }
        stage('部署服务') {
            steps {
                sh "docker-compose -f docker-compose-${params.ENV}.yml up -d"
            }
        }
    }
}

4.2 使用环境变量注入 Nacos 命名空间

application.yml 中添加:

1
2
3
4
5
spring:
  cloud:
    nacos:
      config:
        namespace: ${NACOS_NAMESPACE}

在 Jenkins 中配置环境变量或使用凭据方式传入命名空间 ID。

5. 服务之间基于环境自动路由与适配机制

为了防止服务 A-dev 去调用 B-prod,需保证如下三点:

5.1 服务注册隔离(基于命名空间)

Nacos 会根据 namespace 隔离注册中心,因此 dev 的服务只会调用 dev 的实例。

5.2 Gateway 自动路由配置隔离

gateway-service-dev.yaml 示例:

1
2
3
4
5
6
7
8
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**

确保 Gateway 本身也部署在同一环境下。

5.3 OpenFeign 自动适配

只需使用服务名,无需环境后缀:

1
2
3
4
5
@FeignClient(name = "user-service")
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUser(@PathVariable Long id);
}

环境隔离由服务注册中心(Nacos namespace)控制。

六、多环境日志、链路、监控分离与聚合

6.1 日志隔离

通过 logback-spring.xml 使用 spring.profiles.active 控制不同环境日志输出目录:

1
<property name="LOG_PATH" value="/data/logs/${spring.profiles.active}"/>

每个环境输出到独立文件夹。

6.2 链路追踪(Zipkin)

Zipkin Server 启动多个实例,或带环境标签:

1
2
3
spring:
  zipkin:
    base-url: http://zipkin-${spring.profiles.active}.yutao.org

通过环境变量切换追踪地址。

6.3 Prometheus + Grafana

Prometheus 通过 job label 区分环境:

1
2
3
- job_name: 'user-service-dev'
  static_configs:
    - targets: ['user-service-dev:8081']

Grafana 中按 job 维度区分面板。

七、总结

通过命名空间、配置命名规范、Jenkins 参数控制、环境隔离注册、日志与监控分离等策略,我们实现了 完整的多环境部署体系

  • 保证环境之间配置、注册、调用不干扰
  • 支持 Jenkins 一键部署不同环境
  • 实现日志、链路、监控的环境聚合与可视化

这在公司中是 CI/CD 和运维体系不可或缺的核心能力。