news 2026/3/16 20:48:25

[spring cloud] nacos注册中心和配置中心

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[spring cloud] nacos注册中心和配置中心

1. Nacos 作为服务注册中心 (Service Registry)

1.1 核心原理

Nacos 作为注册中心,主要维护一张“服务列表”。

  1. 服务注册 (Registration):服务提供者(Provider)启动时,会通过 REST API 发送请求向 Nacos Server 注册自己的信息(IP、端口、服务名)。
  2. 心跳机制 (Heartbeat):提供者会定时(默认 5 秒)发送心跳包。如果 Nacos 超过 15 秒没收到心跳,会将实例设为不健康;超过 30 秒则剔除。
  3. 服务发现 (Discovery):服务消费者(Consumer)从 Nacos 拉取服务列表,并缓存在本地。
  4. CAP 理论:Nacos 支持AP(可用性优先,默认) 和CP(一致性优先) 模式的切换。

1.注册 & 发送心跳

2.订阅 & 拉取列表

3.推送变更

4.远程调用(RPC/REST)

服务提供者 Provider

Nacos Server

服务消费者 Consumer

1.2 Java 代码实战 (Spring Boot 3.0+)

第一步:引入依赖 (pom.xml)

在使用 Spring Boot 3.x 时,需配合 Spring Cloud Alibaba 2022.0.0.0 或更高版本。

<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

第二步:配置文件 (application.yml)

server:port:8081spring:application:name:nacos-provider-demo# 服务名称,非常重要cloud:nacos:discovery:server-addr:127.0.0.1:8848# Nacos Server 地址

第三步:启动类与测试

Spring Boot 3.x 中,@EnableDiscoveryClient注解由自动化配置处理,通常不再需要显式添加,但写上也无妨。

@EnableDiscoveryClient@SpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProviderApplication.class,args);}}

启动后,在 Nacos 控制台的“服务管理 -> 服务列表”中即可看到nacos-provider-demo


2. Nacos 作为配置中心 (Config Center)

2.1 核心原理

在微服务架构中,几十个服务的配置文件如果都散落在 Jar 包里,修改配置需要重启,非常麻烦。Nacos 提供了集中式管理和动态刷新。

  1. Data ID:Nacos 组织配置的核心,通常格式为${spring.application.name}-${spring.profiles.active}.${file-extension}(例如services-order-dev.yaml)。
  2. 长轮询 (Long Polling):客户端不单纯是拉取配置。客户端会发起一个长连接请求,Nacos 收到请求后若配置无变化会 hold 住请求(默认 30秒),一旦配置发生变化,立即返回最新配置。这保证了配置更新的实时性。
  3. 动态刷新:结合 Spring 的@RefreshScope,可以在不重启应用的情况下更新内存中的变量。

2.2 Java 代码实战 (Spring Boot 3.0+ 重点)

第一步:引入依赖

在之前的pom.xml基础上添加:

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

第二步:配置文件 (application.yml)

直接在application.yml中使用import语法。

spring:profiles:active:devapplication:name:service-ordercloud:nacos:server-addr:127.0.0.1:8848config:import-check:enabled:falsenamespace:${spring.profiles.active:dev}#指定命名空间server:port:8080---spring:config:import:-nacos:common.properties?group=order# nacos:{DataId}?group={Group}activate:on-profile:dev---spring:config:import:-nacos:common.properties?group=orderactivate:on-profile:prod

第三步:在 Nacos 控制台添加配置

  1. 登录 Nacos 控制台。
  2. 进入“配置管理 -> 配置列表”。
  3. 点击“+”号新增配置:
  • 新建命名空间
  • Group: 填 order
  • Data ID:common.properties(必须与上面 import 的逻辑匹配)
  • 配置格式: Properties
  • 配置内容:
# 订单超时时间 order.timeout=5000
  1. 发布。

第四步:Java 代码读取与动态刷新

为了演示不重启更新配置,我们需要使用@RefreshScope

packagecom.example.demo.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.cloud.context.config.annotation.RefreshScope;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RefreshScope// 关键注解:当 Nacos 配置变更时,动态刷新此类中的 @Value 属性publicclassConfigController{@Value("${user.name}")privateStringuserName;@Value("${user.age}")privateIntegeruserAge;@GetMapping("/config/info")publicStringgetConfigInfo(){return"User: "+userName+", Age: "+userAge;}}

