SpringBoot读取自定义格式的Nacos配置的示例详解
作者: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配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!