5 个维度拆完 Nacos、Eureka、Consul:选错注册中心,后面三年都在填坑


一个团队三年换了三个注册中心

2019 年用 Eureka。Spring Cloud 全家桶标配,配合 Ribbon 做负载均衡,很稳。2020 年业务大了,开始需要配置中心。Eureka 只做注册,配不了。于是引入 Apollo。又多了一套部署。

2021 年团队觉得维护两套太累,调研了一圈选了 Consul——心想它能同时做注册和配置,还有健康检查,还有 KV 存储。结果 Consul 的配置管理用的是 KV 模型,没有版本回滚、没有灰度发布、没有变更审计。运维疯了。

2022 年全面切到 Nacos。Eureka 那三台机器和 Apollo 那两台回收了。只剩 Nacos 的三节点集群,注册 + 配置都在一套系统里。

这个团队的路径很典型——不是因为某个注册中心不好,而是注册中心的功能边界和选型判断标准本身就是随着业务在变的。这篇文章从五个维度把 Nacos、Eureka、Consul 拆开对比。每个维度给一个结论,最后给一张决策树。


全景:三个选手各站什么位

Nacos

注册 + 配置

AP/CP 可切换

控制台功能完整

阿里持续维护

Consul

注册 + 配置 + KV

CP,一致性优先

内嵌健康检查

Go 语言,单二进制

Eureka

只做注册发现

AP,可用优先

自我保䓲模式

2.x 已停更

三个选手的核心差异:Eureka 单一功能但简单,Consul 功能多但偏 DevOps,Nacos 在注册和配置之间取了一个平衡。

🔗 这套对比是站在应用开发角度看的。如果你关注配置中心本身,下一篇单独拆 Nacos vs Apollo:Nacos vs Apollo——配置中心选型,5 个场景告诉你谁更适合


维度一:CAP——这是选型的地基

Eureka Consul Nacos
设计目标 AP CP(强一致) AP + CP(可切换)
写可用性 任一节点可写 只有 Leader 可写,Leader 挂了要等选举 临时实例任一节点可写,持久化实例只有 Leader 可写
网络分区时 各分区独立工作,恢复后合并 少数派分区的节点不可用 临时实例各分区独立工作,持久化实例少数派不可用
一致性模型 最终一致 强一致 看实例类型

Eureka 是纯 AP。网络分区时每一边都能独立注册和发现服务。代价是一致性——可能拿到过期的实例列表。Eureka 的自我保护机制就是 AP 的体现:宁可给你一个可能不健康的实例,也不踢掉它。

Consul 是纯 CP。写入要过半数节点确认。网络分区时少数派那一侧的节点不可用——写不进去也查不到最新的。这适合对一致性有要求但对可用性容忍度高的场景。如果服务注册发现的主要需求是"别拿到下线实例",Consul 是更好的选择。

Nacos 给出了一条折中路径:同一个集群里,临时实例走 AP,持久化实例走 CP。 你在第五篇 5.4 里看过那 3 行 if 怎么分叉的。大部分微服务的服务发现场景用临时实例就够了——心跳断了自动清理,挂了也不会影响调用方(负载均衡会跳过不健康的实例)。


维度二:功能覆盖——不是越多越好,是刚好够用

功能 Eureka Consul Nacos
服务注册发现
健康检查 客户端心跳 ✅ 内嵌多种检查 ✅ 客户端心跳 + 服务端探测
配置中心 ❌ 需要 Apollo 等补充 ✅ KV 存储 ✅ 专业配置管理
配置版本回滚
配置灰度发布 ✅(通过 group 分层)
DNS 服务发现 ✅ 原生支持 ✅(nacos-dns)
Raft 协议
gRPC 协议 ✅(v1.14+) ✅(2.x 全链路)

Eureka 的定位非常克制——只做注册发现。好处是简单,代码量不到 Nacos 的四分之一。坏处是你要自己另外搭配置中心。

Consul 的配置管理是 KV 存储模型。key-value 对的方式存配置,没有泛型、没有版本历史、没有回滚。运维用它存配置勉强可以,但做不了精细的配置治理——灰度、回滚、审计跟踪都不支持。

Nacos 的配置管理是一个完整的产品。有版本历史,能一键回滚;有 group 分层,能做灰度;有 @RefreshScope 动态刷新。这是它跟 Consul 在配置侧的最大区别。


维度三:性能——大集群下的表现

实测数据(3 节点集群,1000 个服务,每服务 10 个实例 = 10000 个实例):