3. 配置优先级

在 Spring Boot 3 + Nacos 中,配置的加载是有严格顺序的。原则是:“越具体,优先级越高”

假设服务名是service-order,环境是dev。以下是配置生效的优先级(从高到低,上面的覆盖下面的):

优先级配置文件 (Data ID)说明
NO.1 (最高)service-order-dev.yaml精确匹配:既指定了服务名,又指定了环境 profile。这是主配置。
NO.2service-order.yaml服务默认:只指定了服务名,没指定环境。通常放该服务所有环境通用的配置。
NO.3common.properties(import)扩展/共享配置:通过spring.config.import引入的外部配置。
NO.4 (最低)本地application.yml项目 Jar 包里的本地配置。

这两个是 Nacos 配置中心进阶使用的两个重要场景。

  1. @ConfigurationProperties:属于Spring Boot 原生方式。用于将一组配置批量绑定到 Java Bean 中。在 Spring Cloud 环境下,它自带“自动刷新”光环,比@Value更强大、更优雅。
  2. NacosConfigManager监听:属于Nacos SDK 底层方式。当你不仅仅想更新变量,还想在配置变化时触发一段业务逻辑(比如:清理本地缓存、调整线程池大小、打印日志),就需要用到它。

下面我基于Spring Boot 3.0+为你详细介绍原理和代码。


4. @ConfigurationProperties 批量绑定与自动刷新

4.1 原理
  • 批量绑定:Spring Boot 通过扫描prefix前缀,将配置文件(Nacos 里的 YAML/Properties)中的值自动映射到 Bean 的属性上。
  • 自动刷新
  • 这与@Value不同。使用@Value必须加@RefreshScope才能动态刷新。
  • 使用@ConfigurationProperties的 Bean,Spring Cloud 有一个专门的ConfigurationPropertiesRebinder监听器。当 Nacos 配置发生变化发出RefreshEvent时,这个监听器会自动销毁旧 Bean,重新绑定生成新 Bean。
4.2 Java 代码实战

场景:我们在 Nacos 的service-order-dev.yaml中配置了一组订单的超时规则。

Nacos 配置内容:

order:rules:connect-timeout:2000read-timeout:5000auto-confirm-days:7

Java 代码 (OrderProperties.java):

packagecom.example.order.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;@Data// 必须要有 Setter 方法,Spring 才能注入值@Component// 注册为 Spring Bean@ConfigurationProperties(prefix="order.rules")// 指定前缀publicclassOrderProperties{/** * 连接超时时间 * 对应 YAML 中的 order.rules.connect-timeout */privateIntegerconnectTimeout;/** * 读取超时时间 */privateIntegerreadTimeout;/** * 自动确认收货天数 */privateIntegerautoConfirmDays;}

测试控制器:

