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

我们都知道,使用Nacos时,如果将Bean使用@RefreshScope标注之后,这个Bean中的配置就会做到实时刷新,本文给大家介绍了如何使用nacos实现自定义文本配置的实时刷新,需要的朋友可以参考下

一、背景
二、编码
1、spring.factories
2、NacosPropertiesLoader
3、NacosConfigHandler
4、NacosLoaderConfiguration
5、测试类
6、扩展

一、背景
我们都知道,使用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文本配置实时刷新的资料请关注vb.net教程C#教程python教程SQL教程access 2010教程https://www.xin3721.com/!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值