Nacos

Nacos 是阿里巴巴开源的服务发现与配置管理平台,支持 AP/CP 可切换的微服务基础设施。

#tech / ops / microservice #type / concept #status / growing

[!info] related notes

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 对比

维度NacosEurekaConsul
开发商阿里巴巴NetflixHashiCorp
一致性AP/CP 可切换AP(最终一致)CP(Raft)
配置管理内置无(需 Spring Cloud Config)内置(KV Store)
健康检查客户端心跳 + 服务端探测客户端心跳服务端探测 + 客户端心跳
管理界面完善的 Web 控制台简单仪表盘Web UI
多数据中心支持不支持支持
社区活跃度高(国内主流)维护模式活跃
语言生态Java/Go/PythonJava 为主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 控制台的配置默认明文存储,敏感信息(密码、密钥)需要额外加密处理。
创建于 2025/1/1 更新于 2026/5/27