Spring Cloud
Spring Cloud 是构建分布式系统和微服务架构的工具集合,基于 Spring Boot 提供服务注册与发现、配置中心、服务调用、网关、熔断限流、链路追踪等能力。它不是单个框架,而是一组围绕“服务治理”的组件组合,用来把多个独立应用连接成可维护、可观测、可演进的系统。
适用场景
- 多个服务需要独立开发、部署和扩缩容。
- 需要统一处理服务发现、配置、路由、鉴权、限流和容错。
- 需要治理服务间调用,例如负载均衡、超时、重试和熔断。
- 需要为微服务系统建立可观测、可维护的基础设施。
- 业务已经形成相对稳定的边界,团队具备自动化测试、发布和监控能力。
不建议过早使用的场景
- 系统规模较小,单体应用仍能快速交付。
- 团队还没有稳定的业务边界,拆分后接口会频繁变化。
- 缺少 CI/CD、日志、指标、告警和链路追踪等基础设施。
- 只是为了使用新技术,而不是为了解决独立交付、扩缩容或组织协作问题。
学习路线
建议先理解微服务架构和服务治理,再学习注册中心、配置中心、声明式调用和网关;随后补充熔断限流、链路追踪、消息驱动、部署和最佳实践。
学习时不要只看组件 API,更要关注组件解决的问题:地址如何发现、配置如何下发、调用如何失败、故障如何隔离、请求链路如何排查。
目录
常见架构图
上图体现了典型微服务系统的几类基础能力:入口层、业务服务、数据边界、服务治理、异步消息和可观测平台。
核心能力速览
| 能力 | 解决的问题 | 常见组件 | 使用要点 |
|---|---|---|---|
| 服务发现 | 实例地址动态变化,调用方不写死 IP | Nacos、Eureka、Consul | 服务名稳定,注册中心高可用,调用侧仍需超时和熔断 |
| 配置中心 | 多服务、多环境配置集中管理 | Nacos Config、Spring Cloud Config | 区分环境和命名空间,敏感配置加密,变更可审计 |
| 服务调用 | 服务间 HTTP 调用和负载均衡 | OpenFeign、Spring Cloud LoadBalancer | 明确接口契约,设置连接/读取超时,避免无限重试 |
| 服务网关 | 统一入口、路由、鉴权、限流 | Spring Cloud Gateway | 网关只做横切能力,不承载复杂业务逻辑 |
| 容错治理 | 下游故障不扩散到全站 | Resilience4j、Sentinel | 超时、限流、熔断、降级策略要一起设计 |
| 可观测性 | 分布式问题定位困难 | Micrometer、Prometheus、Zipkin、SkyWalking | 统一 traceId,日志、指标、链路追踪联动 |
| 消息驱动 | 削峰、解耦、最终一致性 | RabbitMQ、Kafka、RocketMQ | 关注幂等、重试、死信和消息积压 |
组件选型说明
| 场景 | 推荐关注点 | 说明 |
|---|---|---|
| 国内 Spring Cloud Alibaba 体系 | Nacos、Sentinel、RocketMQ | Nacos 同时覆盖注册发现和配置中心,落地成本低 |
| 传统 Netflix 体系迁移 | Eureka、OpenFeign、Gateway | Eureka 仍可维护存量系统,新项目需关注组件维护状态 |
| 多语言服务治理 | Consul、Kubernetes Service、Service Mesh | 不局限于 Java,适合多语言和平台化团队 |
| Kubernetes 原生部署 | Kubernetes Service、ConfigMap、Secret、Ingress/Gateway API | 可以减少外部注册中心依赖,但仍需服务治理和可观测能力 |
选型时优先看团队经验、生态兼容性、运维能力和已有基础设施,不要只比较单个组件的功能列表。
版本匹配提醒
Spring Cloud 强依赖 Spring Boot 版本,实际项目应使用官方 Spring Cloud Release Train 对应关系,并通过 BOM 统一管理版本。常见做法是在 Maven 中引入依赖管理:
<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>
</dependencies>
</dependencyManagement>注意事项:
- Spring Boot、Spring Cloud、Spring Cloud Alibaba 需要分别确认兼容矩阵。
- 不要手动混用多个发行列车中的组件版本。
- 升级前先在测试环境验证配置加载、注册发现、网关路由、Feign 调用和监控指标。
- 大版本升级通常会涉及配置项变更、包名变更或默认行为变化,应逐项核对 release notes。
简单示例
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@FeignClient(name = "user-service")
interface UserClient {
@GetMapping("/users/current")
String currentUser();
}
@RestController
class OrderController {
private final UserClient userClient;
OrderController(UserClient userClient) {
this.userClient = userClient;
}
@GetMapping("/orders/current-user")
String currentUser() {
return userClient.currentUser();
}
}说明:调用方只关心服务名 user-service 和接口契约,具体实例地址由服务发现和负载均衡处理。
常见问题
Spring Cloud 是否等于微服务?
不是。微服务是一种架构风格,Spring Cloud 是 Java/Spring 生态下实现服务治理的一组工具。即使使用了 Spring Cloud,如果服务边界混乱、数据库共享严重、发布流程不可控,也不能算健康的微服务架构。
有了注册中心还需要网关吗?
需要视场景而定。注册中心解决服务之间如何找到实例的问题,网关解决外部流量如何统一进入系统的问题。网关通常负责路由、鉴权、限流、跨域、灰度入口等横切能力。
拆成微服务后性能一定更好吗?
不一定。微服务会引入网络调用、序列化、链路追踪和运维开销。它主要提升独立交付、扩缩容和团队协作能力,不是默认的性能优化方案。
排查思路
| 现象 | 优先检查 |
|---|---|
| 服务调用失败 | 服务名是否正确、实例是否已注册、网络是否互通、调用超时是否过短 |
| 配置未生效 | 配置 DataId/Profile/命名空间是否匹配,应用是否启用远程配置 |
| 网关路由 404 | 路由谓词是否匹配、服务名是否大小写一致、注册中心是否有实例 |
| 偶发超时 | 下游延迟、连接池、线程池、重试放大、数据库慢查询 |
| 线上问题难定位 | traceId 是否贯穿日志,指标和链路追踪是否完整采集 |
生产注意事项
- 微服务不是默认选择,单体应用能满足需求时不要过早拆分。
- 注册中心、配置中心、网关、消息队列都属于关键基础设施,需要高可用部署和备份策略。
- 所有远程调用都应设置超时,重要链路要有熔断、限流和降级方案。
- 配置变更、网关规则、限流规则需要审计和回滚能力。
- 统一日志格式、traceId、指标命名和告警规则,避免每个服务各自为政。
- 服务拆分后会引入网络延迟、分布式事务、链路排查和运维复杂度,需要通过自动化和可观测能力抵消复杂度。
