springboot项目集成nacos配置中心踩坑

前提

在使用nacos的配置中心功能,发现在application.yml中配置地址后仍然读取不到配置中心地址,配置项和值都是正确的。但就是读不到,现在来分析下

配置项

spring:
  application:
    name: test-service
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
      	# 这里私密地址就不透漏了
        server-addr: xxx:8848
      config:
        server-addr: xxx:8848
        file-extension: yaml
        shared-configs:
          - data-id: common.yaml
            refresh: true

分析

在项目启动时,发现有输出关于nacos配置中心warn级别的日志

NacosPropertySourceBuilder:87 - Ignore the empty nacos configuration and get it based on dataId[test-service] & group[DEFAULT_GROUP]

从这行入手,分析NacosPropertySourceBuilder.loadNacosData

private List<PropertySource<?>> loadNacosData(String dataId, String group,
		String fileExtension) {
	String data = null;
	try {
		data = configService.getConfig(dataId, group, timeout);
		if (StringUtils.isEmpty(data)) {
			log.warn(
					"Ignore the empty nacos configuration and get it based on dataId[{}] & group[{}]",
					dataId, group);
			return Collections.emptyList();
		}
		if (log.isDebugEnabled()) {
			log.debug(String.format(
					"Loading nacos data, dataId: '%s', group: '%s', data: %s", dataId,
					group, data));
		}
		return NacosDataParserHandler.getInstance().parseNacosData(dataId, data,
				fileExtension);
	}
	catch (NacosException e) {
		log.error("get data from Nacos error,dataId:{} ", dataId, e);
	}
	catch (Exception e) {
		log.error("parse data from Nacos error,dataId:{},data:{}", dataId, data, e);
	}
	return Collections.emptyList();
}

可以看到configService.getConfig(dataId, group, timeout);这行是获取数据,并且入参dataIdgroupfileExtension能够想到是配置的参数
在这里插入图片描述
能够看到fileExtension参数值是properties,但我们在配置文件配置了是yaml,这是怎么回事呢,我们分析这个参数的由来
NacosPropertySourceLocator#loadApplicationConfiguration

private void loadApplicationConfiguration(
		CompositePropertySource compositePropertySource, String dataIdPrefix,
		NacosConfigProperties properties, Environment environment) {
	String fileExtension = properties.getFileExtension();
	//省略...

}

fileExtension参数由NacosConfigProperties而来,从这个名字就能想到,这个类就是配置参数
##NacosConfigProperties ##


@ConfigurationProperties(NacosConfigProperties.PREFIX)
public class NacosConfigProperties {

	/**
	 * Prefix of {@link NacosConfigProperties}.
	 */
	public static final String PREFIX = "spring.cloud.nacos.config";

	/**
	 * COMMAS , .
	 */
	public static final String COMMAS = ",";

	/**
	 * SEPARATOR , .
	 */
	public static final String SEPARATOR = "[,]";

	private static final Pattern PATTERN = Pattern.compile("-(\\w)");


	/**
	 * nacos config server address.
	 */
	private String serverAddr;

	/**
	 * the nacos authentication username.
	 */
	private String username;

	/**
	 * the nacos authentication password.
	 */
	private String password;

	/**
	 * encode for nacos config content.
	 */
	private String encode;

	/**
	 * nacos config group, group is config data meta info.
	 */
	private String group = "DEFAULT_GROUP";

	/**
	 * nacos config dataId prefix.
	 */
	private String prefix;

	/**
	 * the suffix of nacos config dataId, also the file extension of config content.
	 */
	private String fileExtension = "properties";

	
	//省略...

}

fileExtension果然就是我们要分析的参数,默认值properties,说明我们指定的yaml没有设置成功,接下面我们分析NacosConfigProperties 配置参数类是怎么进行赋值的即可

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)BootstrapConfiguration
public class NacosConfigBootstrapConfiguration {

	@Bean
	@ConditionalOnMissingBean
	public NacosConfigProperties nacosConfigProperties() {
		return new NacosConfigProperties();
	}
}

根据多次翻看源码的经验,NacosConfigBootstrapConfiguration 这个类肯定是靠springboot自动装配原理加载的
在这里插入图片描述
但要注意NacosConfigBootstrapConfiguration 是由BootstrapConfiguration来指定加载的而不是EnableAutoConfiguration指定来加载的。
重点

  • BootstrapConfiguration指定的进行自动装配的类只能读取bootstrap.properties或者bootstrap.yaml的配置,applicaton.properties和applicaton.yaml是不会读取的
  • EnableAutoConfiguration可以读取bootstrap.properties或者bootstrap.yaml和applicaton.properties和applicaton.yaml

解决办法

知道了问题所在,我们使用bootstrap.yaml配置即可
在这里插入图片描述
fileExtension正常读取到位yaml,数据也从nacos配置中心正常读取到。

Spring Boot 集成 Nacos 配置中心是为了提供一个动态和分布式的应用配置管理解决方案。Nacos 是阿里巴巴开源的一个配置中心,用于存储、管理和分发配置信息。以下是集成 Nacos 配置中心的基本步骤: 1. 添加依赖:在你的 Maven 或 Gradle 项目中添加 Spring Cloud Config 和 Nacos 的依赖。 Maven: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-config</artifactId> </dependency> ``` Gradle: ```groovy implementation 'org.springframework.cloud:spring-cloud-starter-config' implementation 'com.alibaba.cloud:spring-cloud-alibaba-nacos-config' ``` 2. 配置客户端:在 `application.yml` 或 `application.properties` 文件中配置 Nacos 配置中心的信息,包括地址、命名空间(namespace)等。 ```yaml spring: cloud: config: server: nacos: uri: http://localhost:8848 name-spaces: default username: admin password: admin ``` 3. 配置 Nacos 配置源:使用 `@EnableConfigServer` 注解启用配置服务器功能,并且可以配置是否扫描特定目录或包下的配置文件。 4. 使用 ConfigClient 注解:在需要注入配置的地方使用 `@ConfigurationProperties` 注解从 Nacos 中获取配置。 例如: ```java @Configuration @ConfigurationProperties(prefix = "app") public class AppConfig { private String property1; // getters and setters } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值