一、多环境配置(Profile)
SpringProfiles提供了一种将不同环境配置隔离的方法,使用 “-” 把配置文件分割成了多个文档块,因此我们可以在不同的文档块中针对不同的环境进行配置,并在第一个文档块内对配置进行切换。
如:
application.yml:默认配置
application-dev.yml:开发环境配置
application-test.yml:测试环境配置
application-prod.yml:生产环境配置
修改 application.yml中的spring.profiles.active
属性,配置多个文档块,并在第一文档快内激活指定环境的Profile。这个属性可以在 application.yml
文件中直接设置,也可以通过命令行参数、环境变量等方式设置:
- 配置文件设置
- 启动命令设置
命令:--spring.profiles.active=指定环境
- 环境变量设置
说明:由于application.yml中用了active: ${PROFILES_ACTIVE:dev},即可以通过设置环境变量PROFILES_ACTIVE来配置
- Maven构建
在Maven构建时,也可以通过设置spring.profiles.active
属性来激活特定的配置文件
二、配置文件读取顺序
配置文件优先级
application在项目中可以有几个不同的存放位置,读取优先级也不一样,优先级(1-优先级最高)和目录如图:
注:
如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
配置参数加载优先级
以下是常用的 Spring Boot 配置形式及其加载顺序(优先级由高到低):
- 命令行参数:通过启动命令传递给 JVM 的参数,如
-Dkey=value
或--key=value
SPRING_APPLICATION_JSON
:通过环境变量或系统属性传递的 JSON 格式配置- 环境变量
application-{profile}.properties
或application-{profile}.yml
:特定 Profile 的配置文件application.properties
或application.yml
:通用配置文件@PropertySource
和@PropertySources
注解指定的配置- 默认属性:通过
SpringApplication.setDefaultProperties
设置的默认属性 - 外部配置文件:通过
spring.config.location
指定的位置加载的配置文件,比如跟jar包同级的application.yml classpath:/
和classpath:/config/
:类路径下的根目录或config
包中的配置文件file:./
和file:./config/
:项目根目录或config
子目录中的配置文件
三、Nacos配置中心和Profile环境独立
在使用Nacos作为配置中心时,SpringCloud应用可以通过Nacos来集中管理和读取配置文件。
结合我们的配置,以下会详细解释如何从Nacos读取配置文件,以及为什么每个Profile在Nacos环境中是独立的。
主配置文件
主配置文件关键配置(application.yml)
spring:
application:
#项目名
name: 服务名这是
# 配置文件
profiles:
active: ${PROFILES_ACTIVE:dev}
config:
import: optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml
# nacos配置
cloud:
nacos:
username: ${NACOS_USER_NAME:}
password: ${NACOS_PASSWORD:}
discovery:
server-addr: ${NACOS_ADDR:http://192.168.1.1:8848}
namespace: ${spring.profiles.active}
# 配置中心
config:
#服务器地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: ${spring.profiles.active}
配置文件读取流程
- 激活Profile:在 application.yml中,通过spring.profiles.active属性指定了默认激活的Profile。
- 从Nacos导入配置:spring.config.import属性指定了从Nacos导入配置的路径。这里的路径是nacos:${spring.application.name}-${spring.profiles.active}.yaml,这意味着它会尝试从Nacos读取名为 hgtc-device-server-${spring.profiles.active}.yaml的配置文件。
例:如果激活的Profile是 dev,则会尝试从Nacos读取hgtc-device-server-dev.yaml。
- Nacos 命名空间:spring.cloud.nacos.discovery.namespace和spring.cloud.nacos.config.namespace都使用了${spring.profiles.active}来设置命名空间。这意味着不同环境的配置会存储在不同的命名空间中,这样每个环境的配置都是独立的,不会相互影响。
例:spring.profiles.active配置的dev,配置文件则会读取application-dev.yml,nacos环境命名空间也会读取dev,则nacos的测试环境