动态读取nacos注册中心配置

动态读取nacos注册中心配置 一、依赖pom文件!--nacos注册中心-- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2021.0.5.0/version /dependency !-- web启动器-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId version2.7.18/version /dependency二、动态读取nacos注册中心配置package com.demo.core.nacos; import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import com.alibaba.nacos.api.exception.NacosException; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; import org.yaml.snakeyaml.Yaml; import javax.annotation.PostConstruct; import java.util.Collections; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor; /** * 动态读取nacos注册中心配置 * Author: wcy * Date: 2026/2/4-10:52 */ Component RefreshScope // 配置变更时自动刷新Bean public class DynamicNacosConfigReader { // 从Gateway配置中读取Nacos连接信息对应上面application.yml的配置 Value(${spring.cloud.nacos.config.server-addr}) private String nacosServerAddr; Value(${spring.cloud.nacos.config.namespace:}) private String nacosNamespace; Value(${spring.cloud.nacos.config.file-extension:}) private String fileExtension; Value(${spring.cloud.nacos.config.group:DEFAULT_GROUP}) private String nacosGroup; Value(${spring.application.name}) private String applicationName; Value(${spring.profiles.active}) private String profilesActive; private MapString, Object configMap; private ConfigService configService; private String nacosDataId; PostConstruct public void init() throws NacosException { // 1. 初始化Nacos连接 initNacosConfigService(); // 2. 读取初始配置 loadNacosConfig(); // 3. 添加配置监听器核心配置变更时自动更新 addNacosConfigListener(); } /** * 初始化Nacos ConfigService */ private void initNacosConfigService() throws NacosException { Properties nacosProps new Properties(); nacosProps.put(serverAddr, nacosServerAddr); if (!nacosNamespace.isEmpty()) { nacosProps.put(namespace, nacosNamespace); } configService NacosFactory.createConfigService(nacosProps); nacosDataId applicationName - profilesActive . fileExtension; } /** * 读取Nacos配置并解析为Map */ private void loadNacosConfig() throws NacosException { String nacosConfigContent configService.getConfig(nacosDataId, nacosGroup, 5000); if (nacosConfigContent null || nacosConfigContent.isEmpty()) { configMap Collections.emptyMap(); System.err.println(警告未从Nacos读取到配置dataId nacosDataId , group nacosGroup); return; } Yaml yaml new Yaml(); configMap yaml.load(nacosConfigContent); } /** * 添加Nacos配置监听器配置变更时自动重新加载 */ private void addNacosConfigListener() throws NacosException { configService.addListener(nacosDataId, nacosGroup, new Listener() { Override public void receiveConfigInfo(String configInfo) { // 配置变更时重新解析配置 try { Yaml yaml new Yaml(); configMap yaml.load(configInfo); System.out.println(Nacos配置已更新dataId nacosDataId); } catch (Exception e) { System.err.println(Nacos配置解析失败 e.getMessage()); e.printStackTrace(); } } Override public Executor getExecutor() { // 使用默认线程池 return null; } }); } // 原有方法不变 public Object getValueByDynamicKey(String dynamicKey) { if (dynamicKey null || dynamicKey.isEmpty() || configMap null || configMap.isEmpty()) { return null; } String[] keySegments dynamicKey.split(\\.); MapString, Object currentLevel configMap; for (int i 0; i keySegments.length - 1; i) { String segment keySegments[i]; Object nextLevel currentLevel.get(segment); if (!(nextLevel instanceof Map)) { return null; } currentLevel (MapString, Object) nextLevel; } return currentLevel.get(keySegments[keySegments.length - 1]); } public String getStringValue(String dynamicKey) { Object value getValueByDynamicKey(dynamicKey); return value ! null ? value.toString() : null; } }三、使用示例nacos配置1、通过Autowired注入到使用类里2、获取nacos配置3、nacos配置变动时DynamicNacosConfigReader会监听到更新系统内初始化的nacos配置信息并打印日志