alibaba/spring-cloud-alibaba

2023.0.1.3版本 nacos使用最新方式spring.config.import无法加载配置,因为缺少 namespace 参数(而且加了也无效)

zxuanhong opened this issue · 18 comments

1.Describe the bug
2023.0.1.3使用最新方式spring.config.import无法加载配置。因为缺少 namespace 参数,即使拼接namespace参数也无效,同时在NacosConfigDataResource中的NacosItemConfig也没有namespace字段信息

image image image

2.Log info

[up-realty-process] [           main] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] config[dataId=up-realty-process-yplx.yml, group=DEFAULT_GROUP] is empty
[up-realty-process] [           main] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] config[dataId=up-realty-process-yplx.yml, group=DEFAULT_GROUP] content: 
null

3.最后
把配置文件移动到 public 就正常了。。。这就更奇妙了,nacos 配置文件不支持命名空间了?????

image

通过 参数 spring.cloud.nacos.config.namespace=8d244d3a-xxxx-c9ace440d6f7 指定namespaceId,
如果是public命名空间,不需要设置这个参数

namespace是全局性的一个参数,所以不需要在NacosItemConfig中体现

@shiyiyue1102 加了确实可以了,但是idea 提示配置文件字段信息不存在。是不是还有有点问题。而且是全局参数,那是不是 group 也可以那样配置
image

@shiyiyue1102 同时config.enabled开关无效,我本地开发很可能就不需要去读取配置中间的配置,直接用本地的。现在开关居然无效了

@shiyiyue1102 加了确实可以了,但是idea 提示配置文件字段信息不存在。是不是还有有点问题。而且是全局参数,那是不是 group 也可以那样配置 image

group并不是一个全局参数, 一个spring cloud alibaba应用启动时只能加载一个命名空间下的很多个配置,但这些配置可以有不同的group和dataId,统一在spring.config.import 中指定完整的dataId和group,尽量减少"默认",'潜规则’,比如默认加载{spring.applicaiton.name}.properties这类逻辑,可以减少维护成本和降低程序运行出错或者踩到bug的概率

@shiyiyue1102 以前是可以动态启用是否读取 nacos 配置文件的,那请教下现在怎么处理。以前我们是加了一个环节变量,然后 idea 配置环境变量的(总不能删来删去吧,好麻烦)。因为本地开发很可能就是不需要读取 nacos 配置文件
image

@shiyiyue1102 以前是可以动态启用是否读取 nacos 配置文件的,那请教下现在怎么处理。以前我们是加了一个环节变量,然后 idea 配置环境变量的(总不能删来删去吧,好麻烦)。因为本地开发很可能就是不需要读取 nacos 配置文件 image

这里我们确认下,如果是一个bug,在下一个版本中修复

@shiyiyue1102 以前是可以动态启用是否读取 nacos 配置文件的,那请教下现在怎么处理。以前我们是加了一个环节变量,然后 idea 配置环境变量的(总不能删来删去吧,好麻烦)。因为本地开发很可能就是不需要读取 nacos 配置文件 image

这里我们确认下,如果是一个bug,在下一个版本中修复

这里确实是重构过程中产生的bug,我们在下一个版本中修复

@shiyiyue1102 非常感谢,目前就两个问题(特别2,这会导致真不知道namespace 在哪配置,还以为像 group 那样直接拼接参数了)

  1. spring.cloud.nacos.config.enabled开关不生效
  2. spring.cloud.nacos.config.namespace在spring-configuration-metadata.json文件中没有生成,导致 idea 不提示

2023.0.3.2 版本已发布

非常感谢。

@shiyiyue1102 似乎还是有问题,我把enable 设置为 false.,直接无法启动(设置为 true 正常)。这里应该只是禁止读取配置,并不是让设置为 false 时无法启动
image

@shiyiyue1102 似乎还是有问题,我把enable 设置为 false.,直接无法启动(设置为 true 正常)。这里应该只是禁止读取配置,并不是让设置为 false 时无法启动 image

被Spring的机制给拦截了,通过设置spring.cloud.nacos.config.enabled=false ,SCA就不会去加载nacos配置,但是通过spring.config.import 导入配置时,没有添加optional: 前缀,如果加载不到配置会导致Spring层面报错

你的这个场景,不建议在spring.config.import中添加optinal:参数,可以用另外一个方式解决你的诉求。
https://mp.weixin.qq.com/s/SdMAGMXb3RUf8TlGMYr_oA 可以参考下这篇文章中 ‘属性源的优先级’ 一节,可以在spring.config.import中的最后添加本地的属性文件,将需要覆盖nacos中的属性key单独配置在这个本地文件中,其他的配置仍然可以使用nacos中属性,按需覆盖即可

示例:

#nacos中的属性
spring.config.import[0]=nacos:datasource.properties?group=config&refreshEnabled=true
spring.config.import[1]=nacos:cipher-kms-aes-256-datasource.properties?group=datasource&refreshEnabled=true
spring.config.import[2]=nacos:SampleApp.application.properties?group=default
spring.config.import[3]=nacos:SampleApp.application.yaml?group=default&refreshEnabled=true

#无需配置spring.cloud.nacos.config.enabled=false将nacos中配置整体失效, 在该文件中单独配置需要覆盖远端nacos中的key值即可
spring.config.import[4]=optional:classpath:mylocal.properties

@shiyiyue1102 理论上是可以解决的。让 nacos 去加载配置,只是读取时拦截下就可以了(或者检查到为false,直接返回一个缺损值--不存在)。
你这个方法是没错,目前就是这么解决的。
主要是来回切换太麻烦。以前我们就是使用 enable 一劳永逸的解决的

看情况吧,如果认为不是个 bug 那就直接关闭 issue 即可。但是如果使用 enable 参数导致无法启动,我觉得有必要去掉这个配置。

This issue has been open 30 days with no activity. This will be closed in 7 days.