如何配置不同的profile
首先,一个java项目,需要有不同的环境配置,打包时,自动使用对应的配置。那么,如何实现呢?
在你的Spring Boot项目的src/main/resources目录下创建或添加一个application.yml文件。这是Spring Boot默认查找配置文件的位置。这个文件,可以添加通用的配置。
然后,还可以在同个目录下,创建如application-test.yml, application-prod.yml等文件,Spring Boot会自动识别这些profile-specific的配置文件。你可以在这些文件中,定义不同环境的参数,例如,数据库地址呀,redis缓存地址呀等。
即,src/main/resources目录下,可以有类似这样几个文件:
application.yml
application-prod.yml
application-test.yml
然后,可以application-test.yml, application-prod.yml, 声明2个变量一样,值不一样的配置。举个例子
application-test.yml:
mysql:
url: https://xx.test.com/mysql
application-prod.yml:
mysql:
url: https://xx.online.com/mysql
在java代码中,就可以动态使用这个url:
@Value("${mysql.url}")
protected String mysqlUrl;
完美。
那么,系统运行时,是如何自动使用对应的profile-specific.yml文件呢?请看下文
Profile自动切换的原理
我们从外网内,来看环境变量,是如何一层层传递到项目里的。
首先,一个java项目,一般就是docker来打包了。所以,从docker开始说起:
- docker打包命令,带上环境参数:
docker build -f assistant-web-api/qke/Dockerfile -t docker-registry.qiyi.virtual/mbd-ai/assistant-web-api-test:$tag . --build-arg dc_env=test
关键词,build-arg ,设置了个参数,dc_env=test
- Docker文件,声明要dc_env,且用于mvn命令
ARG dc_env
...
RUN mvn -T 8 -DdisableRpm=true -pl '!assistant-web-manager' clean package -Dmaven.test.skip=true -P${dc_env}
注意,-P表示设置profile
- pom.xml,配置不同的环境
上一步的mvn命令,加了-P,是在哪里用呢? 当然是在marven的配置文件,也就是pom.xml中。
<profiles>
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
<log.env>test</log.env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.active>prod</profile.active>
<log.env>prod</log.env>
</properties>
</profile>
</profiles>
上面,加了2个环境变量。每个变量,设了properties,即profile.active
这个值,哪里能用呢?
在主application.yml文件中用!
server:
profiles:
active: @profile.active@
定义要用哪个Profile,就根据上一步的profile.active变量来的值了。
自此,从docker打包定义的变量,就传递到了主yml文件中。这个文件,server.profiles.active是哪个值,就会用哪个子yml的配置。例如,如果是test,则会加载application-test.yml的配置!!!
开发环境中,如何切换环境
-
首先,marven先sync一下。sync后,勾选某个环境。
-
接着,本地编译打包,并通过-P,指定环境变量:
-
最后,要运行了,点击下图的右上角,有个Edit Configuration,出来弹窗,在Active Profile中,填入对应的环境变量,例如test
-
最后,就可以点击运行了!