Tomcat部署多Spring Boot应用如何实现各应用独立加载对应Profile配置
你当前使用的JAVA_OPTS是Tomcat实例级别的全局JVM参数,所有部署在该Tomcat实例下的应用都会继承该配置,因此三个应用的激活Spring Profile完全一致,都会自动加载匹配激活Profile的配置文件,导致application-uat.yml被三个应用同时加载。
另外注意你当前参数里的属性名存在笔误:正确的Spring Profile激活属性是spring.profiles.active(profile为复数形式),错误的属性名会导致配置不生效。
方案1:应用内指定独立激活Profile(无需修改Tomcat配置,改动最小)
在每个应用的内部基础配置文件(src/main/resources/application.yml)中,单独指定该应用专属的激活Profile列表,将应用专属Profile放在最前面即可:
- app1的application.yml配置:
spring: profiles: active: app1,uat,qa,default
- app2的application.yml配置:
spring: profiles: active: app2,uat,qa,default
- app3的application.yml配置:
spring: profiles: active: app3,uat,qa,default
如果需要区分不同环境的应用专属配置,可以将配置文件命名为application-app1-uat.yml这类格式,激活Profile中加入app1-uat即可完全避免配置冲突。
方案2:Tomcat上下文独立配置(无需修改应用代码)
如果不想修改应用代码,可以通过Tomcat的Context配置为每个应用单独设置激活Profile,避免使用全局JVM参数:
- 首先删除
JAVA_OPTS中的-Dspring.profiles.active全局配置 - 在Tomcat的
conf/Catalina/localhost目录下,新建和应用名对应的三个上下文配置文件:app1.xml、app2.xml、app3.xml
以app1.xml为例,配置内容如下:
<Context docBase="/tomcat/webapp/app1"> <Environment name="spring.profiles.active" value="app1,uat,qa,default" type="java.lang.String" override="false"/> </Context>
另外两个应用参考以上配置修改对应的应用名和激活Profile即可。
方案3:独立外部配置目录隔离(适合大量外部配置的场景)
如果需要保留application-uat.yml的命名,不需要修改Profile名,可以为每个应用配置独立的外部配置搜索路径,实现配置文件物理隔离:
同样在上述的Context配置中,新增spring.config.location环境变量,示例如下:
<Context docBase="/tomcat/webapp/app1"> <Environment name="spring.profiles.active" value="uat,qa,default" type="java.lang.String" override="false"/> <Environment name="spring.config.location" value="file:/opt/config/app1/" type="java.lang.String" override="false"/> </Context>
将每个应用对应的application-uat.yml放入各自专属的配置目录(比如/opt/config/app1/)下,三个应用的配置完全隔离不会互相加载。
内容的提问来源于stack exchange,提问作者hazzy

