SpringBoot读取自定义格式的Nacos配置的示例详解

 更新时间:2025年10月14日 09:27:15   作者:java-yi  
在开发的过程中,如果遇到一些特殊情况,例如Java项目读取.net项目的配置问题,由于.net项目的配置文件是非标准格式的自定义文件,需要springboot项目读取自定义格式的nacos配置文件,所以本文给大家介绍了SpringBoot读取自定义格式的Nacos配置的方法

前言

在开发的过程中,如果遇到一些特殊情况,例如Java项目读取.net项目的配置问题,由于.net项目的配置文件是非标准格式(yaml、json等)的自定义文件,需要springboot项目读取自定义格式的nacos配置文件;由于springboot不知道直接读取,故需求使用一些其他方法;以下是springboot读取.net的配置文件的live-common-setting自定义配置文件的案例

自定义Nacos加载Bean

自定义一个bean,该bean实现InitializingBean接口的afterPropertiesSet()

public class NacosConfigLocalCatch implements InitializingBean {
	/**
	 * 实现加载Nacos配置的逻辑
	 */
	@Override
	public void afterPropertiesSet() {
	}
}

自定义一个监听器,用于监听远程nacos变更

Listener listener=new Listener(){
				@Override
				public Executor getExecutor() {
					return threadPoolExecutor;
				}
				@Override
				public void receiveConfigInfo(String configInfo) {
					log.info("{}#receiveConfigInfo receive configInfo. configInfo={}", configInfo);
					compile(configInfo, nacosConfigInfo);
				}
			}

自定义一个Nacos配置载体

package com.vzan.config.securityurl;

import lombok.Data;

/**
 * @author 欧益强
 * @date  2023年11月13日 下午2:14:37
 */
@Data
public class NacosConfigInfo {

    private String serverAddr;
    private String namespace;
    private String group;
    private String dataId;
    private boolean refresh = true;

    public NacosConfigInfo() {
    }
    public NacosConfigInfo(String serverAddr, String namespace, String group, String dataId, boolean refresh) {
        this.serverAddr = serverAddr;
        this.namespace = namespace;
        this.group = group;
        this.dataId = dataId;
        this.refresh = refresh;
    }
    public long getTimeout() {
        return 5000L;
    }

}

获取监听bean完整类

/**
 *
 */
package com.vzan.config.securityurl;

import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import com.google.common.collect.Lists;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author eakom
 * @date 2023年11月13日 下午2:11:46
 */
@Slf4j
public class NacosConfigLocalCatch implements InitializingBean {
	/**
	 * 定义需要获取nacos配置的dataId
	 */
	private List<String> nacosConfigLocalCacheInfoList = Lists.newArrayList("live-common-setting");
	/**
	 * 定义一个map,存在配置到本定
	 */
	private Map<String, String> localCatchMap = new HashMap<>();

	@Resource
	private NacosConfigProperties nacosConfigProperties;

	private static ThreadPoolExecutor threadPoolExecutor;
	/**
	 * 初始化线程
	 */
	static {
		threadPoolExecutor = new ThreadPoolExecutor(2, 4, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100),
				new ThreadPoolExecutor.CallerRunsPolicy());
	}

	/**
	 * 实现加载Nacos配置的逻辑
	 */
	@Override
	public void afterPropertiesSet() {
		nacosConfigLocalCacheInfoList.forEach(k -> {
			NacosConfigInfo nacosConfigInfo = new NacosConfigInfo(nacosConfigProperties.getServerAddr(),
					nacosConfigProperties.getNamespace(), nacosConfigProperties.getGroup(), k, true);

			this.intNacosConfig(nacosConfigInfo);
		});
	}
	
	/**
	 * 获取ConfigService
	 * 
	 * @param nacosConfigInfo NacosConfigInfo
	 * @return configService
	 */
	private ConfigService getConfigService(NacosConfigInfo nacosConfigInfo) {
		String serverAddr = nacosConfigInfo.getServerAddr();
		String nameSpace = nacosConfigInfo.getNamespace();
		Properties properties = new Properties();
		properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
		if (!StringUtils.isEmpty(nameSpace)) {
			properties.put(PropertyKeyConst.NAMESPACE, nameSpace);
		}
		ConfigService configService;
		try {
			configService = NacosFactory.createConfigService(properties);
		} catch (NacosException e) {
			e.printStackTrace();
			throw new RuntimeException("Nacos config 配置 异常");
		}
		return configService;
	}
	
	/**
	 * 初始化Nacos配置
	 * @param nacosConfigInfo
	 */
	private void intNacosConfig(NacosConfigInfo nacosConfigInfo) {
		ConfigService configService = this.getConfigService(nacosConfigInfo);
		try {
			String config = configService.getConfig(nacosConfigInfo.getDataId(), 
				nacosConfigInfo.getGroup(),nacosConfigInfo.getTimeout());
			log.info("{}#afterPropertiesSet init configInfo. configInfo={}", config);
			// 初始化
			compile(config, nacosConfigInfo);
			// 监听
			configService.addListener(nacosConfigInfo.getDataId(), nacosConfigInfo.getGroup(), 
				new Listener(){
				@Override
				public Executor getExecutor() {
					return threadPoolExecutor;
				}
				@Override
				public void receiveConfigInfo(String configInfo) {
					log.info("{}#receiveConfigInfo receive configInfo. configInfo={}", configInfo);
					compile(configInfo, nacosConfigInfo);
				}
				});
		} catch (NacosException e) {
			e.printStackTrace();
			throw new RuntimeException("nacos server 监听 异常! dataId = " + nacosConfigInfo.getDataId());
		}
	}
	/**
	 * 加载nacos配置到本定环境
	 * @param config
	 * @param nacosConfigInfo
	 */
	private void compile(String config, NacosConfigInfo nacosConfigInfo) {
		if ("live-common-setting".equals(nacosConfigInfo.getDataId())) {
			LiveCommonSetting json = JSONUtil.toBean(config, LiveCommonSetting.class);
			if (json == null) {
				log.error("common配置解析失败");
				return;
			}
		}
		localCatchMap.put(nacosConfigInfo.getDataId(), config);
	}

	

	public String get(String dataId) {
		return localCatchMap.get(dataId);
	}
	/**
	*获取配置
	*/
	public LiveCommonSetting getLiveCommonSetting() {
		String config = localCatchMap.get("live-common-setting");
		LiveCommonSetting fromJson = JSONUtil.toBean(config, LiveCommonSetting.class);
		return fromJson;
	}

}

