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

 更新时间:2023年02月07日 10:08:37   作者:你家宝宝  
本文主要讨论Nacos作为配置中心时,其中配置内容发生更改时,我们的应用程序能够做的事。一般使用监听器来实现这步操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

前言

本文主要讨论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注册监听器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    解决SpringBoot的@DeleteMapping注解的方法不被调用问题

    这篇文章主要介绍了解决SpringBoot的@DeleteMapping注解的方法不被调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Java使用DOM4j实现读写XML文件的属性和元素

    Java使用DOM4j实现读写XML文件的属性和元素

    这篇文章主要为大家详细介绍了Java使用DOM4j实现读写XML文件的属性和元素,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java Semaphore实现高并发场景下的流量控制

    Java Semaphore实现高并发场景下的流量控制

    在java开发的工作中是否会出现这样的场景,你需要实现一些异步运行的任务,该任务可能存在消耗大量内存的情况,所以需要对任务进行并发控制。本文将介绍通过Semaphore类优雅的实现并发控制,感兴趣的可以了解一下
    2021-12-12
  • Java的关键字与标识符小结

    Java的关键字与标识符小结

    这篇文章主要介绍了Java的关键字与标识符,总结整理了Java各种常见的关键字与标识符功能、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • MyBatis加解密插件的示例详解

    MyBatis加解密插件的示例详解

    本文介绍了使用 MyBatis 插件实现数据库字段加解密的探索过程,实际开发过程中需要注意的细节比较多,整个流程下来我对 MyBatis 的理解也加深了,对MyBatis加解密插件感兴趣的朋友跟随小编一起看看吧
    2022-08-08
  • SpringBoot 统一请求返回的实现

    SpringBoot 统一请求返回的实现

    这篇文章主要介绍了SpringBoot 统一请求返回的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解java如何集成swagger组件

    详解java如何集成swagger组件

    今天给大家带来的是关于Java的相关知识,文章围绕着java如何集成swagger组件展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java中关于字符串的编码方式

    Java中关于字符串的编码方式

    这篇文章主要介绍了Java中关于字符串的编码方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • idea如何自动生成serialVersionUID

    idea如何自动生成serialVersionUID

    这篇文章主要介绍了idea如何自动生成serialVersionUID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 解决SpringBoot整合RocketMQ遇到的坑

    解决SpringBoot整合RocketMQ遇到的坑

    这篇文章主要介绍了解决SpringBoot整合RocketMQ遇到的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论