news 2026/5/2 22:43:43

[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/4/29 1:05:12

SGLang-v0.5.6启动命令详解:参数配置完整指南

SGLang-v0.5.6启动命令详解&#xff1a;参数配置完整指南 1. 引言 随着大语言模型&#xff08;LLM&#xff09;在实际业务场景中的广泛应用&#xff0c;如何高效部署并优化推理性能成为工程落地的关键挑战。SGLang-v0.5.6作为当前版本的稳定发布&#xff0c;提供了面向高性能…

作者头像 李华
网站建设 2026/4/23 22:28:59

TensorFlow-v2.15开箱即用:3分钟云端GPU跑通案例

TensorFlow-v2.15开箱即用&#xff1a;3分钟云端GPU跑通案例 你是不是也遇到过这样的情况&#xff1f;作为AI讲师&#xff0c;准备了一堂精彩的TensorFlow教学课&#xff0c;结果学生们的电脑五花八门——有的是老旧笔记本&#xff0c;有的没装CUDA&#xff0c;还有的连Python…

作者头像 李华
网站建设 2026/4/27 15:17:44

Qwen3-Embedding-0.6B智慧城市:市民诉求智能分拨系统实现

Qwen3-Embedding-0.6B智慧城市&#xff1a;市民诉求智能分拨系统实现 1. 背景与问题定义 随着城市治理数字化进程的加速&#xff0c;市民通过热线、政务平台、社交媒体等渠道提交的诉求量呈指数级增长。传统人工分拨模式面临响应延迟、分类不准、人力成本高等挑战。如何实现对…

作者头像 李华
网站建设 2026/4/30 1:39:50

从0开始微调DeepSeek-R1:修改模型自我认知实战教程

从0开始微调DeepSeek-R1&#xff1a;修改模型自我认知实战教程 1. 前言 在大模型应用落地过程中&#xff0c;模型的自我认知&#xff08;Self-Identity&#xff09;定制化是一个关键需求。例如&#xff0c;企业希望部署的AI助手能明确回答“我是由XX公司自主研发的AI模型”&a…

作者头像 李华
网站建设 2026/4/18 8:28:46

Qwen2.5-0.5B保姆级教程:1GB显存跑32K长文的详细步骤

Qwen2.5-0.5B保姆级教程&#xff1a;1GB显存跑32K长文的详细步骤 1. 引言 1.1 背景与目标 在边缘计算和轻量化AI部署日益重要的今天&#xff0c;如何在资源受限设备上运行高性能语言模型成为开发者关注的核心问题。通义千问Qwen2.5-0.5B-Instruct作为阿里Qwen2.5系列中最小的…

作者头像 李华
网站建设 2026/4/23 3:04:38

Open Interpreter性能优化:让Qwen3-4B运行速度提升50%

Open Interpreter性能优化&#xff1a;让Qwen3-4B运行速度提升50% 在本地AI开发场景中&#xff0c;响应延迟和推理吞吐是决定用户体验的关键指标。对于基于大语言模型的代码解释器Open Interpreter而言&#xff0c;即使使用如Qwen3-4B这样的中等规模模型&#xff0c;若未进行合…

作者头像 李华