Nacos 从入门到实战:一站式注册中心与配置中心详解
Nacos 从入门到实战一站式注册中心与配置中心详解一、Nacos 简介二、Nacos 的安装与启动2.1 版本选择2.2 下载 Nacos2.3 启动 Nacos2.4 服务注册与发现基本原理三、Spring Boot 微服务集成 Nacos 注册中心3.1 添加依赖3.2 基础配置3.3 服务调用与负载均衡四、Nacos 注册中心的高级特性4.1 服务集群与就近访问4.2 权重配置4.3 环境隔离命名空间Namespace和分组Group4.4 实例类型临时实例 vs 永久实例五、Nacos 配置中心5.1 添加配置中心依赖5.2 配置 Nacos 配置中心5.3 导入 Nacos 配置文件5.4 读取配置的三种方式5.4.1 使用 Value 注解不支持自动刷新5.4.2 使用 RefreshScope 实现动态刷新5.4.3 使用 ConfigurationProperties 配置类推荐默认支持热更新5.5 配置优先级5.6 配置持久化切换数据库六、常见问题与注意事项七、总结一、Nacos 简介NacosDynamic Naming and Configuration Service是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。它提供以下核心能力服务发现与服务健康检查支持基于 DNS 和 RPC 的服务发现以及服务的健康检查心跳、TCP、HTTP 等实现服务的自动注册与摘除。动态配置管理可以集中管理所有环境的配置配置变更时无需重启应用即可实时生效。动态 DNS 服务支持基于服务的负载均衡和路由策略。服务和元数据管理提供可视化的服务管理控制台便于运维管理。Nacos 致力于帮助您构建、交付和管理微服务平台是 Spring Cloud Alibaba 生态中的关键组件之一。二、Nacos 的安装与启动2.1 版本选择目前 Nacos 的最新稳定版本为 2.5.2对于大多数微服务应用选择 2.x 版本即可3.x 版本引入了对 AI 和 MCP 协议的支持若无特殊需求无需升级。本文以Nacos 2.5.2为例进行讲解。2.2 下载 Nacos您可以从 Nacos 官方 GitHub 下载页面获取也可以直接使用以下链接下载 2.5.2 的压缩包下载 Nacos 2.5.2下载后解压到任意目录例如D:\cloud\nacos-server-2.5.2。2.3 启动 NacosNacos 支持单机模式和集群模式。开发环境中通常使用单机模式启动。Windows进入bin目录双击或命令行执行startup.cmd -m standaloneLinux/Mac执行sh startup.sh -m standalone启动成功后控制台会显示 Nacos 运行信息默认端口为8848。打开浏览器访问 http://localhost:8848/nacos即可看到 Nacos 控制台登录页面默认用户名/密码均为nacos。登录后即可管理服务与配置。2.4 服务注册与发现基本原理Nacos 作为注册中心时工作流程如下服务注册微服务启动时向 Nacos Server 发送注册请求包含服务名、IP、端口、健康检查方式等信息。心跳续约服务会定时向 Nacos 发送心跳表明自己健康存活。若一段时间未收到心跳Nacos 会将服务实例标记为不健康并最终剔除。服务发现服务消费者从 Nacos 获取服务提供者的实例列表并缓存到本地。当实例列表发生变化时Nacos 会主动推送更新。负载均衡消费者拿到实例列表后可使用负载均衡算法如轮询、随机、权重等选择一个实例发起调用。三、Spring Boot 微服务集成 Nacos 注册中心3.1 添加依赖在微服务模块的pom.xml中引入 Nacos 服务发现 StarterdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency如果您使用的是 Spring Cloud 2023.x 及 Spring Boot 3.2.x请确保版本兼容推荐使用 spring-cloud-alibaba 2023.0.1.0。3.2 基础配置在application.yml中配置 Nacos 服务发现spring:application:name:lqb-user# 微服务名称注册到 Nacos 的标识cloud:nacos:discovery:server-addr:localhost:8848# Nacos 服务端地址# 可选配置# namespace: 命名空间ID# group: 分组名启动应用后在 Nacos 控制台“服务管理”中即可看到注册的服务。3.3 服务调用与负载均衡在消费者服务中可使用LoadBalanced的RestTemplate或 OpenFeign 进行服务调用。使用 RestTemplateConfigurationpublicclassAppConfig{BeanLoadBalanced// 开启客户端负载均衡publicRestTemplaterestTemplate(){returnnewRestTemplate();}}RestControllerpublicclassConsumerController{AutowiredprivateRestTemplaterestTemplate;GetMapping(/call/{id})publicStringcall(PathVariableLongid){// 直接使用服务名调用returnrestTemplate.getForObject(http://lqb-user/user/id,String.class);}}使用 OpenFeign推荐FeignClient(namelqb-user)// name 为注册中心的服务名publicinterfaceUserFeignClient{GetMapping(/user/{id})UsergetUser(PathVariable(id)Longid);}然后在启动类添加EnableFeignClients。四、Nacos 注册中心的高级特性4.1 服务集群与就近访问在微服务部署多机房时可以配置cluster-name来标识服务所在的集群如北京机房、上海机房。结合 Nacos 的负载均衡策略可以实现优先访问同集群的服务实例降低跨机房调用延迟。配置示例spring:cloud:nacos:discovery:cluster-name:BJ# 服务所在集群名称同时在负载均衡器中启用 Nacos 的负载均衡扩展即可实现同集群优先访问spring:cloud:loadbalancer:nacos:enabled:true# 启用 Nacos 负载均衡策略随机访问且优先同集群注意该功能依赖spring-cloud-starter-loadbalancer依赖且需要将 Nacos 的权重和集群信息纳入负载均衡决策。4.2 权重配置在 Nacos 控制台中可以为每个服务实例设置权重默认值为 1。权重越高被负载均衡选中的概率越大。利用这一特性可以实现灰度发布、金丝雀发布等场景。例如将新版本服务的权重设置为 10旧版本保持 1则大部分流量会流向新版本便于观察和验证。4.3 环境隔离命名空间Namespace和分组Group命名空间用于隔离不同环境如开发、测试、生产。不同命名空间的服务互不可见。分组在同一个命名空间内可以进一步使用分组来隔离不同业务或版本的服务。在 Nacos 控制台创建命名空间后会生成一个命名空间 ID不是名称配置时需要填写此 ID。配置示例spring:cloud:nacos:discovery:namespace:d0247d5f-d454-47cd-ad12-e59c70bd207c# 命名空间 IDgroup:DEV-01# 分组名重要提示服务消费者和提供者必须处于同一个命名空间和分组才能互相发现。命名空间分组4.4 实例类型临时实例 vs 永久实例临时实例ephemeraltrue默认实例类型。客户端向 Nacos 发送心跳维持活性若心跳超时则服务会被自动剔除。适合常规微服务场景。永久实例ephemeralfalse不依赖心跳需要手动管理健康状态。适合固定机器或数据库等资源。配置方式ephemeraltrue为临时实例false为永久实例。spring:cloud:nacos:discovery:ephemeral:true# 默认为 truetrue:临时实例false:永久实例五、Nacos 配置中心Nacos 除了作为注册中心还可以作为配置中心实现配置的集中管理和动态刷新。5.1 添加配置中心依赖在微服务模块中引入 Nacos 配置中心 StarterdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency5.2 配置 Nacos 配置中心在application.yml中同时配置注册中心和配置中心注意配置中心的命名空间和分组一般建议与注册中心保持一致以保证逻辑统一。spring:cloud:nacos:config:server-addr:localhost:8848namespace:d0247d5f-d454-47cd-ad12-e59c70bd207c# 与 discovery 保持一致group:DEV-01file-extension:yaml# 配置文件后缀5.3 导入 Nacos 配置文件先在nacos中配置user-dev.yaml文件。从 Spring Boot 2.4 开始官方推荐使用spring.config.import来导入外部配置。在application.yml中添加spring:config:import:-nacos:user-dev.yaml# 导入 user-dev.yaml 配置dataId 为 user-dev.yaml-nacos:deepseek-dev.yaml# 可导入多个配置此时应用启动时会自动从 Nacos 拉取对应的配置文件并合并到 Spring Environment 中。注意事项nacos:后面紧跟 dataId中间不能有空格。dataId 的格式通常为服务名-环境.后缀例如user-dev.yaml。如果指定了file-extension也可以只写user-devSpring 会自动拼接后缀。5.4 读取配置的三种方式5.4.1 使用Value注解不支持自动刷新RestControllerpublicclassUserController{Value(${pattern.dateformat})privateStringdateFormat;GetMapping(/format)publicStringgetFormat(){returndateFormat;}}这种方式在 Nacos 修改配置后需要重启应用才能生效不支持动态刷新。5.4.2 使用RefreshScope实现动态刷新在类上添加RefreshScope注解并配合Value使用即可实现配置变更后的自动刷新。RestControllerRefreshScopepublicclassUserController{Value(${pattern.dateformat})privateStringdateFormat;GetMapping(/format)publicStringgetFormat(){returndateFormat;}}此时在 Nacos 中修改pattern.dateformat的值并发布后无需重启应用再次访问/format接口即可看到新值。注意RefreshScope的原理是创建代理当配置变化时重新初始化 Bean。它不能用于static字段且对于某些复杂 Bean 可能需要额外处理。5.4.3 使用ConfigurationProperties配置类推荐默认支持热更新定义一个配置类使用ConfigurationProperties注解DataConfigurationProperties(prefixdeepseek)publicclassDeepSeekProperties{privateStringurl;privateStringapiKey;}在 Spring Boot 启动类或配置类上启用该配置SpringBootApplicationEnableConfigurationProperties(DeepSeekProperties.class)publicclassUserApplication{publicstaticvoidmain(String[]args){SpringApplication.run(UserApplication.class,args);}}或者在Configuration类上直接使用ConfigurationPropertiesScan。之后在任意 Bean 中注入DeepSeekProperties即可ServicepublicclassDeepSeekService{AutowiredprivateDeepSeekPropertiesdeepSeekProperties;publicvoidprintConfig(){System.out.println(deepSeekProperties.getUrl());}}优势支持批量配置绑定类型安全。默认支持热更新当 Nacos 中的配置发生变化时DeepSeekProperties会自动刷新无需额外注解。便于集中管理配置属性。5.5 配置优先级远程配置优先级高于本地配置如果本地application.yml与 Nacos 配置中存在相同的属性Nacos 中的值会覆盖本地值。多个 Nacos 配置文件的优先级spring.config.import中按声明顺序后导入的配置文件优先级更高会覆盖先导入的相同属性。Spring Boot 的配置优先级规则命令行参数 环境变量 远程配置 本地配置文件 默认值。5.6 配置持久化切换数据库Nacos 默认使用内嵌的 Derby 数据库存储配置仅适用于开发测试。生产环境建议切换到 MySQL。创建数据库和表在 MySQL 中创建名为nacos的数据库并执行 Nacos 安装目录下conf/mysql-schema.sql文件生成表结构。修改 Nacos 配置文件打开conf/application.properties取消注释并修改数据库相关配置# 开启 MySQL 存储 spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://127.0.0.1:3306/nacos?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneAsia/Shanghai db.user.0root db.password.0123456重启 Nacos之后配置数据将持久化到 MySQL 的config_info等表中。六、常见问题与注意事项命名空间 ID vs 名称配置时使用的是 Nacos 中生成的唯一 ID而不是用户输入的命名空间名称。务必复制控制台中的 ID。配置中心和注册中心的命名空间/分组一致性如果注册中心指定了命名空间和分组建议配置中心也使用相同配置否则可能导致服务注册在一个空间配置却在另一个空间引发混乱。配置动态刷新的局限性RefreshScope不能作用于Bean方法返回的单例 Bean 中的字段若需刷新整个 Bean可考虑将 Bean 也标注RefreshScope。spring.config.import的正确格式- nacos:user-dev.yaml中间不要有空格否则无法识别。权重配置仅在 Nacos 负载均衡策略下生效若使用 Ribbon 或默认 LoadBalancer需确保启用了 Nacos 扩展即spring.cloud.loadbalancer.nacos.enabledtrue。七、总结本文从 Nacos 的基础概念出发详细介绍了 Nacos 的安装、启动以及如何将 Spring Boot 微服务集成到 Nacos 注册中心和配置中心。深入讲解了服务集群、权重、环境隔离命名空间/分组、实例类型等高级特性并展示了三种读取配置的方式及其优缺点。最后提供了配置持久化方案和常见问题注意事项。掌握 Nacos 的使用是构建稳健微服务架构的重要一步。希望本文能帮助您快速上手 Nacos并在实际项目中灵活运用。参考链接Nacos 官方文档Spring Cloud Alibaba 文档Nacos 下载地址