Bootstrap

如何实现Nacos配置文件动态刷新【四种方式】


我们在使用Nacos作为配置中心,用于管理应用的属性配置。当我们在Nacos上修改属性值时,希望可以不用重启应用就实现配置的热更新。本文将介绍四种实现Nacos属性值自动刷新的方式,并给出代码示例代码。

🌀引入依赖:


pom.xml 文件中添加以下依赖,以使用 Nacos 客户端和 Spring Boot 的自动配置功能:

<dependencies>
    <!-- Nacos 客户端依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

🌠配置 Nacos 服务器信息:


application.propertiesapplication.yml 文件中配置 Nacos 服务器的相关信息,例如:

spring:
  cloud:
    nacos:
      config:
        server-addr: ${NACOS_SERVER_ADDR} # Nacos 服务器地址
        namespace: ${NACOS_NAMESPACE} # 命名空间

🌠多种方式实现动态刷新


⛈️使用@RefreshScope (推荐)

@RestController
@RefreshScope
public class MyController {

    @Value("${my.property}")
    private String myProperty;

    @GetMapping("/my-property")
    public String getProperty() {
        return myProperty;
    }

}

⛈️使用Nacos的ConfigListener接口示例:


@Component
public class MyConfigListener implements ConfigListener {

    @Override
    public void receiveConfigInfo(String configInfo) {
        // 处理新的配置信息
    }
}

⛈️使用Nacos的@NacosConfigurationProperties注解示例:


当使用 @NacosConfigurationProperties 注解时,可以将 Nacos 配置直接注入到 Java 对象的属性中,并实现配置的自动刷新。以下是一个示例:

import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "my")
@NacosConfigurationProperties(dataId = "my-config", autoRefreshed = true)
public class MyConfig {

    private String property;

    // 省略 getter 和 setter 方法

}

  • 在上述示例中,我们创建了一个名为 MyConfig 的类,并使用 @Component 注解将其作为一个组件进行注册。然后,使用 @ConfigurationProperties 注解指定前缀为 "my",表示该类的属性与以 "my" 为前缀的 Nacos 配置项进行绑定。
  • 接下来,使用 @NacosConfigurationProperties 注解指定了 dataId"my-config",这是在 Nacos 配置中心上的配置文件的唯一标识符。设置 autoRefreshed 属性为 true,以启用自动刷新功能。

现在,在其他组件中,我们可以直接注入 MyConfig 类,并使用它的属性:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private MyConfig myConfig;

    @GetMapping("/my-property")
    public String getProperty() {
        return myConfig.getProperty();
    }

}
  • 在上述示例中,我们注入了 MyConfig 类,并使用 myConfig.getProperty() 方法获取配置属性的值。当 Nacos 配置发生变化时,MyConfig 类的属性将自动更新,无需手动刷新。
  • 请确保在应用程序中正确配置 Nacos 服务器地址和命名空间,并根据实际情况调整类和属性名。此外,还需要添加相关的依赖项,如 spring-cloud-starter-alibaba-nacos-config

⛈️使用Nacos的@NacosValue注解示例:(不推荐使用)


@Component
public class MyComponent {

    @NacosValue(value = "${my.property}", autoRefreshed = true)
    private String myProperty;

    // 省略其它代码
}

以上示例提供了不同方式的实现方式,你可以根据你的需求和环境选择适合你的方式来实现Nacos配置文件的动态刷新。确保正确地引入相关依赖,并根据具体情况进行配置和调整。

🌠总结


  • 在Nacos中,动态刷新配置文件的实现方式可以总结如下:
    1. 使用Spring Cloud Config + Nacos:结合Spring Cloud Config和Nacos作为配置中心,在应用程序中添加@RefreshScope注解,并使用@Value注解绑定配置属性。通过发送POST请求到/actuator/refresh端点来触发配置的刷新。
    2. 使用Nacos的ConfigListener接口:实现ConfigListener接口,并注册为Nacos的监听器。当配置发生变化时,回调相应方法进行处理。
    3. 使用Nacos的@NacosConfigurationProperties注解:使用@NacosConfigurationProperties注解将Nacos配置注入到Java对象的属性中。结合@RefreshScope@ConfigurationProperties注解,实现配置的自动刷新。
    4. 使用Nacos的@NacosValue注解:使用@NacosValue注解直接将Nacos配置注入到Java对象的属性中。当配置发生变化时,属性值会自动更新。
  • 这些方式都可以实现Nacos配置文件的动态刷新,但根据具体场景和需求,选择最适合的方式非常重要。需要注意配置和依赖的正确引入,并确保代码中使用了正确的注解和方式来实现动态刷新。
  • 无论选择哪种方式,动态刷新配置文件能够使应用程序在运行时获取最新的配置信息,避免了重启应用或手动修改配置的麻烦。这样可以实现更灵活、高效的配置管理和应用部署。

🌠可能导致配置无法刷新的原因


以下分析只针对spring-cloud-starter-alibaba-nacos-config

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  • 配置文件未正确配置:检查配置文件中的Nacos连接信息,确保配置正确。任何配置错误,如错误的地址、端口或命名空间,都可能导致配置刷新不生效。
  • 是否存在Spring boot类扫描范围
  • 配置内容写在共享配置中,需要在配置文件中添加- shared-configs: - data-id: xxx refresh: true
  • 版本是否冲突,参考官方的文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
  • 是否为静态变量导致配置无法加载:
    • 在Spring框架中,@Value注解通常用于注入配置参数值到Spring管理的bean的字段中。然而,@Value并不直接支持静态变量的注入。
    • 如果你需要将配置参数值注入到静态变量中,你可以使用@PostConstruct注解的方法来在bean创建之后,初始化静态变量。

解决Nacos配置无法刷新的问题需要从多个方面进行排查和处理,包括检查服务状态、配置文件、订阅配置、缓存管理、配置监听、网络连接、配置版本以及插件或加密等方面。通过逐步排查和解决这些潜在问题,可以确保Nacos配置能够正确刷新并生效。列举错误发生情况.肯定存在列举不全情况.如果遇到不常见的异常情况可以留言.让更多人减少错误,谢谢大家

;