什么是 Spring Cloud,它有哪些组件?

#Java#面试八股

什么是 Spring Cloud,它有哪些组件?

结论先行:Spring Cloud 不是单个框架,而是一套微服务开发的基础设施规范与集成:它把注册中心、配置中心、网关、负载均衡、声明式调用、熔断限流、消息总线、链路追踪等能力,用 Spring Boot 的自动配置统一封装,让你用注解和少量配置就能搭起微服务体系。

1. 它解决的是「胶水」问题

              ┌──────────── Spring Cloud ────────────┐
业务代码  ──▶ │ 统一抽象(DiscoveryClient、LoadBalancer、│ ──▶ 具体实现
              │  ConfigData、Gateway Filter…)         │     (Nacos、Eureka、
              └───────────────────────────────────────┘      Consul、ZooKeeper)

同一套业务代码,换注册中心只需要换依赖和配置,这是 Spring Cloud 最大的价值:面向接口编程,实现可替换。

2. 核心组件(以 Spring Cloud Alibaba 为主)

能力组件说明
服务注册与发现Nacos Discovery / Eureka / Consul实例上下线、健康检查
配置中心Nacos Config / Spring Cloud Config配置集中管理、动态刷新
客户端负载均衡Spring Cloud LoadBalancer替代已停更的 Ribbon
声明式调用OpenFeign接口 + 注解即可发起 HTTP 调用
API 网关Spring Cloud Gateway路由、鉴权、限流、灰度
熔断限流Sentinel / Resilience4j替代已停维的 Hystrix
消息驱动Spring Cloud Stream屏蔽 Kafka/RocketMQ 差异
分布式事务SeataAT/TCC/Saga 模式
链路追踪Micrometer Tracing + Zipkin/SkyWalkingTraceId 贯穿调用链
安全Spring Cloud Security / OAuth2网关统一鉴权

3. 版本与依赖

Spring Cloud 采用「发布列车」版本命名(如 2023.0.x,代号 Leyton),必须与 Spring Boot 版本对齐,否则启动即报兼容性错误。

<properties>
    <spring-boot.version>3.2.4</spring-boot.version>
    <spring-cloud.version>2023.0.1</spring-cloud.version>
    <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

4. 一个完整调用示例

@SpringBootApplication
@EnableFeignClients
public class OrderApplication { }

@FeignClient(name = "stock-service", fallbackFactory = StockFallbackFactory.class)
public interface StockClient {
    @GetMapping("/stock/{skuId}")
    StockVO get(@PathVariable("skuId") Long skuId);
}

@RestController
@RequiredArgsConstructor
public class OrderController {

    private final StockClient stockClient;

    @GetMapping("/orders/{skuId}")
    public String create(@PathVariable Long skuId) {
        StockVO stock = stockClient.get(skuId);   // 走注册中心 + 负载均衡
        return stock.getAvailable() > 0 ? "ok" : "sold out";
    }
}
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000
            read-timeout: 3000

5. Netflix 组件的退场

原组件状态替代
Eureka 2.x停止开发Nacos / Consul / Eureka 1.x 仍可用
Ribbon维护模式Spring Cloud LoadBalancer
Hystrix停止维护Sentinel / Resilience4j
Zuul 1维护模式Spring Cloud Gateway
Archaius停止维护Spring Cloud Config / Nacos

新项目不应再引入 Netflix 全家桶,除非有历史包袱。

6. 常见追问

追问一:Spring Cloud 和 Spring Cloud Alibaba 是什么关系? Spring Cloud 是标准与抽象(spring-cloud-commons 定义 DiscoveryClient、LoadBalancerClient);Spring Cloud Alibaba 是基于该标准、面向阿里中间件(Nacos、Sentinel、Seata、RocketMQ)的实现集合。二者是「接口与实现」的关系。

追问二:不引入注册中心,Feign 还能用吗? 能,@FeignClient(url = "http://ip:port") 直接指定地址,跳过服务发现。但这只适合调试或调用外部服务。

追问三:Spring Cloud 与 Kubernetes 冲突吗? 不冲突。K8s 提供 Service/DNS 做服务发现,Spring Cloud 可用 spring-cloud-kubernetes 接入;也可只用 K8s 做编排,注册与配置仍交给 Nacos。

追问四:版本怎么对齐? 以官方兼容性表为准:Spring Boot 3.2.x ↔ Spring Cloud 2023.0.x ↔ Spring Cloud Alibaba 2023.0.1.x。不要凭感觉升级,跨大版本通常伴随 Jakarta 包名迁移。

追问五:组件这么多,必须全上吗? 不必。小系统只需要「注册中心 + 配置中心 + 网关 + Feign」,熔断、链路追踪可以后补。组件越多,运维与排障成本越高。

小结

Spring Cloud 的定位是微服务的标准库与集成层:它不发明协议,而是把注册、配置、调用、网关、容错这些通用能力抽象成 Spring 风格的编程模型,再让 Nacos、Sentinel、Gateway 等具体实现插进来。记住版本对齐与组件替代关系,比记住组件清单更有用。

笔记加载中…