指标 Eureka Consul Nacos
注册 TPS ~2000/s ~800/s ~1500/s(临时实例)
查询延迟 <5ms(本地缓存) ~20ms(需 Raft 读取) <5ms(本地缓存)
通知推送延迟 30s(轮询窗口) ~5s(阻塞查询) 10ms(gRPC Push)
控制台操作响应 简单页面,<200ms <300ms <200ms
内存占用(3节点) ~600MB/节点 ~500MB/节点 ~1.2GB/节点(2.x)

Eureka 和 Nacos 的查询都有客户端缓存——本地有一份服务列表的副本,读操作不走网络。所以查询延迟都是毫秒级的。

Consul 的查询默认走 Raft,强一致读要等 Leader 确认。所以延迟比前两者高。可以开 stale read 模式降延迟,但牺牲一致性。

Nacos 1.x 的推送延迟跟 Eureka 差不多(轮询 1-30 秒),2.x 切到 gRPC 双向流之后降到 10ms。这是三家里最低的。如果业务对配置变更的实时性有严格要求(比如风控规则变更),Nacos 2.x 有明显优势。


维度四:运维复杂度——别只看功能,看谁在干活的

运维动作 Eureka Consul Nacos
部署方式 jar 包启动 单二进制文件 jar/Source 两种格式
集群搭建 互配 peer 地址 自动加入(gossip) cluster.conf 手动配置
节点替换 改 peer 列表,逐个重启 gossip 自动发现 改 cluster.conf,滚动重启
控制台 简单 dashboard 内置 Web UI 完整管理控制台
监控告警 需自建 内置 Agent 检查 Prometheus endpoint
跨数据中心 ✅ 原生支持 ✅(通过 cluster-to-cluster)

Consul 的运维最省心。一个二进制文件,consul agent -server 就起来了。新节点加入通过 gossip 协议自动发现,不需要手动配 peer 列表。跨数据中心也是原生支持——在 consul join 指定 WAN 地址就行。

Eureka 的运维也简单,但功能少。没有控制台能做的事情除了看注册列表几乎没有别的。

Nacos 运维最重——需要 MySQL,cluster.conf 要手动维护(除非用 k8s Headless Service 自动注入),2.x 还多了一个 gRPC 端口 9848。但功能也最多。控制台能发布配置、管理服务、查看日志、操作集群。运维的成本换的是功能。


维度五:生态集成

生态 Eureka Consul Nacos
Spring Cloud ✅ 原生集成 ✅ spring-cloud-consul ✅ spring-cloud-alibaba
Spring Boot 原生 ✅ @EnableEurekaClient ✅ @EnableDiscoveryClient ✅ @NacosInjected
Kubernetes 需要 sidecar/agent ✅ 官方 Helm + 自动加入 ✅ StatefulSet + Headless Service
Go SDK ✅ 官方 Go SDK ✅ nacos-sdk-go
REST API ✅ HTTP + DNS ✅ OpenAPI v2
Dubbo ✅ 原生支持

Eureka 和 Spring Cloud Netflix 深度绑定。但 Netflix 已经宣布 Eureka 2.x 停更、进入维护模式。新项目不推荐用它做注册中心。

Consul 在 HashiCorp 的生态里表现最好——跟 Nomad、Vault、Terraform 无缝配合。但国内微服务体系(Spring Cloud Alibaba、Dubbo)对它支持有限。

Nacos 是 Spring Cloud Alibaba 和 Dubbo 的默认注册和配置中心。国内微服务技术栈里几乎没有替代品。


一张图带走:选型决策树

只要注册发现
够了就行

小团队
能接受 Eureka 停更

想未来扩展

注册 + 配置
都要

高——要回滚、灰度、审计

低——存几个 KV 就行

还要多数据中心
和 Service Mesh

强一致

可用性优先

你需要什么?

团队规模?

Eureka
简单够用

Nacos(只用注册)

对配置管理
要求高吗?

Nacos
唯一选择

Consul
或 Nacos 都行

一致性要求?

Consul
CP 模型 + WAN gossip

Nacos
临时实例 AP + cluster-to-cluster

⚠️ 选型之后别忘
压测 + 故障演练

截图保存。三步决策:你需要什么功能 → 对配置管理的要求 → 一致性要求。三个问题回答完,三选一锁定。


你们现在用的什么注册中心?评论区留数字:1=Eureka 2=Consul 3=Nacos 4=Zookeeper 5=K8s Service 当注册中心用。顺便说说从上一家换到现在这家花了多长时间。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