最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用nacos實現(xiàn)自定義文本配置的實時刷新

 更新時間:2024年05月08日 08:40:24   作者:花自飄0水自流  
我們都知道,使用Nacos時,如果將Bean使用@RefreshScope標(biāo)注之后,這個Bean中的配置就會做到實時刷新,本文給大家介紹了如何使用nacos實現(xiàn)自定義文本配置的實時刷新,需要的朋友可以參考下

一、背景

我們都知道,使用Nacos時,如果將Bean使用@RefreshScope標(biāo)注之后,這個Bean中的配置就會做到實時刷新。

但是,我們有時候使用nacos配置的并不是key-value形式的配置文件,而是txt形式的或者其他文本格式,就無法使用@RefreshScope進(jìn)行動態(tài)實時刷新了。

所以,我這里自行擴展了一個框架,可以稍微簡化一些開發(fā)人員的工作。

二、編碼

1、spring.factories

在resources創(chuàng)建META-INF目錄,創(chuàng)建spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.test.NacosLoaderConfiguration

2、NacosPropertiesLoader

/**
 * nacos配置加載器
 */
public interface NacosPropertiesLoader {


    /**
     * 獲取dataId
     */
    String getDataId();

    /**
     * 配置刷新的回調(diào)
     */
    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) {
        // 容器環(huán)境準(zhǔn)備完畢了,加載配置
        ConfigService configService = nacosConfigManager.getConfigService();

        try {
            // 加載所有的配置,并設(shè)置監(jiān)聽器
            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創(chuàng)建test、test1命名的dataId,修改配置就會調(diào)用到getConfigData,實時獲取配置了。

6、擴展

因為我們第一次從nacos中獲取配置是基于ApplicationReadyEvent 事件,所以數(shù)據(jù)處理時間會晚于這個時間。

如果說要加載本地文件,本地文件加載時間要早于ApplicationReadyEvent 觸發(fā)的時間,可以考慮使用Bean初始化的生命周期。

以上就是使用nacos實現(xiàn)自定義文本配置的實時刷新的詳細(xì)內(nèi)容,更多關(guān)于nacos文本配置實時刷新的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot文件上傳(本地存儲)回顯前端操作方法

    SpringBoot文件上傳(本地存儲)回顯前端操作方法

    這篇文章主要介紹了SpringBoot文件上傳(本地存儲)回顯前端操作方法的相關(guān)資料,文中講解了文件上傳的基本原理,包括前端調(diào)用后端接口上傳文件,后端返回文件路徑給前端,前端通過路徑訪問圖片,需要的朋友可以參考下
    2024-11-11
  • Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例

    Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例

    這篇文章主要介紹了Java數(shù)組模擬優(yōu)先級隊列數(shù)據(jù)結(jié)構(gòu)的實例,優(yōu)先級隊列中的元素會被設(shè)置優(yōu)先權(quán),本文的例子借助了Java中的TreeSet和TreeMap,需要的朋友可以參考下
    2016-04-04
  • springboot配置mongodb連接池的方法步驟

    springboot配置mongodb連接池的方法步驟

    這篇文章主要介紹了springboot配置mongodb連接池的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java面向?qū)ο筇匦栽斀庵庋b篇

    Java面向?qū)ο筇匦栽斀庵庋b篇

    Java是一種廣泛使用的面向?qū)ο缶幊陶Z言,它支持封裝、繼承和多態(tài)等核心概念,這些都是面向?qū)ο缶幊谭妒降闹匾M成部分,這篇文章主要介紹了Java面向?qū)ο筇匦栽斀庵庋b篇的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • 在java程序中使用protobuf

    在java程序中使用protobuf

    這篇文章主要介紹了protobuf的基本使用和同java結(jié)合的具體案例,感性興趣的小伙伴可以一起來閱讀下文
    2021-08-08
  • 兩張動圖--帶你搞懂TCP的三次握手與四次揮手

    兩張動圖--帶你搞懂TCP的三次握手與四次揮手

    TCP是一種傳輸控制協(xié)議,是面向連接的、可靠的、基于字節(jié)流之間的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡化的計算機網(wǎng)絡(luò)OSI模型中,TCP完成第四層傳輸層所指定的功能
    2021-06-06
  • Java 反射修改類的常量值、靜態(tài)變量值、屬性值實例詳解

    Java 反射修改類的常量值、靜態(tài)變量值、屬性值實例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于Java 反射修改類的常量值、靜態(tài)變量值、屬性值實例詳解內(nèi)容,有興趣的讀者們可以跟著學(xué)習(xí)下。
    2021-01-01
  • Java編程實現(xiàn)判斷網(wǎng)上鄰居文件是否存在的方法

    Java編程實現(xiàn)判斷網(wǎng)上鄰居文件是否存在的方法

    這篇文章主要介紹了Java編程實現(xiàn)判斷網(wǎng)上鄰居文件是否存在的方法,涉及Java針對路徑轉(zhuǎn)換及字符串操作的相關(guān)技巧,需要的朋友可以參考下
    2015-10-10
  • Spring Boot集成redis,key自定義生成方式

    Spring Boot集成redis,key自定義生成方式

    這篇文章主要介紹了Spring Boot集成redis,key自定義生成方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java多線程的常用創(chuàng)建方式總結(jié)

    Java多線程的常用創(chuàng)建方式總結(jié)

    今天給大家?guī)淼氖顷P(guān)于Java多線程的相關(guān)知識,文章圍繞著Java多線程的常用創(chuàng)建方式展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評論

游戏| 定结县| 成安县| 苍山县| 闻喜县| 辽宁省| 恩平市| 吉水县| 安溪县| 台北市| 中西区| 铜鼓县| 容城县| 大邑县| 抚顺市| 仲巴县| 黄浦区| 洱源县| 建阳市| 石棉县| 太仆寺旗| 阜康市| 资源县| 南阳市| 和硕县| 汝南县| 克拉玛依市| 恩施市| 洞头县| 阳春市| 磴口县| 钟山县| 仪征市| 东方市| 田东县| 尖扎县| 九江县| 嘉祥县| 随州市| 上饶市| 永嘉县|