Spring Cloud 组件全景与注册中心原理

微服务面试的第一类问题通常很基础:Spring Cloud 有哪些核心组件?服务注册和发现是什么意思?Eureka 和 Nacos 有什么区别?这类题不难,但很容易因为概念混在一起而答乱。

一句话先收住主线:Spring Cloud 不是一个单独框架,而是一套微服务治理组件集合;注册中心解决"服务在哪里"的问题,负载均衡和远程调用解决"怎么调用"的问题,熔断降级和网关解决"调用链如何保护和入口如何治理"的问题。


客户端请求
Gateway

统一入口
业务微服务
Feign

远程调用
Ribbon

负载均衡
注册中心

Eureka / Nacos
返回服务实例列表
选择一个实例
调用服务提供者
Hystrix / Sentinel

熔断降级保护

Spring Cloud 五大组件怎么答

传统 Spring Cloud 常说五大组件:

组件 作用 一句话记忆
Eureka 注册中心 服务注册、服务发现、服务心跳
Ribbon 负载均衡 从多个实例里选一个调用
Feign 远程调用 像调用本地接口一样调用远程服务
Hystrix 服务熔断 下游异常时快速失败或走降级
Zuul / Gateway 网关 统一入口、路由、鉴权、限流

如果项目使用 Spring Cloud Alibaba,可以把回答自然替换成:

能力 常见组件
注册中心 / 配置中心 Nacos
负载均衡 Ribbon 或 Spring Cloud LoadBalancer
服务调用 OpenFeign
服务保护 Sentinel
服务网关 Spring Cloud Gateway

面试里不要把组件背成清单就停。更好的回答是补一句:这些组件围绕服务调用链协作,注册中心提供实例信息,Feign 发起调用,Ribbon 做负载均衡,Gateway 管入口,Hystrix 或 Sentinel 做故障保护。

服务注册和发现是什么意思

在单体项目里,模块之间通常是进程内方法调用。到了微服务,服务被拆成多个进程,甚至部署在不同机器上。调用方必须知道被调用服务有哪些实例、IP 和端口是什么、哪些实例还健康。

注册中心就负责这件事:
是
否
服务提供者启动
向注册中心注册

服务名、IP、端口
定时发送心跳
服务消费者
从注册中心拉取

服务实例列表
本地缓存服务列表
负载均衡选择实例
发起远程调用
心跳是否超时
注册中心剔除实例
实例保持可用

可以拆成三个动作:

  1. 服务注册:服务提供者启动后,把服务名、IP、端口等信息注册到注册中心。
  2. 服务发现:服务消费者从注册中心拉取服务列表,再通过负载均衡选择一个实例调用。
  3. 服务监控:服务提供者定时发送心跳,注册中心根据心跳判断实例是否健康。

注册中心不是流量入口

这里有一个新手很容易混的点:注册中心不负责转发业务请求。

Nginx 或 Gateway 是流量入口,请求会真实经过它们;注册中心更像一个"服务通讯录",保存服务名、IP、端口、健康状态。消费者调用服务时,先从注册中心拿到通讯录,再自己选择实例发起请求。
服务消费者
注册中心

查询服务实例
返回 IP 和端口列表
消费者本地负载均衡
直接调用服务提供者
外部请求
Gateway / Nginx
转发真实业务流量

所以面试里如果问注册中心的作用,不要说"转发请求"。更准确的说法是:保存服务实例信息,提供服务发现和健康检测能力。

Eureka 的工作流程

Eureka 的典型流程是:

  1. user-service 启动后,把 localhost:8081、localhost:8082 等实例信息注册到 Eureka。
  2. order-service 作为消费者,从 Eureka 拉取 user-service 的实例列表。
  3. order-service 本地缓存服务列表。
  4. 发起调用时,Ribbon 根据负载均衡规则选择一个实例。
  5. 服务提供者每 30 秒向 Eureka 发送一次心跳。
  6. Eureka 如果 90 秒没有收到某个实例的心跳,就会把它剔除。

