Nacos
Nacos 是阿里巴巴开源的服务发现与配置管理平台,支持 AP/CP 可切换的微服务基础设施。
#tech / ops / microservice
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: Development Environment MOC
- 并列概念: [[eureka]], [[consul]]
Nacos
一句话定义
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的微服务基础设施,提供服务注册与发现、动态配置管理和 DNS 服务三大核心功能,支持 AP/CP 一致性模式可切换。
核心机制 / 工作原理
三大核心功能
1. 服务注册与发现
// 服务注册(Spring Cloud 示例)
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApp { }
// 服务发现
@Autowired
private DiscoveryClient discoveryClient;
List<ServiceInstance> instances = discoveryClient.getInstances("order-service");
- 服务启动时向 Nacos 注册自己的地址和端口
- 消费者通过服务名查询可用实例列表
- 支持权重路由、元数据标签、跨集群访问
2. 动态配置管理
# Nacos 控制台中的配置
# Data ID: order-service.yaml, Group: DEFAULT_GROUP
server:
port: 8080
feature:
enable-new-checkout: true # 运行时可热更新
// 代码中自动监听配置变更
@Value("${feature.enable-new-checkout}")
private boolean enableNewCheckout;
// 配置变更时自动注入新值
- 配置与代码分离,支持热更新
- 支持 Properties、YAML、JSON 等格式
- 支持命名空间(环境隔离)、分组、Data ID 三级组织
3. DNS 服务
- 将服务名映射为 DNS 记录
- 支持自定义域名访问微服务
- 兼容传统 DNS 查询方式
架构原理
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Nacos 节点1 │◄───►│ Nacos 节点2 │◄───►│ Nacos 节点3 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────────┼───────────────────┘
│
MySQL / Derby(持久化)
AP/CP 可切换
Nacos 根据服务类型自动选择一致性协议:
| 模式 | 协议 | 适用场景 | 说明 |
|---|---|---|---|
| AP 模式 | Distro(最终一致性) | 服务注册发现 | 高可用,允许短暂不一致 |
| CP 模式 | Raft(强一致性) | 配置管理、选举 | 保证数据强一致 |
临时实例(ephemeral,默认)使用 AP 模式,持久实例使用 CP 模式。
健康检查机制
| 检查方式 | 适用对象 | 说明 |
|---|---|---|
| 客户端心跳 | 临时实例 | 服务端每 5 秒检测心跳,15 秒标记不健康,30 秒剔除 |
| 服务端探测 | 持久实例 | Nacos 主动 TCP/HTTP 探测服务端口 |
| MySQL 健康检查 | 数据源 | 检查数据库连接是否正常 |
与 Eureka / Consul 对比
| 维度 | Nacos | Eureka | Consul |
|---|---|---|---|
| 开发商 | 阿里巴巴 | Netflix | HashiCorp |
| 一致性 | AP/CP 可切换 | AP(最终一致) | CP(Raft) |
| 配置管理 | 内置 | 无(需 Spring Cloud Config) | 内置(KV Store) |
| 健康检查 | 客户端心跳 + 服务端探测 | 客户端心跳 | 服务端探测 + 客户端心跳 |
| 管理界面 | 完善的 Web 控制台 | 简单仪表盘 | Web UI |
| 多数据中心 | 支持 | 不支持 | 支持 |
| 社区活跃度 | 高(国内主流) | 维护模式 | 活跃 |
| 语言生态 | Java/Go/Python | Java 为主 | Go/多语言 |
最小例子
# 1. 下载并启动(单机模式)
sh startup.sh -m standalone
# 2. 访问控制台
# http://localhost:8848/nacos 账号/密码: nacos/nacos
# 3. 通过 API 注册服务
curl -X POST 'http://localhost:8848/nacos/v1/ns/instance' \
-d 'serviceName=order-service&ip=192.168.1.100&port=8080'
# 4. 查询服务实例
curl 'http://localhost:8848/nacos/v1/ns/instance/list?serviceName=order-service'
# 5. 发布配置
curl -X POST 'http://localhost:8848/nacos/v1/cs/configs' \
-d 'dataId=order-service.yaml&group=DEFAULT_GROUP&content=server.port: 8080'
集群部署
# cluster.conf(三节点集群)
192.168.1.10:8848
192.168.1.11:8848
192.168.1.12:8848
- 生产环境推荐 3 节点以上集群
- 使用 MySQL 持久化(替代默认内嵌 Derby)
- 前端可挂 Nginx 做负载均衡
- 配置变更通过 Raft 协议同步到所有节点
边界与常见误解
- 误解:Nacos 只是注册中心。 它同时是配置中心和 DNS 服务,功能比 Eureka 丰富得多。
- 误解:AP 和 CP 不能共存。 同一个 Nacos 集群中,不同类型的服务可以使用不同的一致性模式。
- 误解:临时实例和持久实例只是名称区别。 临时实例依赖客户端心跳,客户端下线即剔除;持久实例由服务端主动探测,客户端下线不会立即剔除。
- 边界:Nacos 2.x 的 gRPC 通信。 2.x 版本引入 gRPC 长连接替代 HTTP 短轮询,性能显著提升,但网络环境需要支持 gRPC。
- 边界:配置加密。 Nacos 控制台的配置默认明文存储,敏感信息(密码、密钥)需要额外加密处理。