初始化bean

@Configuration(proxyBeanMethods = false)
public class SecurityUrlConfig {
	@Bean
	@ConditionalOnProperty(value = "enabled.securityUrl",matchIfMissing = false)
	public NacosConfigLocalCatch initNacosConfigLocalCatch() {
		NacosConfigLocalCatch config=new NacosConfigLocalCatch();
		return config;
	}
}

代码中读取配置直接getLiveCommonSetting() 这个方法即可。

到此这篇关于SpringBoot读取自定义格式的Nacos配置的示例详解的文章就介绍到这了,更多相关SpringBoot读取Nacos配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java.math.BigDecimal的用法及加减乘除计算

    java.math.BigDecimal的用法及加减乘除计算

    这篇文章主要介绍了java.math.BigDecimal的用法及加减乘除计算,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java上传文件大小受限问题的解决方法

    Java上传文件大小受限问题的解决方法

    这篇文章主要介绍了Java上传文件大小受限怎么解决,本文给大家分享问题分析及解决方案,需要的朋友可以参考下
    2023-09-09
  • Java服务端性能优化之JVM垃圾回收策略详解

    Java服务端性能优化之JVM垃圾回收策略详解

    JVM垃圾回收策略涵盖了基本原理、常见策略(如SerialGC、ParallelGC、CMS、G1GC)以及优化建议,选择合适的策略和调整参数,如堆大小和GC日志,可以提高应用性能和响应速度,持续监控和分析是关键步骤
    2025-03-03
  • elasticsearch kibana简单查询讲解

    elasticsearch kibana简单查询讲解

    今天小编就为大家分享一篇关于elasticsearch kibana简单查询讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • SpringBoot 监控管理模块actuator没有权限的问题解决方法

    SpringBoot 监控管理模块actuator没有权限的问题解决方法

    这篇文章主要介绍了SpringBoot 监控管理模块actuator没有权限的问题解决方法,需要的朋友可以参考下
    2017-12-12
  • springboot引用kettle实现对接oracle数据的示例代码

    springboot引用kettle实现对接oracle数据的示例代码

    这篇文章主要介绍了springboot引用kettle实现对接oracle数据,其实kettle集成到springboot里面没有多少代码,这个功能最主要的还是ktr文件的编写,只要ktr编写好了,放到指定文件夹下,写个定时任务就完事了,需要的朋友可以参考下
    2022-12-12
  • mybatis-plus雪花算法增强idworker的实现

    mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JavaSE异常Exception处理方法以及自定义

    JavaSE异常Exception处理方法以及自定义

    网络异常exception是指在网络通信过程中出现的异常情况,这些异常可能是由于网络连接不稳定、网络故障、服务器故障、网络拥堵等原因导致的,这篇文章主要给大家介绍了关于JavaSE异常Exception处理方法以及自定义的相关资料,需要的朋友可以参考下
    2024-07-07
  • JVM中堆内存和栈内存的区别

    JVM中堆内存和栈内存的区别

    本文主要介绍了JVM中堆内存和栈内存的区别,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Spring Data Redis对象缓存序列化问题解决

    Spring Data Redis对象缓存序列化问题解决

    相信在项目中,你一定是经常使用Redis,在使用时,有没有遇到同我一样,对象缓存序列化问题的呢,本文主要介绍了Spring Data Redis对象缓存序列化问题解决,感兴趣的可以了解一下
    2024-01-01

最新评论