一、背景
我们都知道,使用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文本配置实时刷新的资料请关注代码网其它相关文章!
发表评论