nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件
从而不用重启项目

依赖、工具类 这边就不写了

因为项目用的是 Json 类型的配置文件
所以下文 主要是对json文件进行实现
别的文件大同小异
先说扯淡的东西

在这里插入图片描述
在nacos 的配置文件中
dataId 这两种声明 是不一样
虽然打开里面的配置信息都是 json格式
但是 dataId的命名不一样 我理解为 aaa 这种 等于你创建了一个没有后缀的配置文件

下面开始直接上实现代码
第一步 配置文件 :

# nacos 配置文件监听 参数
nacos:
  listener:
    dataId:
      - systemConfig

第二步

package com.init.config.nacos;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * User:Json
 * Date: 2024/3/28
 *  获取 nacos上的文件名
 **/
@Data
@Configuration
@ConfigurationProperties("nacos.listener")
public  class DataIdConfig {
    private List<String> dataId;
}

第三步

package com.init.config.nacos;

import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;
import lombok.extern.slf4j.Slf4j;

/**
 * User:Json
 * Date: 2024/3/28
 **/
@Slf4j
@Configuration
public class NacosInitConfig {
    public static final long DEFAULT_TIMEOUT = 30000;


    private ConfigService configService;

    @Value("${spring.cloud.nacos.discovery.server-addr:}")
    public  String NACOS_SERVER_ADDR;

    @Value("${spring.cloud.nacos.discovery.namespace:}")
    public  String NACOS_NAMESPACE;

    @Resource
    DataIdConfig nacosDataIdConfig;

    @Value("${spring.cloud.nacos.discovery.group}")
    public  String NACOS_ROUTE_GROUP;

    private static final String systemConfig="systemConfig";

    private static final String linkLibrary="linkLibrary";

    public   void nacos(){
        try {
            configService = initConfigService();
            if (configService == null) {
                log.error("初始化Nacos 失败!");
                return;
            }
            List<String> dataIdList = nacosDataIdConfig.getDataId();
            for (String dataId : dataIdList) {

//                if (dataId.endsWith("yml")) {
//                    configService.addListener(dataId, NACOS_ROUTE_GROUP, new YmlCallListener());
//                }else if (dataId.endsWith("json")) {
//                    configService.addListener(dataId, NACOS_ROUTE_GROUP, new YmlCallListener());
//                }else{
//                    configService.addListener(dataId,NACOS_ROUTE_GROUP, new YmlCallListener());
//                }
                switch (dataId){
                    case systemConfig:
                        String configInfo = configService.getConfig(dataId, NACOS_ROUTE_GROUP, DEFAULT_TIMEOUT);
                        //   log.info("获取 systemConfig 配置文件:\r\n{}", configInfo);
                        if(StringUtils.isEmpty(configInfo)){
                            break;
                        }
                        SystemConfigNacos systemConfigNacos = JSON.parseObject(configInfo, SystemConfigNacos.class);
//                        System.out.println(systemConfigNacos.getJwtOrgKey());
                        if(!RedisUtils.hasKey(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA)){
                            RedisUtils.setString(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA,systemConfigNacos,-1);
                        }
                        configService.addListener(dataId,NACOS_ROUTE_GROUP, new JsonCallListener<>(SystemConfigNacos.class));
                        break;
                    case linkLibrary:
                        break;
                }

            }

        } catch (Exception e) {
            log.error("初始化 配置文件发生错误", e);
        }
    }


    private ConfigService initConfigService() {
        try {
            Properties properties = new Properties();
            properties.setProperty("serverAddr", NACOS_SERVER_ADDR);
            properties.setProperty("namespace", NACOS_NAMESPACE);
            return configService = NacosFactory.createConfigService(properties);
        } catch (Exception e) {
            log.error("初始化 Nacos 配置文件发生错误", e);
            return null;
        }
    }
}

第四步:
1.

package com.init.config.nacos;

import com.alibaba.fastjson.JSON;
import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.utils.RedisUtils;
import lombok.AllArgsConstructor;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executor;
/**
 * User:Json
 * Date: 2024/3/28
 **/
@Slf4j
@AllArgsConstructor
public class JsonCallListener<T> implements Listener {

    private Class<T> instanceClass;
    @Override
    public Executor getExecutor() {
        return null;
    }
    @Override
    public void receiveConfigInfo(String configInfo) {
       // log.info("nacos中的Json数据发生变化了:{}", configInfo);
        T systemConfigNacos = JSON.parseObject(configInfo, instanceClass);
        if(RedisUtils.hasKey(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA)){
            RedisUtils.delete(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA);
        }
        RedisUtils.setString(CommonConstant.REDIS_SYSTEM_CONFIG_NACOS_JAVA,systemConfigNacos,-1);
    }
}

package com.init.config.nacos;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executor;
/**
 * User:Json
 * Date: 2024/3/28
 **/
@Slf4j
public class YmlCallListener implements Listener {
    @Override
    public Executor getExecutor() {
        return null;
    }
    @Override
    public void receiveConfigInfo(String configInfo) {
        //log.info("Yml配置内容发生更改:{}", configInfo);
    }
}

最后一步

package com.init.init;

import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;

import com.api.constant.CommonConstant;
import com.api.response.nacos.SystemConfigNacos;
import com.init.config.nacos.DataIdConfig;
import com.init.config.nacos.JsonCallListener;
import com.init.config.nacos.NacosInitConfig;
import com.init.utils.RedisUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;


/**
 * User:Json
 * Date: 2024/3/22
 * Spring Boot应用程序启动后执行某些操作
 * 我用的是这个 启动项  因为 我要redis  
 * 如果你不需要用redis 
 * 用
 * @PostConstruct
    private void init() 
    也行 
 **/
