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

news/2024/11/24 11:49:04/

前提

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

配置项

spring:application:name: test-servicemain:allow-bean-definition-overriding: truecloud:nacos:discovery:# 这里私密地址就不透漏了server-addr: xxx:8848config:server-addr: xxx:8848file-extension: yamlshared-configs:- data-id: common.yamlrefresh: 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@ConditionalOnMissingBeanpublic 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配置中心正常读取到。


http://www.ppmy.cn/news/706774.html

相关文章

嵌入式学习总体路线

来源&#xff1a;本文乃同济大学软件学院王院长&#xff08;JacksonWan&#xff09;在同济网论坛发表的帖子《谈谈软件学院高年级同学的学习方向》的第二部分。三部分依次为&#xff1a;一、关于企业计算方向&#xff1b;二、关于嵌入式系统方向&#xff1b;三、关于游戏软件方…

[生而为人-思考] Knowledge Cooking -4th 分享会记录

Knowledge Cooking 这是我发起的一个校内愉快小团体 第四次分享 时间&#xff1a;2017.11.18夜 地点&#xff1a;HQU 主讲人&#xff1a;爽爽 参与人数&#xff1a;15 回顾与热场 过去一周关注过的问题 江歌案 刘鑫 道德的讨伐一个好人在巨大变故和压力下是否可能心理变…

转载大牛对Microsoft的认识

十年MFC经历认识的Microsoft技术 孙辉 自从2005年3月8日下午16时“十年MFC经历认识的Microsoft技术”以帖子的方式发表于CSDN论坛后&#xff0c;引起了许多网友得好评&#xff0c;使得笔者诚惶诚恐&#xff0c;考虑到该贴过长(人气指数为5000)&#xff0c;因此转移到Blog上&am…

关于嵌入式系统的学习路线图

来源&#xff1a;本文乃同济大学软件学院王院长&#xff08;JacksonWan&#xff09;在同济网论坛发表的帖子《谈谈软件学院高年级同学的学习方向》的第二部分。三部分依次为&#xff1a;一、关于企业计算方向&#xff1b;二、关于嵌入式系统方向&#xff1b;三、关于游戏软件方…

关于NOI动态规划

关于动态规划&#xff1a; 动态规划的重要性我不必强调了&#xff0c;从06年开始或多或少年年有的一个科目。现在大家对动态规划的理解已经基本不错了&#xff0c;再强化一下更好。希望大家能够在开学半个月之内彻底解决本文所说的所有内容。因为开学考试的问题&#xff0c;不…

十年MFC经历认识的Microsoft技术

这篇文章是转载的csdn的孙辉写的一篇文章。很有启发意义&#xff0c;希望更多的人可以看到。文章有点长&#xff0c;但个人觉得很值得一看。看完的同时我也想到了一句话&#xff0c;“师夷长技以自强”下面是转载的全文&#xff1a; 标题 十年MFC经历认识的Microsoft技术【原创…

涂子沛:数据爆炸的时代,数据经济有哪些新“蓝海”?

大数据文摘出品 作者&#xff1a;涂子沛 互联网的上半场已经开创了一个新的商业文明。新经济开始崛起&#xff0c;追其本质则是数据经济。澎湃的数据浪潮正在拍打世界经济和政治&#xff0c;一浪推一浪&#xff0c;人类正在把越来越多的日常生活决策交给数据和算法。那么在走到…

“暴力美学1”——DFS深度优先搜索

作为新时代青年&#xff0c;“暴力”二字似乎离我们十分遥远&#xff0c;大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词&#xff0c;但若是我们在后面加上美学二字&#xff0c;或许就是一个值得推敲的词汇了 喜欢篮球并且经常看NBA的朋友应该都…