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

Bootstrap mode cannot read configuration after upgrading to SCA 2023.0.1.3 #3882

Open
herodotus-ecosystem opened this issue Nov 3, 2024 · 10 comments
Labels
area/nacos spring cloud alibaba nacos kind/bug Mark as bug

Comments

@herodotus-ecosystem
Copy link

herodotus-ecosystem commented Nov 3, 2024

升级至 SCA 2023.0.1.3 以后,SCA 无法读取 Nacos 配置中心配置。

好多小伙伴升级至 SCA 2023.0.1.3 以后,也发现该问题,相关连的 ISSUE有:#3876 #3877 #3881#3874

#3874 提供了一种解决方案,但是并不是核心问题所在。

问题原因

分别跟了一下 SCA 2023.0.1.2 和 SCA 2023.0.1.3 的代码,发现核心问题出在 NacosPropertySourceLocator 上。NacosPropertySourceLocator 主要用来处理 Nacos Config 相关配置,以保证 NacosConfigProperites 可以正确的读取到值。

SCA 2023.0.1.2

在 SCA 2023.0.1.2 时, NacosPropertySourceLocator 是在 NacosConfigBootstrapConfiguration 中进行的配置。

NacosConfigBootstrapConfiguration 类,就是大多数微服务使用的 Bootstrap.yml。在服务刚启动的时候,就会读取 Bootstrap.yml 中 Nacos Config 相关的配置。

同时,NacosPropertySourceLocator 中还有两个方法,在启动时候会对 "shared-configs" 和 "extension-configs" 两个属性进行处理,以保证准确读取到 Nacos 配置中心的配置。代码如下:

	/**
	 * load shared configuration.
	 */
	private void loadSharedConfiguration(
			CompositePropertySource compositePropertySource) {
		List<NacosConfigProperties.Config> sharedConfigs = nacosConfigProperties
				.getSharedConfigs();
		if (!CollectionUtils.isEmpty(sharedConfigs)) {
			checkConfiguration(sharedConfigs, "shared-configs");
			loadNacosConfiguration(compositePropertySource, sharedConfigs);
		}
	}

	/**
	 * load extensional configuration.
	 */
	private void loadExtConfiguration(CompositePropertySource compositePropertySource) {
		List<NacosConfigProperties.Config> extConfigs = nacosConfigProperties
				.getExtensionConfigs();
		if (!CollectionUtils.isEmpty(extConfigs)) {
			checkConfiguration(extConfigs, "extension-configs");
			loadNacosConfiguration(compositePropertySource, extConfigs);
		}
	}

SCA 2023.0.1.3

在 SCA 2023.0.1.3 中,大部分代码被移动到了 spring-alibaba-nacos-config 模块中,仅有 NacosPropertySourceLocator 被留在了原模块中。 而且 NacosPropertySourceLocator 被从 NacosConfigBootstrapConfiguration 配置中移出。

这样就导致,在 Bootstrap 模式下,NacosPropertySourceLocator 被配置时机出现了问题。服务刚启动的时候,NacosPropertySourceLocator 根本没有被注入,这就导致 NacosConfigProperties 中主要的属性 "shared-configs" 和 "extension-configs" 是空值,所以就出现无法读取到Nacos 配置中配置的问题。

另一方面,2023.0.1.3 中 NacosPropertySourceLocator 类中的 loadSharedConfigurationloadExtConfiguration 两个方法代码也被删除了。即使启动时注入的时机没有问题, "shared-configs" 和 "extension-configs" 也会是空值

结论

所以很多ISSUE #3876 #3877 #3881 都报出无法读取配置。说明还是按照原有的方式进行的配置,而且都是配置在 bootstrap.yml 中。

官网中的说明如下,而且也没有看到这种方式被取消的说明。

spring.cloud.nacos.config.server-addr=您Nacos服务器的地址
spring.cloud.nacos.config.namespace=您的命名空间ID(如果有)
spring.cloud.nacos.config.group=DEFAULT_GROUP # 默认组名,可以根据需要更改
spring.cloud.nacos.config.file-extension=yaml # 文件扩展名,默认为properties

而 ISSUE #3874 中提到的解决方便,之所以能够读取到配置文件,是因为并没有 Bootstrap.xml 而是采用 config import 的方式。

就是官网中提到的:

# 如果您想导入特定的配置文件,可以这样设置
spring.config.import=nacos:您Nacos配置的dataId[.group]@存在Nacos的配置文件扩展名
@yuluo-yx yuluo-yx added kind/bug Mark as bug area/nacos spring cloud alibaba nacos labels Nov 3, 2024
@yuluo-yx
Copy link
Collaborator

yuluo-yx commented Nov 3, 2024

我来本地验证下看看

@yuluo-yx
Copy link
Collaborator

yuluo-yx commented Nov 4, 2024

已经反馈给开发者了,等等修复

@yuluo-yx yuluo-yx added the waiting-for-feedback Waiting for user feedback label Nov 4, 2024
@herodotus-ecosystem
Copy link
Author