@RestControllerpublicclassTestController{@AutowiredprivateOrderPropertiesorderProperties;@GetMapping("/props")publicOrderPropertiesgetProps(){// 直接返回对象,当 Nacos 修改配置后,再次访问这里,值会自动变returnorderProperties;}}

实操验证

  1. 启动服务,访问/props,看到connectTimeout是 2000。
  2. 在 Nacos 控制台修改为 9999,发布。
  3. 不用重启,再次访问/props,你会发现值已经变成了 9999。

5. NacosConfigManager 监听配置变化

5.1 原理

有时候,配置变了,我们不只是想改变变量的值,我们想执行代码
例如:useLocalCache开关从true变成了false,我不仅要更新变量,我还需要立即清空内存里的 Map。这时候仅仅通过注入属性是不够的。

NacosConfigManager是 Spring Cloud Alibaba 对 Nacos 原生 SDK (ConfigService) 的封装。通过它,我们可以注册一个监听器 (Listener),当 Nacos 服务端推送配置变更时,客户端的回调方法receiveConfigInfo会被触发。

5.2 Java 代码实战

场景:监听common.properties文件的变化,一旦变化,打印日志并执行自定义逻辑。

packagecom.example.order.listener;importcom.alibaba.cloud.nacos.NacosConfigManager;importcom.alibaba.nacos.api.config.listener.Listener;importcom.alibaba.nacos.api.exception.NacosException;importjakarta.annotation.PostConstruct;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.concurrent.Executor;@Slf4j@ComponentpublicclassCustomConfigListener{@AutowiredprivateNacosConfigManagernacosConfigManager;// 假设我们要监听的 DataId 和 GroupprivatefinalStringdataId="common.properties";privatefinalStringgroup="order";@PostConstructpublicvoidinit()throwsNacosException{// 获取原生的 ConfigServicenacosConfigManager.getConfigService().addListener(dataId,group,newListener(){@OverridepublicExecutorgetExecutor(){// 返回 null 表示使用 Nacos 内部的主线程来执行回调// 如果逻辑很复杂,建议自定义线程池returnnull;}@OverridepublicvoidreceiveConfigInfo(StringconfigInfo){// configInfo 就是变化后最新的配置内容(字符串形式)log.info("【监听到配置变化】DataID: {}, Group: {}",dataId,group);log.info("新配置内容: \n{}",configInfo);// TODO: 在这里执行你的业务逻辑// 比如:refreshLocalCache();// 比如:updateThreadPoolSize();}});}}
5.3 进阶:监听特定的值 (结合 JSON/YAML 解析)

receiveConfigInfo返回的是整个文件的字符串。如果你只想监听timeout这一项的变化,你需要自己解析字符串。

// 伪代码示例publicvoidreceiveConfigInfo(StringconfigInfo){Propertiesprops=newProperties();props.load(newStringReader(configInfo));// 解析配置StringnewTimeout=props.getProperty("timeout");if(!newTimeout.equals(currentTimeout)){log.info("检测到 timeout 发生改变,执行更新逻辑...");currentTimeout=newTimeout;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 8:00:47

AMD Ryzen处理器调试终极指南:全面解锁硬件性能潜力

AMD Ryzen处理器调试终极指南&#xff1a;全面解锁硬件性能潜力 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitc…

作者头像 李华
网站建设 2026/3/15 2:19:46

Qwen3-32B极速体验:5分钟从注册到对话,不装环境

Qwen3-32B极速体验&#xff1a;5分钟从注册到对话&#xff0c;不装环境 你是不是也遇到过这样的情况&#xff1a;产品发布会马上就要开始了&#xff0c;领导突然说“加个AI互动环节”&#xff0c;技术同事却临时请假&#xff0c;整个团队陷入慌乱&#xff1f;别急——今天我要…

作者头像 李华
网站建设 2026/3/13 9:58:12

Legacy iOS Kit完全指南:让老款苹果设备重获新生的终极工具链

Legacy iOS Kit完全指南&#xff1a;让老款苹果设备重获新生的终极工具链 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …

作者头像 李华
网站建设 2026/3/13 16:20:48

轻松生成巴赫、贝多芬风格乐曲|NotaGen实操分享

轻松生成巴赫、贝多芬风格乐曲&#xff5c;NotaGen实操分享 1. 引言&#xff1a;AI音乐生成的新范式 在人工智能技术不断渗透创作领域的今天&#xff0c;音乐创作也迎来了前所未有的变革。传统上&#xff0c;古典音乐的创作依赖于深厚的理论功底与长期的艺术积累&#xff0c;…

作者头像 李华
网站建设 2026/3/13 16:15:41

大模型体验新方式:按秒计费GPU,1块钱起玩Llama3

大模型体验新方式&#xff1a;按秒计费GPU&#xff0c;1块钱起玩Llama3 你是不是也和我一样&#xff0c;看到Llama3发布后心痒难耐&#xff0c;恨不得立刻上手试一试&#xff1f;但现实很骨感&#xff1a;本地显卡显存不够&#xff0c;4090都跑不动70B版本&#xff1b;想租云服…

作者头像 李华
网站建设 2026/3/14 1:08:22

Z-Image-Turbo开源部署优势:无需外网下载权重实战指南

Z-Image-Turbo开源部署优势&#xff1a;无需外网下载权重实战指南 Z-Image-Turbo是阿里巴巴通义实验室开源的高效AI图像生成模型&#xff0c;作为Z-Image的蒸馏版本&#xff0c;它在保持高质量图像输出的同时大幅提升了推理速度。该模型仅需8步即可完成图像生成&#xff0c;具…

作者头像 李华