Nacos 注册监听器

news2025/1/19 3:09:42

文章目录

  • 前言
  • 项目文件说明
    • pom依赖
    • bootstrap.yml
    • NacosConfig 配置类
    • 监听器实现类-默认实现
    • 监听器实现类-json配置处理
    • 注册监听器
  • 监听器的效果

前言

本文主要讨论Nacos作为配置中心时,其中配置内容发生更改时,我们的应用程序能够做的事。
一般使用监听器来实现这步操作。

对应的监听器接口是:com.alibaba.nacos.api.config.listener.Listener

接下来看看如何注册一个监听器。

项目文件说明

以下操作都是在 SpringBoot项目中。以下是部分代码,完整代码请访问代码仓库:
https://gitee.com/fengsoshuai/junzi-navigation.git

pom依赖

        <!-- Nacos读取配置-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2021.1</version>
      </dependency>

bootstrap.yml

spring:
  cloud:
    nacos:
      # nacos配置
      config:
        username: nacos
        password: nacos
        server-addr: localhost:80
        namespace: junzi

# nacos 监听的dataId
nacos:
  listener:
    dataId:
      - bussiness-param.json
      - junzi-navigation.yml

NacosConfig 配置类

主要是读取配置内容,生成类 com.alibaba.nacos.api.config.ConfigService的实例。
读取的是 bootstrap.yml 中的连接nacos需要的属性字段。

package org.feng.navigation.config;

import com.alibaba.cloud.nacos.NacosConfigProperties;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * Nacos 配置
 *
 * @version V1.0
 * @author: junzi
 * @date: 2023年02月03日 16时40分
 */
@Slf4j
@Configuration
public class NacosConfig {
    @Resource
    private NacosConfigProperties nacosConfigProperties;

    @Bean
    public ConfigService configService() {
        Properties properties = new Properties();
        properties.setProperty(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
        properties.setProperty(PropertyKeyConst.NAMESPACE, nacosConfigProperties.getNamespace());
        properties.setProperty(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername());
        properties.setProperty(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword());
        ConfigService configServiceInstance;
        try {
            configServiceInstance = NacosFactory.createConfigService(properties);
        } catch (NacosException e) {
            log.error("初始化Nacos配置出错 {}", e.getMessage());
            return null;
        }
        return configServiceInstance;
    }
}

监听器实现类-默认实现

监听到Nacos内容发生更改,只打印日志。

package org.feng.navigation.listener;

import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Executor;

/**
 * Nacos 监听器
 *
 * @version V1.0
 * @author: junzi
 * @date: 2023年02月03日 17时31分
 */
@Slf4j
public class DefaultNacosConfigListener implements Listener {
    @Override
    public Executor getExecutor() {
        return null;
    }

    @Override
    public void receiveConfigInfo(String configInfo) {
        log.info("Nacos配置内容发生更改:{}", configInfo);
    }
}

监听器实现类-json配置处理

在Nacos中增加配置:
在这里插入图片描述
内容是一个json串:
在这里插入图片描述

package org.feng.navigation.listener;

import com.alibaba.nacos.api.config.listener.Listener;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.feng.navigation.common.util.GsonUtil;

import java.util.concurrent.Executor;

/**
 * Nacos 监听json数据
 *
 * @version V1.0
 * @author: junzi
 * @date: 2023年02月03日 18时33分
 */
@Slf4j
@AllArgsConstructor
public class JsonFileNacosConfigListener<T> implements Listener {

    private Class<T> instanceClass;

    @Override
    public Executor getExecutor() {
        return null;
    }

    @Override
    public void receiveConfigInfo(String configInfo) {
        boolean isJson = GsonUtil.validateJson(configInfo);
        if (!isJson) {
            log.error("Nacos配置错误,当前配置不是一个有效的JSON");
            return;
        }

        T instance = GsonUtil.fromJson(configInfo, instanceClass);
        log.info("将Nacos配置的json数据转换为实例:{}", instance);
    }
}


监听JSON配置,可以用来做一些业务实现。我这里暂是只将其序列化成某个类的实例。然后输出日志,别的没做。
真实业务场景,可以定制化一个这样的类,来做你自己的业务。

注册监听器

通过配置datId来注册对应的监听器:

# nacos 监听的dataId
nacos:
  listener:
    dataId:
      - bussiness-param.json
      - junzi-navigation.yml

这里通过dataId的后缀,识别到是哪种配置,然后注册不同的监听器,用以实现不同的处理。
目前监听到 yml 配置,只输出日志,使用默认监听器。
监听到 json 内容,会校验是不是一个有效的json文件,然后将其序列化。

package org.feng.navigation.listener;

import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

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

/**
 * 菌子Nacos配置监听器
 *
 * @version V1.0
 * @author: junzi
 * @date: 2023年02月03日 15时59分
 */
@Data
@Slf4j
@Configuration
public class JunZiNacosConfigListener {