Eureka 的设计更偏 AP:优先保证服务可用,即使短时间内服务列表不是绝对最新,也尽量让系统继续对外提供服务。

Nacos 的工作流程

Nacos 也支持服务注册、服务发现和健康检测,但它比 Eureka 多了几个能力:

  • 支持临时实例和非临时实例。
  • 临时实例通过心跳检测,心跳异常会被剔除。
  • 非临时实例由 Nacos 主动探测,异常时不会直接剔除。
  • 支持服务列表变更推送,消费者可以更快感知实例变化。
  • 同时支持配置中心。

临时实例和非临时实例可以这样理解:

实例类型 健康检测方式 异常后怎么处理 适合场景
临时实例 服务主动心跳 心跳异常会被剔除 普通微服务实例,随时可能扩缩容
非临时实例 Nacos 主动探测 异常时标记不健康,但不会直接剔除 固定服务、重要基础设施、需要人工确认的实例

大多数业务微服务用临时实例就够了。非临时实例更像"这个实例即使暂时不可用,也不要从注册表里直接消失",适合更稳定、更受控的服务。

Nacos 和 Eureka 怎么对比

对比点 Eureka Nacos
核心能力 注册中心 注册中心 + 配置中心
服务发现 消费者拉取服务列表 拉取 + 服务端推送变更
健康检测 服务提供者心跳 临时实例心跳,非临时实例主动探测
异常实例处理 心跳超时剔除 临时实例剔除,非临时实例保留
CAP 倾向 AP 默认 AP,非临时实例场景可偏 CP

项目回答时可以这样落地:

我们项目里使用 Nacos 作为注册中心和配置中心。服务启动后会把服务名、IP、端口注册到 Nacos,消费者通过服务名拉取实例列表,并结合负载均衡发起调用。Nacos 相比 Eureka,除了服务注册发现,还支持配置中心;服务列表变化时也支持推送,更新更及时。

面试回答模板

可以这样答:

Spring Cloud 常见核心组件包括 Eureka 注册中心、Ribbon 负载均衡、Feign 远程调用、Hystrix 熔断降级、Gateway 或 Zuul 网关。服务注册是服务提供者启动后把服务名、IP、端口注册到注册中心;服务发现是消费者从注册中心拉取服务列表,再通过负载均衡选择一个实例发起调用。Eureka 通过心跳做健康检测,服务 90 秒没有心跳会被剔除。Nacos 也支持注册发现,并且支持配置中心、服务变更推送、临时实例和非临时实例,功能更丰富。

小结

这篇文章只需要抓住一条线:

服务提供者注册 -> 消费者发现 -> 负载均衡选择实例 -> 远程调用 -> 心跳维持健康状态。

Spring Cloud 的组件很多,但面试里先把服务调用链讲清楚,就不容易散。

相关推荐
IT规划师17 小时前
一文讲透五种发布机制:滚动、蓝绿、金丝雀、红黑与 AB
后端·面试
SL_staff18 小时前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
一条Go18 小时前
两套权限目录,三重闸门:Alioth 的多租户 RBAC 为什么这么拧
后端·程序员·github
Tokenfree19 小时前
把多模态 OCR 接进业务系统:四千张运单,三个坑
后端
用户8593130613519 小时前
我给 AI Agent 写了个下载器:293KB 的网页,不再吃掉 7 万 token
后端
phil619 小时前
沙箱核心功能系列 06:编排调度与资源管理
后端
小兔子19 小时前
if (system(cmd) != 0) 判不出命令失败:它返回的是等待状态,不是退出码
后端
艾迪的技术之路19 小时前
16k 条慢查询,128 张分表,我这么解决
后端·github
dpharness19 小时前
我踩过的四个记忆坑,从预算到换机
前端·后端
加宝的起点雷达19 小时前
三个定时任务被删那天,系统一声不吭
人工智能·后端