使用nacos实现自定义文本配置的实时刷新
作者:花自飘0水自流
我们都知道,使用Nacos时,如果将Bean使用@RefreshScope标注之后,这个Bean中的配置就会做到实时刷新,本文给大家介绍了如何使用nacos实现自定义文本配置的实时刷新,需要的朋友可以参考下
一、背景
我们都知道,使用Nacos时,如果将Bean使用@RefreshScope标注之后,这个Bean中的配置就会做到实时刷新。
但是,我们有时候使用nacos配置的并不是key-value形式的配置文件,而是txt形式的或者其他文本格式,就无法使用@RefreshScope进行动态实时刷新了。
所以,我这里自行扩展了一个框架,可以稍微简化一些开发人员的工作。
二、编码
1、spring.factories
在resources创建META-INF目录,创建spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.test.NacosLoaderConfiguration
2、NacosPropertiesLoader
/** * nacos配置加载器 */ public interface NacosPropertiesLoader { /** * 获取dataId */ String getDataId(); /** * 配置刷新的回调 */ void getConfigData(String configData); }
3、NacosConfigHandler
import com.alibaba.cloud.nacos.NacosConfigManager; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.AbstractListener; import com.alibaba.nacos.api.exception.NacosException; import org.springframework.beans.BeansException; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; public class NacosConfigHandler implements ApplicationListener<ApplicationReadyEvent>, ApplicationContextAware { private final NacosConfigManager nacosConfigManager; List<NacosPropertiesLoader> nacosPropertiesLoaderList = new CopyOnWriteArrayList<>(); private String groupId; public NacosConfigHandler(NacosConfigManager nacosConfigManager) { this.nacosConfigManager = nacosConfigManager; } @Override public void onApplicationEvent(ApplicationReadyEvent event) { // 容器环境准备完毕了,加载配置 ConfigService configService = nacosConfigManager.getConfigService(); try { // 加载所有的配置,并设置监听器 for (NacosPropertiesLoader nacosPropertiesLoader : nacosPropertiesLoaderList) { nacosPropertiesLoader.getConfigData( configService.getConfig(nacosPropertiesLoader.getDataId(), groupId, 3000) ); configService.addListener(nacosPropertiesLoader.getDataId(), groupId, new AbstractListener() { @Override public void receiveConfigInfo(String configInfo) { nacosPropertiesLoader.getConfigData(configInfo); } }); } } catch (NacosException e) { e.printStackTrace(); } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map<String, NacosPropertiesLoader> nacosPropertiesLoaderBeans = applicationContext.getBeansOfType(NacosPropertiesLoader.class); if (nacosPropertiesLoaderBeans == null) { return; } for (NacosPropertiesLoader value : nacosPropertiesLoaderBeans.values()) { nacosPropertiesLoaderList.add(value); } // 从配置中读取nacos.group nacos的groupId groupId = applicationContext.getEnvironment().getProperty("nacos.group"); } }
4、NacosLoaderConfiguration
import com.alibaba.cloud.nacos.NacosConfigManager; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; @ConditionalOnBean(NacosConfigManager.class) public class NacosLoaderConfiguration { @Bean public NacosConfigHandler nacosConfigHandler(NacosConfigManager nacosConfigManager) { return new NacosConfigHandler(nacosConfigManager); } }
5、测试类
import org.springframework.stereotype.Component; @Component public class TestConfigLoader1 implements NacosPropertiesLoader { @Override public String getDataId() { return "test"; } @Override public void getConfigData(String configData) { System.out.println("获取了配置1:" + configData); } } import org.springframework.stereotype.Component; @Component public class TestConfigLoader2 implements NacosPropertiesLoader { @Override public String getDataId() { return "test1"; } @Override public void getConfigData(String configData) { System.out.println("获取了配置2:" + configData); } }
我们在nacos创建test、test1命名的dataId,修改配置就会调用到getConfigData,实时获取配置了。
6、扩展
因为我们第一次从nacos中获取配置是基于ApplicationReadyEvent 事件,所以数据处理时间会晚于这个时间。
如果说要加载本地文件,本地文件加载时间要早于ApplicationReadyEvent 触发的时间,可以考虑使用Bean初始化的生命周期。
以上就是使用nacos实现自定义文本配置的实时刷新的详细内容,更多关于nacos文本配置实时刷新的资料请关注脚本之家其它相关文章!