    @Resource
    NacosConfigListenerProperties nacosConfigListenerProperties;
    private static final String GROUP = "junzi";

    @Resource
    private ConfigService configService;

    @PostConstruct
    private void init() throws NacosException {
        List<String> dataIdList = nacosConfigListenerProperties.getDataId();
        log.info("正在监听 group=junzi, nacos.listener.dataId={}", dataIdList);
        for (String dataId : dataIdList) {
            if (dataId.endsWith("yml")) {
                configService.addListener(dataId, GROUP, new DefaultNacosConfigListener());
                continue;
            }
            if (dataId.endsWith("json")) {
                configService.addListener(dataId, GROUP, new JsonFileNacosConfigListener<>(TestParse.class));
            }
        }
    }

    @Data
    @ConfigurationProperties("nacos.listener")
    public static class NacosConfigListenerProperties {
        private List<String> dataId;
    }

    @Data
    public static class TestParse {
        private Long code;
        private String reason;
        private Boolean success;
    }
}

监听器的效果

启动项目后,修改 bussiness-param.json 配置的内容:
在这里插入图片描述
点击发布后,控制台会输出内容:

o.f.n.l.JsonFileNacosConfigListener.receiveConfigInfo(JsonFileNacosConfigListener.java:37) : ![method=default,businessId=default] 将Nacos配置的json数据转换为实例:JunZiNacosConfigListener.TestParse(code=666666, reason=作者真帅, success=false)

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

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

相关文章

DeepLabV3+:Mobilenetv2的改进以及浅层特征和深层特征的融合

目录 Mobilenetv2的改进 浅层特征和深层特征的融合 完整代码 参考资料 Mobilenetv2的改进 在DeeplabV3当中&#xff0c;一般不会5次下采样&#xff0c;可选的有3次下采样和4次下采样。因为要进行五次下采样的话会损失较多的信息。 在这里mobilenetv2会从之前写好的模块中…

第四天链表

24. 两两交换链表中的节点力扣题目链接(opens new window)给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。接下来就是交换相邻两个元素了&#xff0c;此时一定要画…

vite --- 为什么选Vite

目录 什么是Vite 为什么选Vite 现实问题 为什么生产环境仍需打包 Vite 与竞品 什么是Vite Vite&#xff08;法语意为 "快速的"&#xff0c;发音 /vit/&#xff0c;发音同 "veet"&#xff09;是一种新型前端构建工具&#xff0c;能够显著提升前端开发体…

SpringBoot+Vue图书馆管理系统1.0

简介&#xff1a;本项目采用了基本的SpringBootVue设计的图书馆管理系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue图书馆管理系统1.0源码作者LHL项目类型Java EE项目 &#xff…

Zebec 上线投票治理机制,全新流支付生态正在起航

随着加密货币的兴起&#xff0c;其除了成为一种备受关注的投资品外&#xff0c;它也正在成为一种新兴的支付手段。虽然在加密行业发展早期&#xff0c;以BTC、LTC等为代表的以支付为定位老牌加密资产&#xff0c;因支付效率低下、支付成本高、合规等问题而没能实现早期的愿景&a…

Node.js:CommonJS模块化规范

CommonJS 上文提到了 Node 采用的模块化规范是 CommonJS&#xff0c;它主要规定了如何定义模块&#xff0c;如果导出模块和如何导入模块&#xff1a; 定义模块&#xff1a;一个文件就是一个模块导出模块&#xff1a;通过 module.exports 导出模块导入模块&#xff1a;通过 re…

【Linux】第八部分 Linux常用基本命令

【Linux】第八部分 Linux常用基本命令 文章目录【Linux】第八部分 Linux常用基本命令8. Linux常用基本命令8.1 帮助命令8.2 文件目录类命令pwd 显示当前工作目录的绝对路径cd 切换目录ls 列出目录的内容mkdir 创建目录rmdir 删除目录touch 创建文件cp 复制文件或者目录rm 删除文…

Kaggle系列之预测泰坦尼克号人员的幸存与死亡(随机森林模型)

Kaggle是开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台&#xff0c;本节是对于初次接触的伙伴们一个快速了解和参与比赛的例子&#xff0c;快速熟悉这个平台。当然提交预测结果需要注册&#xff0c;这个可能需要科学上网了。我们选择一个预测的入…

【操作系统】4、设备管理

文章目录四、设备管理4.1 I/O设备基本概念4.2 I/O控制方式4.2.1 程序控制方式4.2.2 中断方式4.2.3 DMA控制方式4.2.4 通道控制方式4.3 缓冲技术4.4 假脱机技术四、设备管理 I/O控制方式&#xff1a;程序控制、中断、DMA、通道&#xff0c; 缓冲技术&#xff1b;假脱机技术(SPO…

大龄学长的浙大MBA提面优秀之路分享

作为今年上岸浙大MBA项目的一名中年老学长&#xff0c;想把自己在提面中取得优秀资格的经验做个梳理供大家参考&#xff0c;因为以我的经历来说&#xff0c;我认为浙大MBA提前批面试是非常有价值的&#xff0c;而且在提面过程中也发现了优秀资格其实遍布于各个年龄段和层级&…

2023-02-04 Elasticsearch环境安装

1 JDK-8的安装 查询资料自我安装即可&#xff0c;这里不做展示。 2 Elasticsearch 的安装 Elasticsearch目录结构: 配置文件&#xff1a; #节点名称&#xff0c;集群内要唯一 node.name: node-1001node.master: true node.data: true#ip 地址 network.host: localhost htt…

细讲TCP三次握手四次挥手(一)

计算机网络体系结构 在计算机网络的基本概念中&#xff0c;分层次的体系结构是最基本的。计算机网络体系结构的抽象概念较多&#xff0c;在学习时要多思考。这些概念对后面的学习很有帮助。 网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必…

lsof - list open file

lsof 指令全称 list open file&#xff0c;用官方的话说 Lsof revision 4.91 lists on its standard output file information about files opened by processes -i 平常工作中&#xff0c;用到最多的就是 -i 参数&#xff0c;后面跟端口号&#xff0c;可以查看和这个端口有关…

【嵌入式】MDK使用sct文件将代码段放入RAM中执行

sct文件即分散加载文件&#xff0c;是ARMCC编译器使用的链接脚本文件&#xff0c;等同于GCC编译器的ld链接脚本。MDK IDE使用的是ARMCC。 支持NorFlash中运行代码&#xff08;XIP&#xff09;的MCU例如STM32&#xff0c;一般将所有代码&#xff08;text段&#xff09;都放在FL…

[ 云计算 | AWS ] 亚马逊云科技核心服务之计算服务(Part1:AWS EC2 星巴克为什么横向排队)

(星爸爸网络上的一张图) 注意上图中的5个人&#xff0c;对没错这5个人。一般情况星巴克的人员配置大概是这样的&#xff1a; 1个经理&#xff0c;在办公室两个收银&#xff0c;在收银台&#xff08;本文关注的重点&#xff09;三个人做咖啡 当你去过星巴克买咖啡时&#xff0…

【NS2】tcl与c++互相调用/传参

在NS2&#xff0c;做实验的时候&#xff0c;为了能通过循环配合传值实验&#xff0c;一直找不到tcl传参给c的方法&#xff0c;网上的只po出一部分看不懂&#xff0c;只能通过源码自己研究。最后的解决办法就是&#xff0c;模仿源码的操作&#xff0c;以下通过tcl→ex→sat-irid…

Navicat Monitor 3.0 现已上市 | 欢迎下载试用

Navicat Monitor 3.0 现已上市Navicat Montior 3.0 现已发布&#xff01;一经发布&#xff0c;受到广大专业运维人员的关注与选择! 五大新亮点带给运维团队最为实用且有效地提升监控能力。其具备 PostgreSQL 服务器监控能力、支持优化慢查询、构建自定义指标、性能分析工具优化…

flutter问题

问题一1.报错&#xff1a;Flutter ios/Flutter/Debug.xcconfig: unable to open file (in target "Runner" in project "Runner")2.解决&#xff1a;cd 项目目录flutter cleanflutter create --org solanddriver .运行Xcode问题二1.Cannot run with sound …

Java线程安全问题的原因和解决方案

1.什么是线程安全2.线程不安全的原因 及 解决措施2.1 多线程同时修改同一个变量2.2 修改操作不是原子性加锁操作关键字&#xff1a;synchronized2.3 抢占式执行,随机调度 (根本原因)2.4内存可见性问题volatile 关键字2.5指令重排序1.什么是线程安全 线程安全的确切定义是比较复…

Java——SSM项目(瑞吉外卖)笔记

阅读提醒&#xff1a;最重要的内容都是我手打的字&#xff0c;还有截图上的红字备注部分。 nginx是一个服务器&#xff0c;主要部署一些静态的资源&#xff0c;包括后面做tomcat的集群&#xff0c; 可以接收前端的请求&#xff0c;然后分发给各个tomcat 第一步搭建数据库&…