1、简介
动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
动态DNS服务
通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
2、安装
官网 [^1]
下载地址 [^2]
启动
1
2cd nacos/bin
bash startup.sh -m standalone(ubuntu,standalone非集群模式启动)若提示内存不足,则修改启动内存
bin/startup.shXms 是指设定程序启动时占用内存大小
Xmx 是指设定程序运行期间最大可占用的内存大小
-Xmn 新生代的大小

使用 http://localhost:8848/nacos 访问,账号密码初始为nacos

修改为mysql数据库,数据库版本需为5版本(application.properties文件)

创建nacos数据库,将config文件下的nacos-mysql.sql文件导入到nacos数据库中,修改为自己myslq的用户名和密码

重启nacos服务
3、配置
命令空间,隔离多个环境

在不同的命令空间中创建相应的配置信息

回滚
在历史版本中可以进行配置版本的回滚操作

无需账号密码登录
注释掉application.properties配置文件中的这一行

加上下面后重启服务
1 | spring.security.enabled=false |
4、Springboot中使用
获取配置,第一种方式
导入依赖
1 | <dependency> |
1 | package com.yuankaiqiang.nacos; |
获取配置,第二种方式
导入依赖(这个依赖包括第一种方式的jar包)
1 | <!-- nacos-配置管理功能依赖 --> |
启动类上增加@NacosPropertySource,多个配置增加多个注解,只支持properties

1 |
|
原配置


修改为zhangsan后


注册服务
启动项目后
1 | server.port = 8891 |
1 |
|
服务列表中增加了一个服务


订阅注册服务者
订阅者订阅某个服务


5、搭建集群
需要依赖mysql
伪分布式(下面这种方式适用1.4.2使用,2.x启动有问题)
- 复制三份nacos文件夹,重命名为nacos1,nacos2,nacos3,相当于三个集群

修改每个文件中集群中的端口号,application.properties 中增加
server.port=8848Nacos1 8848 Nacos2 8849 Nacos3 8850 修改每个文件,集群配置文件(cluster.conf.example)中修改成对应的ip和端口,因为都是本地所以都为192.168.x.x(使用192),并将文件名称修改为
cluster.conf1
2
3
4
5#it is ip
#example
192.168.185.116:8848
192.168.185.116:8849
192.168.185.116:8850分别三个集群启动
bash startup.sh -m clustercluster为集群模式启动查看状态
8848为leader

关掉8848服务器,leader为8849

4、面试题
1. 什么是 Nacos?它的核心功能有哪些?
答:
Nacos(Naming and Configuration Service)是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。
核心功能:
- 服务注册与发现:支持 DNS 和 RPC 服务发现(如 Dubbo、gRPC、Spring Cloud)。
- 动态配置管理:支持配置的集中管理、动态更新、版本控制、环境隔离。
- 服务管理:支持服务健康检查、元数据管理、流量管理等。
- 动态 DNS 服务:支持权重路由,可用于 DNS 负载均衡。
✅ 特点:轻量级、高可用、易集成,是 Spring Cloud Alibaba 的核心组件之一。
2. Nacos 的配置中心是如何实现动态刷新的?
答:
Nacos 客户端通过 长轮询(Long Polling) + 回调机制 实现配置的动态推送感知:
- 客户端启动时向 Nacos 服务器发起一个长轮询请求(默认 30s 超时)。
- 服务端不会立即返回,而是 hold 请求,直到配置发生变化或超时。
- 一旦配置变更,服务端立即返回变更的
dataId列表。 - 客户端收到通知后,主动拉取最新配置,并触发
Listener回调。 - 在 Spring Cloud 中,通过
@RefreshScope注解实现 Bean 的刷新。
⚠️ 注意:不是真正的“推送”,而是“准实时拉取 + 服务端阻塞通知”。
3. 如何在 Spring Boot 中集成 Nacos 配置中心?
答:
步骤如下:
- 添加依赖:
1 | <dependency> |
- 配置
bootstrap.yml:
1 | spring: |
- 在 Nacos 控制台创建配置:
- Data ID:
user-service.yaml - Group:
DEFAULT_GROUP - 内容:YAML 格式配置
- Data ID:
- 使用
@Value+@RefreshScope实现热更新:
1 |
|
4. Nacos 的命名空间(Namespace)、组(Group)、Data ID 分别有什么作用?
答:
| Namespace | 隔离环境(如 dev/test/prod)或租户 | 不同环境使用不同命名空间 ID |
| Group | 对配置或服务进行逻辑分组 | 如ORDER_GROUP,USER_GROUP |
| Data ID | 唯一标识一个配置文件 | 通常为${spring.application.name}.${file-extension} |
✅ 公式:
Data ID = ${prefix}-${spring.profile.active}.${file-extension}
默认前缀是spring.application.name
5. Nacos 支持哪些配置格式?如何指定?
答:
支持格式:properties, yaml, json, xml, text 等。
通过 file-extension 参数指定:
1 | spring: |
⚠️ 注意:如果使用
yaml,建议统一使用.yaml后缀,避免与.yml混淆。
6. Nacos 如何实现配置的版本管理和回滚?
答:
Nacos 控制台提供配置的 历史版本管理 功能:
- 每次修改配置会生成一个新版本。
- 可查看历史版本的修改时间、内容、操作人。
- 支持“一键回滚”到任意历史版本。
- 版本信息存储在数据库中(MySQL 或内嵌 Derby)。
✅ 优势:避免误操作导致配置错误,提升运维安全性。
7. Nacos 集群模式下如何保证数据一致性?
答:
Nacos 使用 Raft 协议 实现 CP(一致性优先)的数据一致性。
- 在集群模式下,Nacos 自研了
jraft组件(基于 Raft)。 - 所有写请求(如发布配置)必须由 Leader 处理。
- Leader 将数据同步给 Follower,多数派确认后才返回成功。
- 读请求可由任意节点处理(可优化性能)。
✅ 注意:单机模式使用 Derby,集群模式必须使用 MySQL 持久化配置。
8. Nacos 和 Eureka 的区别是什么?
| CAP 模型 | 支持 AP(服务发现)和 CP(配置) | AP 模型 |
| 健康检查 | TCP/HTTP/心跳 | 心跳机制 |
| 配置中心 | ✅ 内置 | ❌ 不支持 |
| 服务发现协议 | 支持 DNS + API | 仅 API |
| 自动剔除节点 | ✅(超过阈值自动剔除) | ✅ |
| 集群一致性协议 | Raft(CP) | Peer-to-Peer 复制(AP) |
| 生态集成 | Spring Cloud Alibaba | Spring Cloud Netflix |
✅ 总结:Nacos 更全面,功能更强,是 Eureka 的“超集”。
9. Nacos 和 Apollo 的区别?
| 核心定位 | 服务发现 + 配置管理一体化 | 专业配置中心 |
| 配置灰度发布 | ❌(社区版)/ ✅(企业版) | ✅ |
| 权限控制 | 基础(用户+namespace) | 完善(项目、角色、审计) |
| 配置发布流程 | 简单直接 | 支持审批流程 |
| 服务发现 | ✅ | ❌(需额外组件) |
| 易用性 | 轻量、易部署 | 功能多、较重 |
| 社区支持 | 阿里 + Spring Cloud Alibaba | 携程开源,活跃 |
✅ 建议:需要服务发现选 Nacos;需要复杂配置治理选 Apollo。
10. Nacos 客户端是如何监听配置变化的?
答:
通过 ConfigService 添加监听器:
1 | NacosFactory.createConfigService(properties); |
在 Spring Cloud 中自动完成,开发者只需使用 @RefreshScope。
11. Nacos 如何实现多环境隔离?
答:
主要通过 Namespace 实现:
- 在 Nacos 控制台创建多个命名空间,如:
- dev(开发)
- test(测试)
- prod(生产)
- 每个命名空间有唯一 ID。
- 应用通过配置
namespace: <id>指定环境。
1 | spring: |
✅ 优势:配置完全隔离,避免误操作。
12. Nacos 集群部署需要哪些组件?
答:
生产环境推荐集群部署,组件包括:
- 至少 3 个 Nacos 节点(奇数个,满足 Raft 协议)
- 共享数据库:MySQL 集群(主从或 MHA),用于持久化配置和服务信息
- 负载均衡器:如 Nginx、HAProxy,对外提供统一入口
- JDK 1.8+
- 网络互通、时间同步
部署结构:
1 | Client → Nginx → Nacos Node1 |
13. Nacos 的健康检查机制是怎样的?
答:
Nacos 支持多种健康检查方式:
- 临时实例(Ephemeral):客户端上报心跳(默认 5s 一次),服务端 15s 未收到则标记不健康,30s 未收到则剔除。
- 持久化实例(Persistent):服务端主动发起 TCP/HTTP/MySQL 检查。
✅ 临时实例适用于 Spring Cloud 服务;持久化实例适用于非 SDK 接入(如 Kubernetes 服务)。
14. 如何保证 Nacos 配置的安全性?
答:
可以从以下方面加强安全:
启用鉴权
:Nacos 1.2+ 支持开启鉴权:
1
2
3
4nacos:
core:
auth:
enabled: true配置敏感信息加密:如数据库密码,可使用 Jasypt 或自定义加密插件。
网络隔离:Nacos 服务部署在内网,限制外网访问。
权限控制:通过 namespace 隔离不同团队。
审计日志:记录配置变更操作人、时间。
15. Nacos 的高可用是如何保障的?
答:
从多个层面保障高可用:
- 集群部署:至少 3 节点,避免单点故障。
- 数据持久化:使用 MySQL 存储配置和服务信息,防止数据丢失。
- Raft 协议:保证数据一致性,Leader 故障自动选举。
- 健康检查:自动剔除异常节点。
- 负载均衡:前端加 Nginx,实现请求分发。
- 容错机制:客户端本地缓存配置,即使 Nacos 宕机也能使用旧配置启动。
16. Nacos vs Apollo 主要对比
| 配置管理 | ✅ | ✅(更成熟) |
| 服务发现 | ✅(一体化) | ❌(需配合 Eureka/Zookeeper) |
| 配置灰度发布 | ❌(社区版)/ ✅(企业版) | ✅ |
| 多数据中心支持 | ✅ | ✅ |
| 权限体系 | 基础(社区版) | 更完善(用户、项目、角色) |
| 易用性 | 简单轻量 | 功能丰富但较重 |
| 社区活跃度 | 高(Spring Cloud Alibaba 主推) | 高 |
| 与 Spring Cloud 集成 | 原生支持 | 需额外集成 |
适用场景建议
- 选 Nacos:
- 同时需要 服务发现 + 配置管理
- 技术栈基于 Spring Cloud Alibaba
- 希望轻量、快速部署
- 不需要复杂的灰度发布或审计功能
- 选 Apollo:
- 对配置管理要求高(如严格的发布流程、权限审计、灰度发布)
- 已有成熟 Apollo 体系
- 需要更强大的治理能力
🎯 总结:Nacos 面试重点
| 基础使用 | 配置接入、bootstrap.yml、@RefreshScope |
| 架构设计 | Namespace/Group/Data ID、AP/CP 切换 |
| 原理机制 | 长轮询、Raft、健康检查 |
| 高可用 | 集群部署、MySQL 持久化 |
| 对比选型 | vs Eureka、vs Apollo、vs Consul |