Nacos扩展:使用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;}@Overridepublic 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() {@Overridepublic void receiveConfigInfo(String configInfo) {nacosPropertiesLoader.getConfigData(configInfo);}});}} catch (NacosException e) {e.printStackTrace();}}@Overridepublic 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的groupIdgroupId = 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 {@Beanpublic NacosConfigHandler nacosConfigHandler(NacosConfigManager nacosConfigManager) {return new NacosConfigHandler(nacosConfigManager);}
}

5、测试类

import org.springframework.stereotype.Component;@Component
public class TestConfigLoader1 implements NacosPropertiesLoader {@Overridepublic String getDataId() {return "test";}@Overridepublic void getConfigData(String configData) {System.out.println("获取了配置1:" + configData);}
}import org.springframework.stereotype.Component;@Component
public class TestConfigLoader2 implements NacosPropertiesLoader {@Overridepublic String getDataId() {return "test1";}@Overridepublic void getConfigData(String configData) {System.out.println("获取了配置2:" + configData);}
}

我们在nacos创建test、test1命名的dataId,修改配置就会调用到getConfigData,实时获取配置了。

6、扩展

因为我们第一次从nacos中获取配置是基于ApplicationReadyEvent 事件,所以数据处理时间会晚于这个时间。

如果说要加载本地文件,本地文件加载时间要早于ApplicationReadyEvent 触发的时间,可以考虑使用Bean初始化的生命周期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数仓分层——ODS、DW、ADS

一、什么是数仓分层 数据仓库分层是一种组织和管理数据仓库的结构化方法&#xff0c;它将数据仓库划分为不同的层次或级别&#xff0c;每个层次具有特定的功能和目的。这种分层方法有助于管理数据仓库中的数据流程、数据处理和数据访问&#xff0c;并提供一种清晰的结构来支持…

java接受入参是xml格式参数demo

java接受入参是xml格式参数demo 依赖demo1. xml入参定义2.接口定义3. postman请求4. 结果 注解说明 依赖 pom依赖 jackson-dataformat-xml <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</…

Python实现txt转Excel(坐标)

import pandas as pddef txt_to_excel(txt_file, excel_file):# 读取 txt 文件with open(txt_file, r) as f:lines f.readlines()# 将每行数据分割成多个单元格data []for line in lines:row line.strip().split( )data.append(row)# 将数据保存到 Excel 文件df pd.DataFra…

EPAI手绘建模APP数值几何变换

(10) 数值几何变换 图 257 数值几何变换工具栏 ① 数值几何变换和交互式几何变换都包括移动、旋转、缩放模型。但是交互式几何变换变换时的变换轴是模型自身中心为变换中心&#xff0c;以X、Y、Z方向的为变换方向&#xff0c;而数值几何变换可以指定变换中心和变换方向。另外&a…

HashSet和TreeSet的区别是什么?

HashSet和TreeSet的区别是什么&#xff1f; HashSet和TreeSet是Java集合框架中两种常用的Set实现&#xff0c;它们各自有独特的特点和用途。以下是它们之间的主要区别&#xff1a; 存储顺序&#xff1a; HashSet&#xff1a;不保证元素的存储顺序&#xff0c;也不保证元素的…

(超简单)SpringBoot中简单用工厂模式来实现

简单讲述业务需求 业务需要根据不同的类型返回不同的用户列表&#xff0c;比如按角色查询用户列表、按机构查询用户列表&#xff0c;用户信息需要从数据库中查询&#xff0c;因为不同的类型查询的逻辑不相同&#xff0c;因此简单用工厂模式来设计一下&#xff1b; 首先新建一个…

花的花语和传说

花的花语和传说往往紧密相连&#xff0c;它们共同构成了花卉文化的丰富内涵。以下是一些常见花卉的花语和传说&#xff1a; 玫瑰&#xff1a; 花语&#xff1a;爱情、美丽、和平、友谊、勇敢、献身。传说&#xff1a;古希腊和古罗马神话中&#xff0c;玫瑰与美神阿芙洛狄忒&…

数据结构-线性表-应用题-2.2-12

1&#xff09;算法的基本设计思想&#xff1a;依次扫描数组的每一个元素&#xff0c;将第一个遇到的整数num保存到c中&#xff0c;count记为1&#xff0c;若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时&#xff0c;将遇到的下一个整数保存到c中&#xff0c;计…

Hadoop快速搭建指南

