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配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nacos框架服务注册实现流程

    Nacos框架服务注册实现流程

    这篇文章主要介绍了SpringCloud服务注册之nacos实现过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • SpringCloud中Gateway实现鉴权的方法

    SpringCloud中Gateway实现鉴权的方法

    本文主要介绍了SpringCloud中Gateway实现鉴权的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • idea插件开发之弹出框的示例代码

    idea插件开发之弹出框的示例代码

    这篇文章主要介绍了idea插件开发之弹出框的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java Collection集合用法详解

    Java Collection集合用法详解

    首先Collection是属于单列集合的顶层接口,表示为一组对象。其类型为引用数据类型,具体创建对象,通过多态的形式进行,本文将给大家详细的介绍,需要的朋友可以参考下
    2021-10-10
  • Java中接口和抽象类的区别详解

    Java中接口和抽象类的区别详解

    这篇文章主要介绍了Java中接口和抽象类的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java计算两个时间段的差的实例详解

    Java计算两个时间段的差的实例详解

    在本篇内容中,我们给大家整理了关于Java计算两个时间段的差的实例内容,并做了详细分析,有需要的朋友们学习下。
    2022-11-11
  • Java使用阻塞队列BlockingQueue实现生产者消费者的方法

    Java使用阻塞队列BlockingQueue实现生产者消费者的方法

    BlockingQueue是一个支持阻塞插入和移除操作的队列,常用于多线程环境下的生产者和消费者场景,文章介绍了阻塞队列BlockingQueue的概念和其在生产者消费者模式中的应用,提供了一个简单的示例,展示了如何使用ArrayBlockingQueue来实现生产者消费者模式
    2024-11-11
  • 跨域解决方案Jsonp原理解析

    跨域解决方案Jsonp原理解析

    这篇文章主要介绍了跨域解决方案Jsonp原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Spring boot redis cache的key的使用方法

    Spring boot redis cache的key的使用方法

    这篇文章主要介绍了Spring boot redis cache的key的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例

    java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例

    这篇文章主要介绍了java实现将字符串中首字母转换成大写,其它全部转换成小写的方法,涉及java字符串遍历、转换、拼接等相关操作技巧,需要的朋友可以参考下
    2019-06-06

最新评论