Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
zxuanhong opened this issue Nov 28, 2024 · 17 comments
Labels
area/nacos spring cloud alibaba nacos

Comments

@zxuanhong
Copy link

zxuanhong commented Nov 28, 2024

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
@zxuanhong zxuanhong changed the title 2023.0.1.3使用最新方式spring.config.import无法加载配置,因为缺少 namespace 参数 2023.0.1.3版本 nacos使用最新方式spring.config.import无法加载配置,因为缺少 namespace 参数(而且加了也无效) Nov 28, 2024
@shiyiyue1102
Copy link
Contributor

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

@shiyiyue1102
Copy link
Contributor

shiyiyue1102 commented Nov 28, 2024

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

@zxuanhong
Copy link
Author

zxuanhong commented Nov 28, 2024

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

@zxuanhong
Copy link
Author

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

@shiyiyue1102
Copy link
Contributor

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

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

@zxuanhong
Copy link
Author

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

@shiyiyue1102
Copy link
Contributor

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

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

@shiyiyue1102
Copy link
Contributor

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

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

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

@zxuanhong
Copy link
Author

zxuanhong commented Nov 28, 2024

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

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

@shiyiyue1102
Copy link
Contributor

#3908

@shiyiyue1102
Copy link
Contributor

2023.0.3.2 版本已发布

@zxuanhong
Copy link
Author

非常感谢。

@zxuanhong zxuanhong reopened this Dec 4, 2024
@zxuanhong
Copy link
Author

zxuanhong commented Dec 4, 2024

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

@yuluo-yx yuluo-yx added the area/nacos spring cloud alibaba nacos label Dec 4, 2024
@shiyiyue1102
Copy link
Contributor

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

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

@shiyiyue1102
Copy link
Contributor

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

@shiyiyue1102
Copy link
Contributor

shiyiyue1102 commented Dec 5, 2024

示例:

#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

@zxuanhong
Copy link
Author

zxuanhong commented Dec 5, 2024

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/nacos spring cloud alibaba nacos
Projects
None yet
Development

No branches or pull requests

3 participants