SpringVortexNotes

外置配置模板和运行配置分离

zjc 于 2026-08-25 发布

代码环境

部署配置里有一类文件适合进 Git,另一类绝对不适合。这次部署目录把两者拆开:application.yaml.template 是可公开的初始模板,服务器上的 application.yaml 是运行配置,只保存在部署机。

忽略规则很直接:

.env
logs/
config/**/application.yaml

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/.gitignore

模板只写环境差异,不复制全量配置。Provider 的模板覆盖 Nacos、MySQL、Redis 和 Zipkin 地址:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.100.128:8848
  datasource:
    url: jdbc:mysql://192.168.100.128:3306/spring_cloud_alibaba?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&sslMode=REQUIRED
  data:
    redis:
      host: 192.168.100.128
      port: 6379

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/config/provider/application.yaml.template

它为什么能覆盖镜像里的配置?因为 Jib 生成的每个镜像都带了这个 JVM 参数:

-Dspring.config.additional-location=optional:file:/app/config/

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/pom.xml

Compose 再把部署机目录挂载到 /app/config

volumes:
  - ./config/provider:/app/config:ro

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/docker-compose.yml

于是 /app/config/application.yaml 参与配置加载,模板里的地址覆盖镜像内置 dev 基线;没有写在模板里的路由、线程池、日志等配置继续使用镜像内置值。.template 后缀不会被 Spring Boot 当成配置文件,它只是给人复制的起点。

这次命名也从早期的 application-vm.yaml 收敛为 application.yaml。这不是简单改名:前者需要 vm Profile 配合,后者是通用外置配置。因此 .env 里只需要:

SPRING_PROFILE=dev

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/deploy/.env.example

注意,外置 application.yaml 不是 dev 专属文件。切换到 prod 时也要检查里面是否还有开发 IP、MailHog 或测试端口,避免“Profile 换了,地址却还被外置文件覆盖”的错觉。

经验总结

模板进 Git,运行配置留部署机;模板只写差异,不搬运全量。这样基础设施迁移只需要改服务器上的 application.yaml 并重启服务,业务默认值变化才进镜像。

评论

评论由 GitHub Discussions 承载,需要 GitHub 账号登录。