nacos配置文件监听

nacos配置文件监听

Java方式配置文件监听

添加依赖

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.4.1</version>
</dependency>

添加配置监听代码,按照如下示例添加配置监听代码。用户名、密码为自动生成的当前项目在nacos中的用户名、密码,请妥善保管

/*
* Demo for Nacos
* pom.xml
    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>${version}</version>
    </dependency>
*/
package com.alibaba.nacos.example;

import java.util.Properties;
import java.util.concurrent.Executor;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

/**
 * Config service example
 *
 * @author Nacos
 *
 */
public class ConfigExample {

  public static void main(String[] args) throws NacosException, InterruptedException {
    String serverAddr = "localhost";
    String namespace = "namespace";
    String dataId = "hrds-qa-default.yaml";
    String group = "dev";
    String username = "username";
    String password = "password";
    Properties properties = new Properties();
    properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
    properties.put(PropertyKeyConst.NAMESPACE, namespace);
    properties.put(PropertyKeyConst.USERNAME, username);
    properties.put(PropertyKeyConst.PASSWORD, password);
    ConfigService configService = NacosFactory.createConfigService(properties);
    String content = configService.getConfig(dataId, group, 5000);
    System.out.println(content);
    configService.addListener(dataId, group, new Listener() {
      @Override
      public void receiveConfigInfo(String configInfo) {
        System.out.println("recieve:" + configInfo);
      }

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

    boolean isPublishOk = configService.publishConfig(dataId, group, "content");
    System.out.println(isPublishOk);

    Thread.sleep(3000);
    content = configService.getConfig(dataId, group, 5000);
    System.out.println(content);

    boolean isRemoveOk = configService.removeConfig(dataId, group);
    System.out.println(isRemoveOk);
    Thread.sleep(3000);

    content = configService.getConfig(dataId, group, 5000);
    System.out.println(content);
    Thread.sleep(300000);

  }
}

SpringBoot方式配置文件监听

添加依赖

将如下依赖添加到配置文件中

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.7</version>
</dependency>

配置application.properties,添加Nacos server 的地址、命名空间、用户名、密码

nacos.config.server-addr=localhost
nacos.config.namespace=namespace
nacos.config.username=username
nacos.config.password=password

使用 @NacosPropertySource设置监听的配置文件分类及dataId,并开启自动更新

@SpringBootApplication
@NacosPropertySource(groupId = "groupId", dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class, args);
    }
}

通过 Nacos 的 @NacosValue 注解设置属性值

@Controller
@RequestMapping("config")
public class ConfigController {

    @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
    private boolean useLocalCache;

    @RequestMapping(value = "/get", method = GET)
    @ResponseBody
    public boolean get() {
        return useLocalCache;
    }
}

SpringCloud配置文件监听

添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

在 bootstrap.properties 中配置 Nacos server 的地址、文件格式、分组、命名空间、用户名、密码

spring.cloud.nacos.config.server-addr=172.23.16.106:8848
spring.cloud.nacos.config.namespace=hzero-hrds
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.username=username
spring.cloud.nacos.config.password=password

说明: 在 Nacos Spring Cloud 中,dataId 的完整格式如下: ${prefix}-${spring.profiles.active}.${file-extension}

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置

  • spring.profiles.active 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}
### 实现Nacos配置动态监听 #### 使用`ConfigListener`接口实现配置动态监听 为了实现在应用程序运行期间能够响应并处理来自Nacos的配置更新事件,可以采用`ConfigListener`接口来创建自定义监听器。这允许开发者针对特定需求定制化逻辑,在接收到新的配置数据时执行相应操作。 对于希望利用此功能的应用程序而言,应当在启动阶段实例化`NacosConfigListener`对象并通过`addListener`方法向指定的数据ID注册该监听器。每当关联于这个数据ID下的配置发生更改时,系统会自动触发已登记过的监听者中的`receiveConfigInfo`函数[^1]。 下面是一个具体的例子展示怎样基于Spring Boot框架构建这样的机制: ```java import com.alibaba.nacos.api.NacosFactory; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.config.listener.Listener; import java.util.Properties; import java.util.concurrent.Executor; public class DynamicConfigExample { static class MyConfigChangeListener implements Listener { @Override public Executor getExecutor() { return null; // 可选设置线程池,默认null表示使用默认线程池 } @Override public void receiveConfigInfo(String configInfo) { System.out.println("Received new configuration: " + configInfo); // 在这里编写接收新配置后的业务逻辑 } } public static void main(String[] args) throws Exception { Properties properties = new Properties(); properties.put("serverAddr", "localhost"); // 设置Nacos服务地址 ConfigService configService = NacosFactory.createConfigService(properties); String dataId = "example"; String group = "DEFAULT_GROUP"; // 注册监听器到给定dataId和group上 configService.addListener(dataId, group, new MyConfigChangeListener()); Thread.sleep(Long.MAX_VALUE); // 阻塞主线程以便持续监听配置变更 } } ``` 这段代码展示了如何通过Java编程的方式连接至本地部署的Nacos服务器,并为其某个特定配置项(由`dataId`标识)添加一个简单的监听处理器。一旦检测到目标配置发生变化,则立即打印最新的配置内容到控制台输出流中去。 此外,如果是在Spring环境中工作的话,还可以考虑借助`@RefreshScope`注解简化这一过程,使得被标记组件能够在每次请求到来之前重新加载最新版本的服务端参数值;或者是运用更为高级别的抽象——比如`@NacosConfigurationProperties`或`@NacosValue`注解直接映射属性文件里的键值对到类字段之上,从而进一步减少样板代码量[^2]。 不过值得注意的是,虽然上述提到的方法都可以达到目的,但从官方文档来看更倾向于推荐使用`@RefreshScope`这种方式来进行配置管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值