当前位置: 代码网 > it编程>编程语言>Java > SpringBoot读取自定义格式的Nacos配置的示例详解

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

2025年10月14日 Java 我要评论
前言在开发的过程中,如果遇到一些特殊情况,例如java项目读取.net项目的配置问题,由于.net项目的配置文件是非标准格式(yaml、json等)的自定义文件,需要springboot项目读取自定义

前言

在开发的过程中,如果遇到一些特殊情况,例如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配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com