Nacos配置中心自定义监听器demo

源码地址:廖定贵/nacos-demo

1、pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.nacos</groupId>
  <artifactId>nacos-demo</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>nacos-demo</name>
  <url>http://maven.apache.org</url>


  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.13</version>
    <relativePath/>
  </parent>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2021.0.4.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>io.minio</groupId>
      <artifactId>minio</artifactId>
      <!--      <version>8.5.6</version>-->
      <version>7.1.0</version>
    </dependency>

    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>4.8.1</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.22</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
<!--      <version>2.7.12</version>-->
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
<!--      <version>2.7.12</version>-->
    </dependency>


    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
<!--    <dependency>-->
<!--      <groupId>com.alibaba.cloud</groupId>-->
<!--      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!--      <version>2.2.2.RELEASE</version>-->
<!--    </dependency>-->
    <!--开启Spring Cloud 应用程序启动时加载bootstrap配置文件-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
      <version>3.1.4</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-yaml</artifactId>
      <version>2.13.5</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-properties</artifactId>
      <version>2.13.5</version>
    </dependency>

  </dependencies>
</project>

2、bootstrap.yml


spring:
  application:
    name: liao    #为服务名
  cloud:
    nacos:
      username: nacos
      password: nacos
#      discovery:
#        namespace: monitor
#        group: monitor
#        server-addr: localhost:8848
      config:
        import-check:
          enabled: false
        file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
        prefix: my-nacos.yml #文件名,如果没有配置则默认为 ${spring.appliction.name}
#        namespace: monitor
        auto-refresh: true
        enable-remote-sync-config: true #启用远程同步配置,
        timeout: 3000
        group: DEFAULT_GROUP  #配置组
        refresh-enabled: true
        server-addr: localhost:8848
server:
  port: 8080

3.监听器代码 

此处用到的ConfigService由SpringCloudAlibaba框架创建,也可以自己创建一个ConfigService配置

package com.nacos.nacos;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.client.config.listener.impl.PropertiesListener;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.javaprop.JavaPropsMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

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


@Component
public class MyNacosConfigListener implements ApplicationRunner {

    @Resource
    private NacosConfigManager nacosConfigManager;
    @Value("${spring.cloud.nacos.config.group}")
    private String groupId;

    public static final String DATA_ID = "my-nacos.yml";

    @Value("${nacos.test}")
    private String current;


    private static YAMLMapper yamlMapper = new YAMLMapper();
//
    private static JavaPropsMapper javaPropsMapper = new JavaPropsMapper();



    @Override
    public void run(ApplicationArguments args) throws Exception {
        listenerNacosConfig();
    }

    /**
     * 监听数据源变化
     *
     * @throws Exception 异常
     */
    private void listenerNacosConfig() throws Exception {
        ConfigService configService = nacosConfigManager.getConfigService();
        configService.addListener(DATA_ID, groupId, new PropertiesListener() {

            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("改变前"+current);
                try {
                    JsonNode jsonNode = yamlMapper.readTree(configInfo);
                    Properties properties = javaPropsMapper.writeValueAsProperties(jsonNode);
                    String property = properties.getProperty("nacos.test");
                    current = property;
                    System.out.println("改变后"+current);
                } catch (JsonProcessingException e) {
                    throw new RuntimeException(e);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            @Override
            public void innerReceive(Properties properties) {
                System.out.println(properties);
            }
        });
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值