# Hadoop快速搭建指南## 前言 作为一个处理大数据的工具&#xff0c;Hadoop已经成为许多企业进行数据处理和分析的首选。但如果你第一次接触它&#xff0c;设置和配置可能看起来有点棘手。因此&#xff0c;我将为你提供一个详细的指南&#xff0c;让你可以快速搭建并运行Hadoop…

328_C++_HTTP_HTTP协议传输data数据,为什么要进行base64编解码操作?

http传输data数据的时候&#xff0c;为什么必须进行base64转码后才能有效发送&#xff0c;接收方也必须base64转码后才能有效接受&#xff1f; HTTP  HTTP传输数据时&#xff0c;使用Base64编码并不是必须的&#xff0c;但它确实在某些情况下非常有用。以下是为什么在某些情况…

CSS引用

CSS定义 层叠样式表&#xff1a;&#xff08;Cascading Style Sheets,缩写为css&#xff09;,是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title标签下方添加style双标签&#xff0c;style标签里写入CSS代码 在s…

《构建高效的财务管理系统:设计与实现》

在当今数字化时代&#xff0c;企业财务管理系统的设计与实现至关重要。一个高效的财务管理系统不仅能够提高企业的运营效率&#xff0c;还能够增强企业的竞争力&#xff0c;为企业的发展提供有力支持。本文将探讨财务管理系统的设计与实现&#xff0c;为企业打造一套符合自身需…

电脑(爱好者) :基础知识1 了解你的电脑

读懂cpu 您想了解关于您的电脑的信息吗&#xff1f;CPuz是一款常用的系统信息工具&#xff0c;可以提供关于CPU、主板、内存等硬件信息的详细情况。您可以下载并运行该软件&#xff0c;然后查看您的电脑硬件配置信息。 图片来源于网络 CPU-Z 简介 CPU-Z 是一款功能强大且易于使…

设计模式——工厂模式(Factory)

工厂模式&#xff08;Factory Pattern&#xff09;是一种常用的设计模式&#xff0c;它提供了一种封装创建对象过程的方法。通过工厂方法或工厂类&#xff0c;你可以将对象的创建与使用分离&#xff0c;使得代码更加灵活和可维护。工厂模式主要分为三种类型&#xff1a;简单工厂…

Python-VBA函数之旅-range函数

目录 一、range函数的常见应用场景 二、range函数使用注意事项 三、如何用好range函数&#xff1f; 1、range函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm1010.2…

Android OpenMAX(三)高通OMX组件实现基础

上一节了解了OMX组件实现的基础内容,这一节我们以高通OMX实现为例,简单看看如何实现一个OMX组件。本节代码参考自: omx_core_cmp.cpp qc_omx_component.h omx_vdec.h omx_vdec.cpp Tips:本篇文章旨在简单了解如何实现一个OMX组件,细节的内容不会仔细解读,代码阅读跳跃幅度…

JavaSE——异常(1/2)-认识异常(介绍,异常的体系,了解如何解决异常)、自定义异常(自定义异常的种类,实例演示)

目录 认识异常 介绍 异常的体系 了解如何解决异常 自定义异常 自定义异常的种类 实例演示 认识异常 介绍 什么是异常&#xff1f; 异常就是代表程序出现的问题。 比如&#xff1a; int[] arr {10,20,30}; System.out.println(arr[3]);System.out.println(10 / 0); …

VS调试技巧

1. 什么是bug bug本意是“昆⾍”或“⾍⼦”&#xff0c;现在⼀般是指在电脑系统或程序中&#xff0c;隐藏着的⼀些未被发现的缺陷或 问题&#xff0c;简称程序漏洞。 “Bug” 的创始⼈格蕾丝赫柏&#xff08;Grace Murray Hopper&#xff09;&#xff0c;她是⼀位为美国海军⼯…

【痕迹】QQ+微信朋友圈和聊天记录分析工具1.0.3

【痕迹】QQ微信朋友圈和聊天记录分析工具1.0.3 &#xff08;1&#xff09;纯Python语言实现&#xff0c;使用Flask后端&#xff0c;本地分析&#xff0c;不上传个人数据。 &#xff08;2&#xff09;数据可视化分析QQ、微信聊天记录&#xff0c;提取某一天的聊天记录与大模型…

精准读取CSV/Excel数据 - 灵活指定行列范围的 Python 解决方案

文章目录 源代码项目简介导入相关库__file_exists 装饰器函数的签名和注释主要功能的实现运行演示读取 Excel 文件 源代码 https://github.com/ma0513207162/PyPrecip。pyprecip\reading\read_api.py 路径下。 项目简介 PyPrecip 是一个专注于气候数据处理的 Python 库&#xf…