17370845950

Java面试——Nacos与Eureka注册中心的区别
Nacos 能替代 Eureka,关键在于支持 AP/CP 模式动态切换:ephemeral=false 时基于 Raft 实现强一致,而 Eureka 是纯 AP 且已停止维护;Nacos 还具备配置中心、多协议服务发现、权重路由、JSON 元数据等云原生能力。

为什么 Nacos 能替代 Eureka?关键在 AP/CP 模式可切换

Eureka 是纯 AP 模型,网络分区时宁可返回过期数据也不拒绝请求;Nacos 默认是 AP,但只要把服务注册时的 ephemeral=false,它就自动切到 CP 模式——此时依赖 Raft 协议强一致写入,适合配置中心或强一致性要求的场景(比如权限服务、计费服务)。Eureka 没有这个开关,2.0 已停止维护,连切模式的余地都没有。

  • 临时实例(ephemeral=true):Nacos 用心跳 + 延迟剔除(默认 15s 无心跳标记不健康,再 30s 后剔除),行为接近 Eureka,但支持自定义超时参数
  • 持久实例(ephemeral=false):Nacos 要求所有节点写入成功才返回注册成功,牺牲部分可用性换一致性
  • Eureka 的“自我保护模式”本质是妥协:当心跳失败率 >85% 时,它会暂停剔除,但缓存里可能长期留着已宕机的实例——调用方得靠 Ribbon 重试+熔断兜底

配置中心能力:Eureka 做不到,Nacos 一行配置就启用

Eureka 只管服务地址列表,改个数据库连接串还得重启服务;Nacos 天然带配置中心,spring-cloud-starter-alibaba-nacos-config 引入后,加几行配置就能实现运行时刷新 @Value@ConfigurationProperties

  • 必须配 spring.cloud.nacos.config.server-addr,否则启动报 No spring.config.import property found
  • 配置变更后,Nacos Client 通过长轮询(不是 WebSocket)监听变更,延迟通常在 300ms 内
  • Eureka 完全没配置管理模块,硬要集成得额外搭 Spring Cloud Config + Git + Bus,链路长、故障点分散

端口冲突和启动失败:90% 的 Nacos 初学者卡在这两步

Nacos Server 默认占 8848(HTTP API)、9848(gRPC 端口,2.0+ 必须开启),而 Eureka 默认只用 10086。很多人直接双击 startup.cmd 启动失败,却只盯着日志里的 “Failed to bind to port”,忽略真正原因。

  • 检查 conf/application.properties 是否被改乱:重点看 server.portnacos.core.auth.enabled(v2.2+ 默认开启鉴权,首次访问需登录 nacos/nacos
  • Windows 下双击 startup.cmd 闪退?打开 CMD 手动执行它,错误会留在窗口里——常见是 JDK 版本不对(Nacos 2.2+ 要 JDK 11+)或 JAVA_HOME 没设对
  • Eureka 启动失败多因 eureka.client.register-with-eureka=false 漏配,导致 Server 自己去注册自己,无限重试
# 修改 Nacos 端口示例(conf/application.properties)
server.port=9090
nacos.core.rpc.port=9849

服务发现时的 DNS 兼容性差异:别等上线才踩坑

Eureka 只支持 HTTP 接口拉取服务列表,客户端必须引入 spring-cloud-starter-netflix-eureka-client;Nacos 支持 HTTP + DNS + gRPC 三种协议,其中 DNS 模式允许非 Java 服务(如 Go、Python)用标准 dig 命令查服务——这对混合技术栈团队很关键。

  • Eureka 的服务名是大小写敏感的(user-serviceUser-Service),Nacos 默认转小写归一化处理,更宽容
  • Nacos 支持权重路由:curl -X PUT 'http://localhost:8848/nacos/v1/ns/instance?serviceName=user&ip=192.168.1.100&port=8080&weight=0.1',Eureka 没这能力,得靠外部 LB 实现
  • Eureka 的元数据(metadata)只能塞字符串,Nacos 支持 JSON 结构体,方便传标签、灰度标识、版本号等复杂信息

Nacos 和 Eureka 不是简单“功能多 vs 功能少”的关系,而是架构定位不同:Eureka 是单点服务发现组件,Nacos 是面向云原生的服务基础设施。选型时别只看“能不能用”,要看你是否需要配置热更新、多语言互通、跨机房容灾——这些地方,Eureka 的缺失不是靠加中间件能补上的。