解决命令行参数-D无法覆盖远程配置中心(nacos)问题
背景:今天运维在搭建k8s环境时反馈无法通过-D命令行参数修改参数配置,经排查,发现该配置位于nacos配置中心中。经验证,凡nacos配置中心配置参数均无法通过-D命令行改写。排查过程:认知中springboot项目优先级-D命令行参数是最高的,但此次验证相当打脸。网上查阅相关文档文档一并调试本地源码发现所有配置均存储在MutablePropertySources的propertySourceL
背景:今天运维在搭建k8s环境时反馈无法通过-D命令行参数修改参数配置,经排查,发现该配置位于nacos配置中心中。经验证,凡nacos配置中心配置参数均无法通过-D命令行改写。
排查过程:认知中springboot项目优先级-D命令行参数是最高的,但此次验证相当打脸。网上查阅相关文档
文档一
并调试本地源码发现所有配置均存储在MutablePropertySources的propertySourceList中,配置优先级与对象在list中索引息息相关。
经查,EnableConfigurationProperties对象insertPropertySources方法中
该处判断直接影响远程配置中心文件order。
该配置通过PropertySourceBootstrapProperties对象加载。
此时,问题豁然开朗,我们只需使该方法判断为true,则将修改nacos配置序号,使之采用addLast加载而非addFirst,从而实现命令行参数优先级大于远程配置中心。
修改方案:
在远程配置中心添加:
spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
spring.cloud.config.overrideSystemProperties=false
(该方案直接修改了nacos中所有配置优先级,使之从first变为last,可能存在风险,请慎用!)
另:有一种更简单的解决方案,即需要通过-D命令行修改配置的参数请不要配置在远程配置中心,若已经配置,请删除即可。
更多推荐
所有评论(0)