什么是 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 差异 |
| 分布式事务 | Seata | AT/TCC/Saga 模式 |
| 链路追踪 | Micrometer Tracing + Zipkin/SkyWalking | TraceId 贯穿调用链 |
| 安全 | 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 等具体实现插进来。记住版本对齐与组件替代关系,比记住组件清单更有用。