YAML锚点(复用通用配置段)
痛点:多个数据源配置几乎一样,只有 URL 不同,但你不得不把相同的配置复制好几遍。
解法:用 YAML 的锚点(&)和别名(*)来复用配置块。
1 | # 定义通用配置模板 |
&common-ds 定义了一个锚点,*common-ds 引用它,<< 是合并键,表示把锚点的所有属性”铺开”到当前位置。
以后要改连接池大小?只改一处,两个数据源同时生效。复制粘贴?不存在的。
敏感文件外部化
痛点:本地开发需要一些敏感配置(数据库密码、API Key),但这些配置不能提交到 Git。
解法:用 spring.config.import 导入本地 .env 文件。
1 | # application.yml |
1 | # .env 文件(加入 .gitignore) |
optional: 前缀是重点。有这个前缀,文件不存在也不会报错。生产环境不需要这个文件(通过环境变量注入),本地开发通过 .env 文件提供。两边都能跑
环境变量注入 + 安全默认值
痛点:用环境变量注入配置,但忘了设置环境变量,应用直接启动失败。
解法:用 ${VAR:default} 语法设置默认值。
1 | spring: |
这样设计的好处:开发环境直接启动,不用配任何环境变量;生产环境通过 K8s 的 env 或 ConfigMap 注入,覆盖默认值。
一套配置文件,到处都能跑。
多Profile组合激活
痛点:生产环境要同时激活 prod、security、metrics 三个 Profile,启动命令很长
解法:用 Profile Groups 把多个 Profile 打包成一个
1 | # application.yml |
启动命令从:
1 | java -jar pig-gateway.jar --spring.profiles.active=prod,proddb,security,metrics |
简化为:
1 | java -jar pig-gateway.jar --spring.profiles.active=production |
“生产环境包含哪些配置模块”这个知识,固化在配置文件里,而不是散落在运维脚本中
属性交叉使用
痛点:服务名、版本号在配置文件里出现好几次,改一处漏一处。
解法:用 ${property.name} 交叉引用。
1 | **pt: |
改一处,全局生效。尤其是服务名、日志路径这种到处都要用的值,避免复制粘贴。
单文件管理多环境配置
痛点:application-dev.yml、application-prod.yml、application-test.yml… 文件越来越多,改一个配置要改好几个文件。
解法:用 YAML 的多文档语法,在一个文件里管理所有环境。
1 | application.yml |
条件导入外部配置
痛点:想支持客户自定义配置,但客户可能不提供这个文件,不提供就用默认值。
解法:用 optional: 前缀做条件导入。
1 | spring: |
如果 /etc/pt/custom-config.yml 存在,就加载它,覆盖默认配置;不存在,应用照常启动。
这个特性在做 SaaS 产品时特别有用:基础功能用默认配置,大客户可以通过挂载自定义配置文件来定制行为
结构话配置+类型安全
痛点:用 @Value 注入配置,散落在各个类里,改个配置名要全局搜索;而且没有类型检查,写错了运行时才报错。
解法:用 @ConfigurationProperties 绑定到 Java Record。
1 | pp: |
1 | package com.pig4cloud.pigx.common.config; |
Java Record 天生不可变,线程安全。Duration 类型自动解析 “2s” 这样的时间表达式。IDE 还能自动补全配置项
随机值生成
痛点:测试环境需要生成唯一 ID,或者想给每个实例一个随机端口避免冲突。
解法:用 ${random.*} 表达式
1 | pig: |
支持的格式:
- ${random.uuid} - UUID
- ${random.int} - 随机整数
- ${random.int(max)} - 0 到 max
- ${random.int[min,max]} - min 到 max
- ${random.long} - 随机长整数
有个坑:每次读取这个属性都会生成新值。如果你在两个 Bean 里注入同一个随机属性,它们会拿到不同的值。别问我怎么知道的。解决办法是把随机值绑定到一个 @ConfigurationProperties Bean,其他地方注入这个 Bean
云平台自动感知
痛点:应用部署在 K8s 上时需要一些特殊配置(如优雅停机时间),但本地开发不需要。
解法:用 on-cloud-platform 条件激活。
1 | # 默认配置 |
Spring Boot 会自动检测运行环境(通过环境变量、文件系统特征等)。同一个 JAR 包,在本地跑用本地配置,部署到 K8s 自动切换成云上配置。
不用在启动脚本里传一堆参数了
注: 参考文章(做大佬的搬运工,学习积累)