优雅哥 SpringBoot 2.7.2 实战基础 - 06 -多环境配置
在一个项目的开发过程中,通常伴随着多套环境:本地环境 local、开发环境 dev、集成测试环境 test、用户接受测试环境 uat、预生产环境 pre、生产环境 prod。本节的内容有些脱离真实企业开发,因为在真实的企业开发中,不会只开发一个独立的服务,而是多个微服务。发展至今,云原生也越来越普遍。面对多套环境,通常是”一套代码 + 配置中心“的方式,将代码编译打包后,在启动服务时或服务运行过程中,从配置中心读取配置,保证各个环境代码完全一致,仅配置不同。关于配置中心,在后面的系列文章中会详细介绍。
1 配置文件
1.1 配置文件优先级
在第一篇文章中就谈到,Spring Boot 默认核心配置文件名为 application
,支持 application.properties
、application.yml
、application.yaml
。后面两个本质上同一种类型。当三者同时存在时,优先级为:properties
> yaml
> yml
。也就是说,当某个配置项在几者中都存在时,该配置项的值就使用 application.properties
中的值。
此外,配置文件的优先级与目录有关。通常情况下,我们都把核心配置文件放在 src/main/resources
下,本质上是在类路径下(编译后 src/main/resources 下的文件会编译到 target/classes/下面)。如果放到 config
目录下(如: src/main/resources/config/application.yml),config
目录下的核心配置文件优先级会更高。
官方文档中还提到核心配置文件放在项目根路径等情景,在项目中到目前为止都没碰到过,这里就不提了。
最后说明一点,优先级最最高的,是在启动命令行后面的参数。如 server.port,无论在配置文件中配置什么,只要在启动命令后面配置了该参数,就使用该参数的值:
java -jar hero-springboot-demo.jar --server.port=9099
1.2 bootstrap.yml
也许在很多代码里会看到 bootstrap.yml
文件,有些文章说 bootstrap.yml
的优先级最高。这种说法是不完全准确的!
bootstrap.yml
文件在纯粹的 Spring Boot 应用中不会生效,它只有在 Spring Cloud 下才会生效,在 Spring Cloud 中,应用会直接或间接依赖 spring-cloud-context
,此时才会读取 bootstrap.yml
文件和 application.yml
文件,这种情况下 bootstrap.yml
优先级高于其他核心配置文件。
1.3 准备配置文件
为多个环境准备不同的配置文件,这里模拟三个环境:本地环境 local、开发环境 dev、测试环境 test。在 src/main/resources 目录下复制 application.yml 到当前目录,分别重命名为 application-local.yml
、application-dev.yml
、application-test.yml
。端口号 server.port
分别修改为 9099、9091、9092。
src/main/resources/
|- application.yml
|- application-local.yml 9099
|- application-dev.yml 9091
|- application-test.yml 9092
|- ....
上面复制的三个文件命名方式都是:application-{环境名称}
,按照这种方式命名,就不需要分别在每个环境的配置文件中使用 spring.profiles
来设置名字了。application.yml
为主文件。
2 多环境两种配置方式
2.1 spring.profiles.active
这种方式可以通过设置 spring.profiles.active 的值来指定使用的环境配置文件。修改 application.yml
,删除里面的全部内容,添加 profile 配置,如下: