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

 更新时间:2024年05月08日 08:40:24   作者:花自飘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文本配置实时刷新的资料请关注脚本之家其它相关文章!

相关文章

  • Java十分钟精通异常处理机制

    Java十分钟精通异常处理机制

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等
    2022-03-03
  • java操作ElasticSearch聚合查询的示例代码

    java操作ElasticSearch聚合查询的示例代码

    这篇文章主要介绍了java操作ElasticSearch聚合查询的示例代码,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-08-08
  • jtds1.1连接sqlserver2000测试示例

    jtds1.1连接sqlserver2000测试示例

    这篇文章主要介绍了jtds1.1连接sqlserver2000测试示例,需要的朋友可以参考下
    2014-02-02
  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例

    这篇文章主要介绍了Java数据结构之链表、栈、队列、树的实现方法,结合实例形式分析了Java数据结构中链表、栈、队列、树的功能、定义及使用方法,需要的朋友可以参考下
    2019-03-03
  • spring boot(一)之入门篇

    spring boot(一)之入门篇

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。接下来通过本文给大家介绍spring boot入门知识,需要的朋友参考下吧
    2017-05-05
  • Java中的接口多继承机制

    Java中的接口多继承机制

    大家好,本篇文章主要讲的是Java中的接口多继承机制,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • mybatis拦截器与分页插件实例教程

    mybatis拦截器与分页插件实例教程

    Mybatis拦截器常常会被用来进行分页处理。所以下面这篇文章主要给大家介绍了关于mybatis拦截器与分页插件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Java实现带有权重随机算法的示例详解

    Java实现带有权重随机算法的示例详解

    这篇文章主要为大家详细介绍了Java如何实现带有权重随机算法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Java的异常体系以及File类构造方法详解

    Java的异常体系以及File类构造方法详解

    这篇文章主要为大家介绍了Java的异常体系以及File类构造方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java将不同的List集合复制到另一个集合常见的方法

    Java将不同的List集合复制到另一个集合常见的方法

    在Java中,有时候我们需要将一个List对象的属性值复制到另一个List对象中,使得两个对象的属性值相同,这篇文章主要介绍了Java将不同的List集合复制到另一个集合常见的方法,需要的朋友可以参考下
    2024-09-09

最新评论