再简单的应用系统,通常都有两个环境——开发环境和线上环境。大型的企业应用还会有更多的环境,比如测试环境、准线上环境、演示环境等。应用的版本也可能对应了多个环境,比如1。0版本的演示环境、2.0版本的演示环境。这些环境对应了不同的配置要求,通常有:
- 数据库的访问地址不同,数据库用户名和密码也不同,连接池的配置也大不一样,开发环境可能只配置5个连接,而线上环境则多达数百个。
- 日志配置不同,开发和测试环境的日志级别可能是 debu 级别 日志信息 常常包含代码所在行,而线上环境 通常是 INFO 级别 且为了性能考虑不会输出日志所在行。另外,对日志文件要求 不尽相同,线上环境要求日志文件能定时打包压缩,开发环境则往往不会配置日志文件。
- 访问的第 方系统不一样,复杂的应用通常要访问第 方系统,如系统内的Redis缓存,通过REST访问其他Spring Boot应用,这都需要配置不同的IP地址。
- 不同的环境有不同的开关属性, 比如开发系统, 需要关闭短信、微信的通知功能,而演示环境、线上环境则需要打开这些配置
需要在 resources 下创建 application-{profile}.properties 的配置文件,其中 profile 可以是任意名字,比如:
- test, 表示测试环境;
- prod, 表示线上环境;
- pre-prod, 预发布环境;
- demo1.0, 1.0版本演示环境;
这些配置文件可以添加或者覆盖 application.properties 文件的属性。
在环境变量中, spring.profiles.active 指定使用哪个 profile, 比如:
java -jar -Dspring.profiles.active=prod target/ch8.deploy-0.0.1-SNAPSHOT.jar
以上配置启动后,Spring Boot 将读取 resources/application-prod.properties 配置文件,覆盖默认的 application.properties 选项。
如果使用 war 方式部署, 添加系统属性是比较好的方式, 下面以 Tomcat 为例进行说明。
编辑 catalina.sh, 在 sh 文件的开头部分添加如下内容:
JAVA_OPTS="-Dspring.profiles.active=prod"
在多环境部署中, 通常 resources 目录下可能没有目标环境的配置文件, 这主要是为了安全考虑,开发环境下不应该有线上环境的各种配置信息。可以将配置文件放到特定的目录中,并用 spring.config.location 指定配置文件的目录:
>java -jar -Dspring.config.location=file:env/ -Dspring.profiles.active=test target/chl1.deploy-0.0.1-SNAPSHOT.jar
配置文件位于当前目录的env目录下, profile 是 test, 因此读取的是 application-test.properties 配置文件。
注意: 无论用上面哪种多环境配置方法, 总是会覆盖已有的application.properties。
Spring Boot 如何找到配置文件:
Spring Boot 应用默认读取了 application.properties 文件, 实际上, Spring Boot 会自动搜索
classpath:、 classpath:/config、 file:、 file:config/ 这些目录下的配置文件, 优先级由低到高,
file:config/ 的优先级最高。
这是系统属性 spring.config.location 默认的配置。 spring.config.name 表示配置文件的名称,
默认是 application