Nacos作为配置中心注册监听器方法

目录
  • 前言
  • 项目文件说明
    • 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
 */
@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
 */
@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
 */
@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
 */
@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)

到此这篇关于Nacos作为配置中心注册监听器方法的文章就介绍到这了,更多相关Nacos注册监听器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • bootstrap.yml如何读取nacos配置中心的配置文件

    目录 bootstrap.yml读取nacos配置中心配置文件 依赖的版本交由父模块进行版本控制了(另附上依赖代码) 父模块的依赖管理 总结 bootstrap.yml读取nacos配置中心配置文件 最近搞nacos做为springboot的配置中心时,运行项目就一直报错,报错原因是没有加载到配置文件,可是nacos服务的地方又确确实实配置了配置文件,最后在启动的控制台中找到了一些线索,结合百度和源码查看找到了原因所在. 另外提一嘴,如果你导入了spring-cloud-starter-alib

  • Springcloud-nacos实现配置和注册中心的方法

    最近,阿里开源的nacos比较火,可以和springcloud和dubbo共用,对dubbo升级到springcloud非常的方便.这里学习一下他的配置和注册中心.我主要记录一下它的使用方式和踩得坑. nacos简单介绍 Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. Nacos 帮助您更敏捷和容易地构建.交付和管理微服务平台. Nacos 是构建以"服务"为中心的现代应用架构 (例如

  • spring boot项目中如何使用nacos作为配置中心

    目录 使用nacos作为配置中心 1.pom.xml中引入nacos支持包 2.pom.xml中指向nacos 3.配置文件中使用nacos配置项 总结 使用nacos作为配置中心 利用nacos作为配置中心,好处不言而喻,配置外置了,与程序解耦,并且nacos还提供了友好的管理界面. spring boot的卖点之一,就是与之前的spring相比,所谓约定重于配置,配置文件大大简化. 现在使用nacos这种外置配置中心,是更加向前了一步. 具体应用步骤: 1.pom.xml中引入nacos支持

  • Nacos客户端配置中心缓存动态更新实现源码

    目录 客户端配置缓存更新 长轮训任务启动入口 ClientWorker checkConfigInfo LongPollingRunnable.run checkLocalConfig checkListenerMd5 检查服务端配置 checkUpdateDataIds checkUpdateConfigStr 客户端缓存配置长轮训机制总结 服务端配置更新的推送 doPollingConfig addLongPollingClient ClientLongPolling allSubs Lon

  • .NET Core结合Nacos实现配置加解密的方法

    目录 背景 简单原理说明 自定义 ConfigFilter 简单应用 写在最后 背景 当我们把应用的配置都放到配置中心后,很多人会想到这样一个问题,配置里面有敏感的信息要怎么处理呢? 信息既然敏感的话,那么加个密就好了嘛,相信大部分人的第一感觉都是这个,确实这个是最简单也是最合适的方法. 其实很多人都在关注这个问题,好比说,数据库的连接字符串,调用第三方的密钥等等这些信息,都是不太想让很多人知道的. 那么如果我们把配置放在 Nacos 了,我们可以怎么操作呢? 想了想不外乎这么几种: 全部服务端

  • SpringCloud安装Nacos完成配置中心

    目录 1. Nacos介绍 2. docker安装Nacos 2.1 docker-compose.yaml 2.2 启动后访问控制台 3.Springboot集成Nacos 3.1 pom依赖 3.2 yaml配置 3.3 测试配置动态化 3.4 测试日志 eureka注册中心 1. Nacos介绍 官网说明:Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理. 2. docker安装Nacos 基

  • SpringCloud Nacos作为配置中心超详细讲解

    目录 前言 Nacos配置模型 配置介绍 实际演练 前言 在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效. 当应用程序实例比较少的时候还可以维护.如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本. 那么如何能够做到服务不重启就可以修改配置?所有就产生了四个基础诉求: 需要支持动态修改配置 需要动态变更有多实时 变更快了之后如何管控控制变更风险,如灰度.回滚等 敏感配置如何做安全配置

  • Spring Cloud Alibaba Nacos Config配置中心实现

    什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件. Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config 的替代方案. Nacos Config 的存储配置功能为分布式系统中的外部化配置提供服务器端和客户端支持,可以在 Nacos 中集中管理 Spring Cloud 应用的外部属性配置. 引入依赖 在 pom.xml 中添加 spring-cloud

  • Spring Cloud Alibaba使用Nacos作为注册中心和配置中心

    目录 前言 Nacos简介 使用Nacos作为注册中心 安装并运行Nacos 创建应用注册到Nacos 负载均衡功能 使用Nacos作为配置中心 创建nacos-config-client模块 在Nacos中添加配置 Nacos的动态刷新配置 使用到的模块 前言 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案,Nacos 作为其核心组件之一,可以作为注册中心和配置中心使用,本文将对其用法进行详细介绍. Nacos简介 Nacos 致力于帮助您发现.配置和管理微服务

  • SpringBoot使用Nacos配置中心的实现

    本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云本机应用程序和微服务平台. Nacos基本上支持现在所有类型的服务,例如,Dubbo / gRPC服务,Spring Cloud RESTFul服务或Kubernetes服务. 尤其是使用Eureka注册中心的,并且担心Eureka闭源的开发者们,可以将注册中心修改为Nacos,本文主要介绍Naco

  • Nacos配置中心集群原理及源码分析

    目录 Nacos集群工作原理 配置变更同步入口 AsyncNotifyService AsyncTask 目标节点接收请求 NacosDelayTaskExecuteEngine ProcessRunnable processTasks DumpProcessor.process Nacos作为配置中心,必然需要保证服务节点的高可用性,那么Nacos是如何实现集群的呢? 下面这个图,表示Nacos集群的部署图. Nacos集群工作原理 Nacos作为配置中心的集群结构中,是一种无中心化节点的设计

  • Nacos配置中心的配置文件的匹配规则及说明

    目录 Nacos配置中心配置文件的匹配 1.配置微服务配置中心文件 2.常用细节 3.从一个配置中心加载多个配置集 Nacos配置中心配置不成功问题 1.扫描包 2.关于配置nacos 3.为何没有热加载? 4.配置好为何还是没有热加载? 5.另一个坑 6.如何打开项目中的nacos Nacos配置中心配置文件的匹配 详情见nacos的官方文档 1.配置微服务配置中心文件 在 Nacos Spring Cloud 中,数据集(Data Id) 的配置完整格式如下: ${prefix}-${spr

随机推荐