如何配置Spring Profiles实现Heroku部署的多环境切换
问题解答
1. 顶部无归属配置的作用
Spring Boot中使用---分隔的多文档YAML配置遵循以下规则:
- 未标注
spring.config.activate.on-profile的配置段属于全局公共配置,所有环境激活时都会优先加载这部分配置 - 后续指定了特定profile的配置段,会覆盖公共配置中同名的配置项,没有覆盖的项继续沿用公共配置的值
你之前删除这部分启动报错的原因是:dev/test/prod三个profile的配置里仅配置了datasource地址、用户名密码、jpa的ddl-auto,缺少了公共配置里的以下必填项: - JPA的PostgreSQL方言配置
- SQL打印、格式化配置
- 持久化校验关闭配置
- 分页参数默认配置
这些配置三个环境都通用,之前写在公共段是合理的,只是你原配置的公共段里冗余写了一份datasource配置,属于迭代遗留的无效配置,会被各环境的专属配置完全覆盖。
2. application.yaml最优排布
清理冗余配置后,把所有三个环境通用的配置留在公共段,每个环境差异化的配置放到对应profile段即可:
# 全局公共配置:所有环境通用 spring: profiles: active: dev # 默认激活dev环境 jpa: properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect format_sql: true javax: persistence: validation: mode: none show-sql: true data: web: pageable: default-page-size: 10 max-page-size: 100 --- # prod环境专属配置 spring: config: activate: on-profile: prod datasource: url: jdbc:postgresql://ec2-35-168-65-132.compute-1.amazonaws.com:5432/你的prod库名 username: prod用户名 password: prod密码 jpa: hibernate: ddl-auto: update syftgolf: upload-path: uploads-prod --- # dev环境专属配置 spring: config: activate: on-profile: dev datasource: url: jdbc:postgresql://localhost:5432/testdb username: postgres password: admin jpa: hibernate: ddl-auto: create-drop syftgolf: upload-path: uploads-dev --- # test环境专属配置 spring: config: activate: on-profile: test datasource: url: jdbc:postgresql://localhost:5432/syftgolf username: postgres password: admin jpa: hibernate: ddl-auto: create-drop syftgolf: upload-path: uploads-test
优化点说明:
- 删除了公共段里冗余的datasource配置
- 删除了公共段里重复的jpa层级配置
- 所有通用配置统一收归公共段,避免每个环境重复写相同配置
3. 配置文件直接写active profile是否合理
- 本地开发场景下直接写默认激活dev是合理的,本地启动不需要额外加参数,方便开发
- 生产环境不建议依赖配置文件里的active值,应该通过启动参数/环境变量指定,避免出现本地改了配置忘记还原,把dev配置带到生产的问题
4. 推送到Heroku是否需要手动改active profile
不需要手动修改配置文件,你可以直接在Heroku的环境变量里配置激活prod profile:
- 登录Heroku控制台,进入应用设置页,找到Config Vars配置项,新增配置项
SPRING_PROFILES_ACTIVE,值设为prod - 也可以通过Heroku CLI执行命令:
heroku config:set SPRING_PROFILES_ACTIVE=prod
配置完成后,Heroku启动应用时会优先读取这个环境变量指定的profile,覆盖配置文件里的默认dev值,本地代码不需要做任何修改,直接推送即可。
内容的提问来源于stack exchange,提问作者James Smith
相关产品推荐
相关产品推荐