@Component
@Slf4j
@Data
public class NacosInitializeRunner implements CommandLineRunner {

    @Autowired
    private NacosInitConfig nacosInitConfig;

    @Override
    public void run(String... args) {
        nacosInitConfig.nacos();
    }





}

启动项目测试

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

eclipse自动跳到console 解决办法

eclipse启动服务后&#xff0c;想看一些properties信息或者别的&#xff0c;但老是自动跳转到console页面&#xff0c;下面是解决办法&#xff1a; Eclipse中按照如下顺序找到设置菜单的位置&#xff1a; Window — Preferences — Run/Debug — Console 找到以下两项&#xf…

网络:udptcp套接字

目录 协议 网络传输基本流程 网络编程套接字 udp套接字编程 udp相关代码实现 sock函数 bind函数 recvfrom函数 sendto函数 udp执行指令代码 popen函数 udp多线程版收发消息 tcp套接字编程 tcp套接字代码 listen函数 accept函数 read/write函数 connect函数 recv/…

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

React 应用实现监控可观测性最佳实践

前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX&#xff0c;提供了一种声明式的、组件化的编程模型&#xff0c;以便更高效地构建用户界面。无论是简单还是复杂的界面&#xff0c;React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…

报表生成器FastReport .Net用户指南:脚本示例

FastReport的报表生成器&#xff08;无论VCL平台还是.NET平台&#xff09;&#xff0c;跨平台的多语言脚本引擎FastScript&#xff0c;桌面OLAP FastCube&#xff0c;如今都被世界各地的开发者所认可&#xff0c;这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…

[Flutter]环境判断

方式一&#xff08;推荐&#xff09; 常量kReleaseMode&#xff0c;它会根据你的应用是以什么模式编译的来获取值。bool.fromEnvironment会从Dart编译时的环境变量中获取值。对于dart.vm.product这个特定的环境变量&#xff0c;它是由Dart VM设置的&#xff0c;用来标明当前是…

基于PaddleNLP的深度学习对文本自动添加标点符号(二)

前言 基于PaddleNLP的深度学习对文本自动添加标点符号的源码版来了&#xff0c;本篇文章主要讲解如何文本自动添加标点符号的原理和相关训练方法&#xff0c;前一篇文章讲解的是使用paddlepaddle已经训练好的一些模型&#xff0c;在一些简单场景下可以通过这些模型进行预测&…

华为防火墙配置指引超详细(包含安全配置部分)以USG6320为例

华为防火墙USG6320 华为防火墙USG6320是一款高性能、高可靠的下一代防火墙,适用于中小型企业、分支机构等场景。该防火墙支持多种安全功能,可以有效抵御网络攻击,保护网络安全。 目录 华为防火墙USG6320 1. 初始配置 2. 安全策略配置 3. 防火墙功能配置 4. 高可用性配…

Git,GitHub,Gitee,GitLab 四者有什么区别?

目录 1. Git 2. GitHub 3. Gitee 4. GitLab 5. 总结概括 1. Git Git 是一个版本管理工具&#xff0c;常应用于本地代码的管理&#xff0c;下载完毕之后&#xff0c;我们可以使用此工具对本地的资料&#xff0c;代码进行版本管理。 下载链接&#xff1a; Git - Downlo…

前端项目在本地localhost可以调取到拍照或麦克风等设备,但是在局域网内IP+端口号访问项目时访问不到设备

前端项目在本地localhost可以调取到拍照或麦克风等设备&#xff0c;但是在局域网内IP端口号访问项目时访问不到设备&#xff0c;调取navigation.mediaDevices时本科可以获取到mediaDevices列表&#xff0c;局域网内ip端口访问时获取不到mediaDevices。 原因&#xff1a; 存在…

vector类(二)

文章目录 vector类的模拟实现1.默认成员变量和函数2.迭代器函数3.空间容量和长度4.[ ]下标调用5.插入操作&#xff08;尾插&#xff09;6.调整容量大小7.判空操作8.删除操作9.插入操作10.size空间大小11.消除操作 vector类的模拟实现 1.默认成员变量和函数 首先自定义构造vec…

uni-app(自定义题色变量)

1.安装sass npm i sass -D 2.安装sass-loader npm i sass-loader10.1.1 -D 3.创建自定义文件 在根目录static目录下&#xff0c;创建scss->_them.scss&#xff0c;目录名称及文件名称自定义即可。 4.定义颜色变量 在_them.scss中&#xff0c;自定义颜色变量&#xff0…

纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图

系统买的是商业版&#xff0c;使用非常不错有三端uniapp开源代码&#xff0c;自从上次分享uniapp后有些网友让我分享下各个端的uniapp下的各个目录结构说明 我就截图说以下吧&#xff0c;

鸿蒙OS开发实例:【Web网页】

背景 HarmonyOS平台通过Web控件可支持网页加载展示&#xff0c;Web在中是作为专项参考的。 本篇文章将从Android和iOS平台研发角度出发来实践学习API功能 说明 整个示例是以HarmonyOS开发文档网址作为加载目标页面布局增加了三个按钮“后退”&#xff0c;“前进”&#xff…

Redis、Mysql双写情况下,如何保证数据一致

Redis、Mysql双写情况下&#xff0c;如何保证数据一致 场景谈谈数据一致性三个经典的缓存模式Cache-Aside Pattern读流程写流程 Read-Through/Write-Through&#xff08;读写穿透&#xff09;Write behind &#xff08;异步缓存写入&#xff09; 操作缓存的时候&#xff0c;删除…

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…