场景
想要一个发布包部署uat和生产环境,但是uat和生产的数据库以及周边服务提供方的url不一致,同一套配置不能通用。
之前都是在maven打包阶段选取profile,然后把对应环境的配置替换到发布包里。这个包只适用于特定的环境
解决方案
- 发布环境添加环境变量,DEPLOY_ENV=dev(或者uat/prod等等)标记当前环境
- 本地存放多套配置文件,分别放到对应环境目录下
- 配置加载的时候,文件路径加上 System.getenv("DEPLOY_ENV") 获取当前环境信息
- spring的properties配置文件读取增加环境变量的配置,如:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config/#{systemEnvironment['DEPLOY_ENV']?:'dev'}/datasource/jdbc.properties</value>
<value>classpath:config/#{systemEnvironment['DEPLOY_ENV']?:'dev'}/fxt/server.properties</value>
</list>
</property>
</bean>
其中 #{systemEnvironment['DEPLOY_ENV']?:'dev'} 用来获取环境变量DEPLOY_ENV,默认为“dev”
优缺点
缺点很明显,一个包里边需要放所有环境的配置信息,可能会到只所有环境信息泄露的安全问题?多套配置管理繁琐,当然之前通过maven打包的时候放入对应环境的配置也是需要维护多套环境的配置,这点上并没有什么优化
优点就是可以一个包通用所有环境了,通过自动化发布脚本配置对应环境的DEPLOY_ENV环境变量。
后续如果抛弃springMVC的话,可以引入spring cloud的config server组件,方便不同环境的配置问题
网友评论