当前位置: 代码网 > it编程>编程语言>Java > 使用nacos实现自定义文本配置的实时刷新

使用nacos实现自定义文本配置的实时刷新

2024年05月29日 Java 我要评论
一、背景我们都知道,使用nacos时,如果将bean使用@refreshscope标注之后,这个bean中的配置就会做到实时刷新。但是,我们有时候使用nacos配置的并不是key-value形式的配置

一、背景

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

(0)

相关文章:

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

发表评论

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