什么是 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/

面试考察点

  1. 框架全局认知:面试官不仅仅是想知道你背了几个组件名字,更是想知道你是否理解 Spring Cloud 在微服务架构中的定位——它是一个 "工具箱",而不是某一个具体技术。
  2. 技术选型能力:考察你是否了解 Spring Cloud 的版本演进,知道 Netflix 体系已逐步停更,Alibaba 体系是当前国内主流,能否说出它们之间的差异。
  3. 实战经验:如果你只是在简历上写了 "熟悉 Spring Cloud",却说不清各组件在生产环境怎么搭配使用,说明只是 "听说过" 而非 "用过"。

核心答案

Spring Cloud 是 Spring 官方提供的一套微服务架构工具集,它基于 Spring Boot 开发,为开发者提供了一整套开箱即用的微服务解决方案,包括服务注册与发现、配置管理、负载均衡、熔断降级、API 网关、分布式消息等。

一句话概括:Spring Cloud 不是某一个框架,而是一堆微服务组件的 "全家桶"

Spring Cloud 核心组件一览

功能领域Netflix 体系(第一代)Alibaba 体系(第二代)说明
服务注册与发现EurekaNacos管理服务的注册和发现
配置中心Spring Cloud ConfigNacos Config集中管理各服务配置
负载均衡RibbonSpring Cloud LoadBalancer客户端负载均衡
服务间调用FeignOpenFeign声明式 HTTP 客户端
熔断降级HystrixSentinel服务容错与流量控制
API 网关ZuulSpring 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 功能更强大:

能力HystrixSentinel
熔断降级
实时监控⚠️ 简单✅ 可视化 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 组件了。

面试高频追问

  1. Nacos 和 Eureka 有什么区别?
    • Nacos 支持 AP/CP 切换,Eureka 只有 AP;Nacos 同时支持注册中心和配置中心,Eureka 只有注册中心;Nacos 支持健康检查主动探测,Eureka 靠客户端心跳
  2. Gateway 和 Zuul 有什么区别?
    • Gateway 基于Netty + WebFlux 异步非阻塞模型,性能远高于 Zuul 1.x 的同步阻塞模型;Zuul 2.x 虽然也用了异步,但已不在 Spring Cloud 官方路线图内
  3. Sentinel 和 Hystrix 怎么选?
    • 新项目直接用 Sentinel,功能更全(流量控制、热点限流、系统保护),可视化 Dashboard 更完善,且持续维护
  4. 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 体系已逐步淘汰。面试时重点掌握各组件的原理、选型依据和实际使用经验。