什么是 Spring Cloud,它有哪些组件?
一则或许对你有用的小广告
欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于
Spring AI + Spring Boot3.x + JDK 21..., 点击查看; - 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot3.x + JDK 17..., 点击查看项目介绍; 演示链接: http://116.62.199.48:7070/; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
面试考察点
- 框架全局认知:面试官不仅仅是想知道你背了几个组件名字,更是想知道你是否理解 Spring Cloud 在微服务架构中的定位——它是一个 "工具箱",而不是某一个具体技术。
- 技术选型能力:考察你是否了解 Spring Cloud 的版本演进,知道 Netflix 体系已逐步停更,Alibaba 体系是当前国内主流,能否说出它们之间的差异。
- 实战经验:如果你只是在简历上写了 "熟悉 Spring Cloud",却说不清各组件在生产环境怎么搭配使用,说明只是 "听说过" 而非 "用过"。
核心答案
Spring Cloud 是 Spring 官方提供的一套微服务架构工具集,它基于 Spring Boot 开发,为开发者提供了一整套开箱即用的微服务解决方案,包括服务注册与发现、配置管理、负载均衡、熔断降级、API 网关、分布式消息等。
一句话概括:Spring Cloud 不是某一个框架,而是一堆微服务组件的 "全家桶"。
Spring Cloud 核心组件一览
| 功能领域 | Netflix 体系(第一代) | Alibaba 体系(第二代) | 说明 |
|---|---|---|---|
| 服务注册与发现 | Eureka | Nacos | 管理服务的注册和发现 |
| 配置中心 | Spring Cloud Config | Nacos Config | 集中管理各服务配置 |
| 负载均衡 | Ribbon | Spring Cloud LoadBalancer | 客户端负载均衡 |
| 服务间调用 | Feign | OpenFeign | 声明式 HTTP 客户端 |
| 熔断降级 | Hystrix | Sentinel | 服务容错与流量控制 |
| API 网关 | Zuul | Spring Cloud Gateway | 统一入口、路由转发 |
| 分布式事务 | — | Seata | 跨服务事务一致性 |
重要趋势:Netflix OSS 体系(Eureka、Hystrix、Zuul 等)已逐步停更维护,国内企业目前主流采用 Spring Cloud Alibaba 体系。
深度解析
一、Spring Cloud 整体架构
上图展示了 Spring Cloud 微服务的典型架构。整体分为以下几个层次:
- 接入层:API 网关作为统一入口,负责路由转发、身份认证、限流等
- 服务层:各个微服务独立部署,拥有各自的数据库,服务间通过 OpenFeign 或消息队列通信
- 治理层:注册中心、配置中心、熔断降级等基础设施组件,保障服务的高可用
关键点在于,各微服务启动时会将自己的地址注册到注册中心,调用方通过注册中心获取目标服务地址,再由负载均衡器选择一个实例发起调用。
二、各核心组件详解
1. Nacos —— 注册中心 + 配置中心(二合一)
Nacos 是 Spring Cloud Alibaba 体系中最核心的组件,同时承担了服务注册发现和配置管理两个职责。
服务注册发现的工作流程:
- 服务启动时,向 Nacos 注册自己的 IP 和端口
- 消费者从 Nacos 拉取服务列表,并缓存到本地
- Nacos 通过心跳机制检测服务健康状态,不健康的服务自动剔除
- 支持临时实例(客户端心跳)和持久实例(服务端主动探测)
配置中心的工作流程:
- 将
application.yml中的配置迁移到 Nacos 控制台管理 - 支持按
Data ID+Group+Namespace隔离配置 - 配置变更后,通过长轮询机制实时推送到客户端
# bootstrap.yml — Nacos 配置示例
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # 注册中心地址
config:
server-addr: 127.0.0.1:8848 # 配置中心地址
file-extension: yaml # 配置文件格式
namespace: dev # 环境隔离
2. OpenFeign —— 声明式服务调用
OpenFeign 让你像调用本地方法一样调用远程服务,底层封装了 HTTP 请求、负载均衡、序列化等细节。
// 1. 定义 Feign 客户端接口
@FeignClient(name = "product-service", fallback = ProductFallback.class)
public interface ProductClient {
@GetMapping("/api/product/{id}")
Product getProduct(@PathVariable("id") Long id);
@PostMapping("/api/product/deduct")
Boolean deductStock(@RequestBody DeductRequest request);
}
// 2. 降级处理类
@Component
public class ProductFallback implements ProductClient {
@Override
public Product getProduct(Long id) {
// 降级逻辑:返回默认商品信息
return new Product(id, "默认商品", 0.0);
}
@Override
public Boolean deductStock(DeductRequest request) {
return false;
}
}
// 3. 在订单服务中像调本地方法一样使用
@Service
public class OrderService {
@Autowired
private ProductClient productClient;
public Order createOrder(Long productId) {
// 直接调用,OpenFeign 自动完成 HTTP 请求
Product product = productClient.getProduct(productId);
// ... 创建订单逻辑
}
}
3. Spring Cloud Gateway —— API 网关
Gateway 基于 WebFlux(响应式编程)构建,性能远超老一代的 Zuul。核心功能:
- 路由转发:根据 URL 路径将请求转发到对应的微服务
- 过滤器链:统一处理鉴权、日志、限流等横切关注点
- 负载均衡:集成 LoadBalancer,自动分发请求
# Gateway 路由配置示例
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service # lb:// 表示从注册中心获取服务实例
predicates:
- Path=/order/** # 匹配 /order/ 开头的请求
filters:
- StripPrefix=1 # 去掉路径前缀
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
4. Sentinel —— 熔断降级与流量控制
Sentinel 是 Alibaba 开源的高可用流量控制组件,比 Hystrix 功能更强大:
| 能力 | Hystrix | Sentinel |
|---|---|---|
| 熔断降级 | ✅ | ✅ |
| 实时监控 | ⚠️ 简单 | ✅ 可视化 Dashboard |
| 流量控制 | ❌ | ✅ QPS 限流、线程数限流 |
| 热点参数限流 | ❌ | ✅ |
| 系统自适应保护 | ❌ | ✅ |
| 维护状态 | ❌ 已停更 | ✅ 持续维护 |
核心概念:
- 流量控制:限制 QPS 或并发线程数,防止服务被压垮
- 熔断降级:当服务调用失败率或响应时间超过阈值,自动熔断,快速失败
- 系统保护:根据系统负载(CPU、RT、线程数)自适应限流
5. Seata —— 分布式事务
Seata 提供 AT、TCC、Saga、XA 四种事务模式,最常用的是 AT 模式(自动补偿)。
// 使用 @GlobalTransactional 注解开启分布式事务
@Service
public class OrderService {
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
public void createOrder(Order order) {
// 1. 本地:创建订单
orderMapper.insert(order);
// 2. 远程:扣减库存(Feign 调用)
productClient.deductStock(order.getProductId(), order.getCount());
// 3. 远程:扣减账户余额(Feign 调用)
accountClient.deduct(order.getUserId(), order.getTotalAmount());
// 任一步骤失败,Seata 自动回滚所有操作
}
}
三、Netflix 体系 vs Alibaba 体系
| 对比维度 | Netflix 体系 | Alibaba 体系 |
|---|---|---|
| 服务注册 | Eureka(AP,已停更) | Nacos(AP/CP 可切换) |
| 配置中心 | Config(需 Git 仓库) | Nacos(自带存储,支持动态推送) |
| 负载均衡 | Ribbon(已移除) | LoadBalancer |
| 熔断降级 | Hystrix(已停更) | Sentinel(活跃维护) |
| 网关 | Zuul(已停更) | Gateway |
| 分布式事务 | 无 | Seata |
| 维护状态 | 大部分停更 | 持续迭代 |
| 国内使用率 | 逐渐降低 | 主流选择 |
结论:新项目直接上 Spring Cloud Alibaba 体系,不要再纠结 Netflix 组件了。
面试高频追问
- Nacos 和 Eureka 有什么区别?
- Nacos 支持 AP/CP 切换,Eureka 只有 AP;Nacos 同时支持注册中心和配置中心,Eureka 只有注册中心;Nacos 支持健康检查主动探测,Eureka 靠客户端心跳
- Gateway 和 Zuul 有什么区别?
- Gateway 基于Netty + WebFlux 异步非阻塞模型,性能远高于 Zuul 1.x 的同步阻塞模型;Zuul 2.x 虽然也用了异步,但已不在 Spring Cloud 官方路线图内
- Sentinel 和 Hystrix 怎么选?
- 新项目直接用 Sentinel,功能更全(流量控制、热点限流、系统保护),可视化 Dashboard 更完善,且持续维护
- Spring Cloud 和 Dubbo 有什么区别?
- Spring Cloud 是完整微服务工具箱(覆盖网关、配置、事务等),Dubbo 专注于 RPC 调用;Spring Cloud 用 HTTP REST 通信,Dubbo 用自定义 TCP 协议,性能更高但跨语言支持差
常见面试变体
- "Spring Cloud 的核心组件有哪些?各自的作用是什么?"
- "Spring Cloud Alibaba 和 Spring Cloud Netflix 的区别?"
- "你们项目中用了 Spring Cloud 的哪些组件?为什么这么选?"
- "Nacos 既能做注册中心又能做配置中心,有什么优势?"
记忆口诀
六大组件一句话:注册(Nacos)、配置(Nacos)、调用(Feign)、网关(Gateway)、熔断(Sentinel)、事务(Seata)
"注配置、调网熔事" —— 注册和配置用 Nacos,调用用 Feign,网关用 Gateway,熔断用 Sentinel,事务用 Seata。
总结
Spring Cloud 是一套基于 Spring Boot 的微服务工具集,核心组件涵盖服务注册发现(Nacos)、配置管理(Nacos Config)、服务间调用(OpenFeign)、API 网关(Gateway)、熔断降级(Sentinel)和分布式事务(Seata)。当前主流采用 Spring Cloud Alibaba 体系,Netflix 体系已逐步淘汰。面试时重点掌握各组件的原理、选型依据和实际使用经验。