当前位置:首页 > 问答 > 正文

其实说来大家都懂的那个Spring Boot小窍门,你用过没?

其实就是那个“用配置文件区分不同环境”的小窍门,你肯定听过,但可能没把它用得特别顺手,我最初也觉得这没什么,直到有次在测试环境把本地数据库给清了,才老实把它用起来。

简单说,就是在 application.properties(或者你喜欢的 application.yml) 旁边,放一堆名字带后缀的“兄弟文件”。

  • application-dev.properties (本地开发环境)
  • application-test.properties (测试服务器环境)
  • application-prod.properties (线上生产环境)

application.properties 里,根本不用写具体的数据库密码、Redis地址这些敏感或易变的东西,就写一行:spring.profiles.active=dev,这行意思是,当前激活的是“dev”这个环境配置,跑起来的时候,Spring Boot会把application.propertiesapplication-dev.properties“合并”起来,dev”文件里的设置优先级更高,可以覆盖主文件。

其实说来大家都懂的那个Spring Boot小窍门,你用过没?

好处一下子就来了:你本地开发时,连的是自己电脑的数据库,密码可能是“123456”;而测试环境的配置在application-test.properties里,连的是测试服务器的数据库,密码是公司统一的复杂密码;线上更是另一套。你根本不用每次部署前,战战兢兢地去主配置文件里修改那些容易出错的连接信息,切换环境,通常就改spring.profiles.active那一个值就行,甚至不用改。

怎么启动不同环境呢?有几种土办法但好用的招:

其实说来大家都懂的那个Spring Boot小窍门,你用过没?

  1. 改主配置文件:就像上面说的,把spring.profiles.active的值改成testprod,虽然要改文件,但比改一堆零散的配置项安全多了。
  2. 用命令行参数:在打好的Jar包运行时,用命令 java -jar your-app.jar --spring.profiles.active=test,这是最常用的方式,发布脚本里指定一下就行,完全不用动包里的文件
  3. 设系统环境变量:在服务器上设一个叫SPRING_PROFILES_ACTIVE的系统环境变量,值为prod,Spring Boot会自动识别,这样连启动命令都不用改,特别干净。

我后来发现,这个小窍门还能玩出花。公共配置可以写在主application.properties,比如服务器端口、一些基本的日志格式,而各环境不同的部分,就拆到对应的环境文件里,更细的话,你甚至可以在application-test.properties里再通过spring.profiles.include引入另一个更专门的配置,实现“配置文件继承”。

还有一个我踩过坑的地方:配置文件里的敏感信息,比如密码和密钥,最好不要明文写进去,哪怕是环境配置文件,可以用Jasypt这类工具加密(记得找个靠谱的密钥管理方式),或者直接利用云平台或容器提供的秘密管理服务,但那是后话了,对于大部分内部应用,先把环境隔离开,已经是向前一大步。

这个“用不同配置文件区分环境”的窍门,核心就一点:把会变的东西和不变的东西分开,把属于环境的东西和属于应用本身的东西分开,它没什么高深技术,但认真用起来,能避免很多“本地是好使的”这种尴尬,让部署变得省心不少,很多团队规范里都会要求这么做,算是Spring Boot项目里一个最基础也最重要的“卫生习惯”了。

(参考来源:Spring Boot官方文档关于“Externalized Configuration”和“Profiles”的章节,以及广泛存在的开发者社区实践讨论,如Stack Overflow上关于多环境配置的各类问答。)