已经反馈给开发者了,等等修复

辛苦啦,感谢感谢

@chickenlj
Copy link
Collaborator

官网中的说明如下,而且也没有看到这种方式被取消的说明。

spring.cloud.nacos.config.server-addr=您Nacos服务器的地址
spring.cloud.nacos.config.namespace=您的命名空间ID(如果有)
spring.cloud.nacos.config.group=DEFAULT_GROUP # 默认组名,可以根据需要更改
spring.cloud.nacos.config.file-extension=yaml # 文件扩展名,默认为properties

最新的 2023 版本中,这种方式已经不支持了,需要切换到 spring.config.import=nacos: xxx.properties 配置模式。

@herodotus-ecosystem
Copy link
Author

官网中的说明如下,而且也没有看到这种方式被取消的说明。

spring.cloud.nacos.config.server-addr=您Nacos服务器的地址
spring.cloud.nacos.config.namespace=您的命名空间ID(如果有)
spring.cloud.nacos.config.group=DEFAULT_GROUP # 默认组名,可以根据需要更改
spring.cloud.nacos.config.file-extension=yaml # 文件扩展名,默认为properties

最新的 2023 版本中,这种方式已经不支持了,需要切换到 spring.config.import=nacos: xxx.properties 配置模式。

使用 SCA 2023.0.1.2 时,在 Bootstrap.yml 里面添加如下配置,一切运行正常。升级至 SCA 2023.0.1.3 才无法读取。

意思是从 SCA 2023.0.1.3 开始,不支持 Bootstrap 方式了?

我的配置如下:

spring:
  config:
    activate:
      on-profile: alibaba
  cloud:
    nacos:
      username: ${ALIBABA_USERNAME:@alibaba.username@}
      password: ${ALIBABA_PASSWORD:@alibaba.password@}
      config:
        namespace: ${ALIBABA_NAMESPACE:@alibaba.namespace@}
        server-addr: ${ALIBABA_CONFIG_SERVER_ADDR:@alibaba.config.server-addr@}
        file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

@herodotus-ecosystem
Copy link
Author

官网中的说明如下,而且也没有看到这种方式被取消的说明。

spring.cloud.nacos.config.server-addr=您Nacos服务器的地址
spring.cloud.nacos.config.namespace=您的命名空间ID(如果有)
spring.cloud.nacos.config.group=DEFAULT_GROUP # 默认组名,可以根据需要更改
spring.cloud.nacos.config.file-extension=yaml # 文件扩展名,默认为properties

最新的 2023 版本中,这种方式已经不支持了,需要切换到 spring.config.import=nacos: xxx.properties 配置模式。

image

@chickenlj
Copy link
Collaborator

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

此部分文档有些过时了,社区这边安排更新到最新版本。新版本主要是以下配置方式不支持了:

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

@herodotus-ecosystem
Copy link
Author

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

此部分文档有些过时了,社区这边安排更新到最新版本。新版本主要是以下配置方式不支持了:

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

好的,感谢您的回复。

再多嘴问一下,那是不是 2023 以后只用在 application.yml 中,按照 import 方式配置即可,就不再需要 bootstrap.xml 了?

@yuluo-yx
Copy link
Collaborator

仍然需要,按照 spring 的默认加载配置 boostarp 的优先级高于 application
nacos config 是应用启动级别配置,有些配置还是要从要 bootstrap 加载,比如 namescpae 等等

@Comven
Copy link

Comven commented Nov 21, 2024

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

此部分文档有些过时了,社区这边安排更新到最新版本。新版本主要是以下配置方式不支持了:

file-extension: yaml
        shared-configs:
          - data-id: herodotus-cloud-environment.yaml
            group: ${PROFILE:@profile@}
          - data-id: herodotus-cloud-platform.yaml
            group: common
          - data-id: herodotus-cloud-database-${DATABASE:@database@}.yaml
            group: common
          - data-id: herodotus-cloud-database.yaml
            group: common
          - data-id: herodotus-cloud-redis.yaml
            group: common
          - data-id: herodotus-cloud-cache.yaml
            group: common
          - data-id: herodotus-cloud-rest.yaml
            group: common
          - data-id: herodotus-cloud-kafka.yaml
            group: common
          # 本地存储模式必须要包含
          # 远程存储:social 配置在 upms
          # 本地存储:social 配置在 uaa
          - data-id: herodotus-cloud-social.yaml
            group: common
          - data-id: ${spring.application.name}.yaml
            group: service

好的,感谢您的回复。

再多嘴问一下,那是不是 2023 以后只用在 application.yml 中,按照 import 方式配置即可,就不再需要 bootstrap.xml 了?

我在bootstarp.properties中配置的

spring.config.import[0]=nacos:${spring.application.name}
spring.config.import[1]=nacos:${spring.application.name}.properties

解决了配置加载不到的问题,如果放在application.properties中会报日志问题,需要启动代码添加

System.setProperty("nacos.logging.default.config.enabled","false");

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 kind/bug Mark as bug
Projects
None yet
Development

No branches or pull requests

4 participants