springboot env 多环境配置入门与实战

发布于:2025-09-12 ⋅ 阅读:(24) ⋅ 点赞:(0)

Spring Boot3 Env 项目地址

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

Env 概述

        在 Spring Boot 3 开发中,多环境配置是核心能力之一,其目的是为不同场景(如开发、测试、生产)提供隔离的配置(如数据库连接、端口、日志级别),避免手动修改配置文件的繁琐与风险。Spring Boot 3 遵循 “约定大于配置” 原则,通过标准化的文件命名、灵活的环境激活方式,实现多环境的无缝切换。

Env 核心

        Spring Boot 3 通过配置文件命名规则区分不同环境,核心约定如下:

1. 配置文件类型

        支持两种主流格式(推荐yaml,层级结构更清晰,适合多环境):

  • properties:键值对格式,如application.properties
  • yaml(YAML):层级缩进格式,如application.yaml(推荐)

2. 文件命名规则

所有环境的配置文件需放在项目的src/main/resources目录下,命名遵循:

文件类型 主配置文件(全局共享) 环境专属配置文件(环境隔离)
properties application.properties application-{profile}.properties
yaml application.yaml application-{profile}.yaml

其中,{profile}环境标识,需自定义且语义化,常见取值:

  • dev:开发环境(本地开发用)
  • test:测试环境(测试人员用)
  • prod:生产环境(线上部署用)
  • uat:预发布环境(上线前验证用)

3. 文件结构示例

src/main/resources/
├─ application.yaml          # 主配置(所有环境共享)
├─ application-dev.yaml      # 开发环境配置
├─ application-test.yaml     # 测试环境配置
└─ application-prod.yaml     # 生产环境配置

Env 示例

        多环境配置的核心是 “主配置共享 + 环境配置覆盖”—— 主配置定义全局通用属性(如应用名称),环境配置定义该环境专属属性(如端口、数据库),同名属性会被环境配置覆盖。

1. 代码位置

        请参考项目地址中 springboot-env/springboot-env-config 模块代码。

2. 激活指定环境

        Spring Boot 3 支持多种激活方式,优先级从高到低如下(高优先级覆盖低优先级):

激活方式 具体用法 适用场景
命令行参数(最高) 启动 Jar 时指定:
java -jar demo-app.jar --spring.profiles.active=prod
部署时动态指定环境(推荐)
JVM 参数 启动时通过-D指定:
java -Dspring.profiles.active=test -jar demo-app.jar
测试环境调试
系统环境变量 配置系统变量:
SPRING_PROFILES_ACTIVE=prod(Windows/Linux 通用)
服务器全局环境配置
主配置文件(最低) application.yaml中配置:
spring.profiles.active=dev
本地开发默认环境

Env 进阶

        除了基础的 “一环境一文件”,Spring Boot 3 还支持更灵活的配置组织方式,满足复杂场景需求。

1. 激活多个环境

        可同时激活多个环境,实现 “基础配置 + 功能配置” 的拆分(如日志配置、数据库配置拆分)。规则:后面激活的环境会覆盖前面的同名属性。拆分日志配置:

  1. 创建通用日志配置文件:application-log.yaml
    logging:
      pattern:
        console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    
  2. 激活devlog环境(命令行方式):

    bash

    java -jar demo-app.jar --spring.profiles.active=dev,log
    

    此时加载顺序:application.yaml → application-dev.yaml → application-log.yamllog的配置会覆盖前两者的同名日志属性。

2. Profile 分组

        当环境依赖多个子配置(如prod依赖 “数据库配置 + 缓存配置 + 日志配置”),可通过Profile 分组简化激活操作。分组生产环境:

        在主配置application.yaml中定义分组:

spring:
  profiles:
    # 定义prod分组:激活prod时,自动加载prod、prod-db、prod-redis
    group:
      prod: prod, prod-db, prod-redis
      test: test, test-db  # 测试环境分组

创建子配置文件:

  • application-prod-db.yaml(生产数据库)
  • application-prod-redis.yaml(生产缓存)

激活分组(只需指定分组名prod):

java -jar demo-app.jar --spring.profiles.active=prod

3. 外部配置文件

        生产环境中,配置文件通常不打包进 Jar,而是放在外部目录(方便修改)。Spring Boot 3 会自动扫描以下外部路径(优先级从高到低):

  1. 项目根目录下的config/文件夹
  2. 项目根目录
  3. classpath:/config/(resources/config)
  4. classpath:/(resources,默认)

        外部配置生产环境,将application-prod.yaml放在服务器的/opt/app/config/目录下,启动 Jar 时指定外部配置路径:

java -jar demo-app.jar --spring.profiles.active=prod --spring.config.location=/opt/app/config/

Env 实践

        在分布式系统中,本地多环境配置无法满足 “动态更新配置”“统一管理配置” 的需求,通常会结合配置中心(如 Nacos、Spring Cloud Config)使用:

  1. 配置中心存储:将dev/test/prod环境的配置存储到配置中心,按环境分组。
  2. 应用动态拉取:Spring Boot 应用启动时,通过配置中心的地址和环境标识(如spring.cloud.nacos.config.profile=prod),动态拉取对应环境的配置。
  3. 配置动态更新:配置中心修改配置后,应用无需重启即可实时感知更新(需开启配置刷新机制)。

Env 注意

  1. 配置覆盖优先级:命令行参数 > 系统环境变量 > JVM 参数 > 外部配置文件 > 内部配置文件。
  2. 避免硬编码敏感信息:生产环境的密码、密钥等,不要写在配置文件中,应通过环境变量(如${DB_PASSWORD})或配置中心加密存储获取。
  3. YAML 格式缩进问题:YAML 依赖缩进(2 个空格,不支持 Tab),缩进错误会导致配置加载失败,需注意格式校验。
  4. 多环境激活顺序:同时激活多个环境时(如dev,log),后面的环境会覆盖前面的同名属性,需合理安排顺序。

网站公告

今日签到

点亮在社区的每一天
去签到