跳到主要内容

Spring Cloud 教程

欢迎学习 Spring Cloud。本教程将从微服务架构的基础概念开始,带你逐步掌握 Spring Cloud 的核心组件和实战技能。

从单体到微服务:架构演进之路

在深入 Spring Cloud 之前,理解软件架构的演进历程非常重要。这能帮助我们明白为什么需要微服务,以及 Spring Cloud 如何解决这些问题。

单体架构

早期的企业应用通常采用单体架构。整个应用打包成一个部署单元,所有功能模块都运行在同一个进程中。

单体架构的优势在于开发简单、部署方便、调试容易。小团队在项目初期可以快速迭代。但随着业务增长,单体架构的缺点逐渐暴露:代码量膨胀导致编译部署缓慢,一个小改动需要重新发布整个应用,技术栈被锁定难以升级,团队协作时代码冲突频繁,系统扩展只能整体扩容无法针对性扩展。

垂直架构

为了解决单体架构的问题,出现了垂直架构。将系统按业务拆分成多个独立应用,每个应用可以独立开发、部署和扩展。

垂直架构在一定程度上解决了单体架构的问题,但带来了新的挑战:应用之间可能存在重复的功能模块,数据需要跨应用同步,接口调用方式不统一,分布式事务处理复杂。

SOA 架构

面向服务架构(SOA)进一步将应用拆分为可重用的服务。服务之间通过企业服务总线(ESB)进行通信,ESB 负责服务路由、协议转换、数据转换等工作。

SOA 架构实现了服务的松耦合,提高了系统的灵活性。但 ESB 往往变得臃肿和复杂,成为系统的性能瓶颈和单点故障源。服务的粒度划分也需要经验,过粗达不到解耦目的,过细则增加通信开销。

微服务架构

微服务架构可以看作是 SOA 的轻量化演进。每个微服务都是一个独立的业务单元,拥有自己的数据库和业务逻辑,通过轻量级通信机制(通常是 REST API)协作。

微服务架构的核心特征包括:服务粒度小,每个服务只做一件事;独立部署,服务之间互不影响;去中心化,没有中心化的 ESB;技术多样性,每个服务可以选择最适合的技术栈;故障隔离,一个服务故障不会导致整个系统崩溃。

Spring Cloud 是什么

Spring Cloud 是 Spring 官方提供的分布式系统开发工具包。它将分布式系统中的通用模式抽象成组件,让开发者可以快速构建可靠的微服务系统。

简单来说,Spring Boot 负责构建单个微服务,Spring Cloud 负责协调多个微服务之间的协作。打个比方,如果把微服务比作乐队中的乐手,Spring Boot 让每个乐手能独立演奏,Spring Cloud 则是指挥家,协调所有乐手合奏出和谐的乐曲。

Spring Cloud 解决什么问题

构建微服务系统需要解决一系列分布式系统问题。服务发现解决服务实例动态变化时的寻址问题,配置管理解决多环境配置的统一管理,负载均衡解决请求如何分发到多个实例,断路器解决服务故障时的容错处理,API 网关解决统一入口和跨切面问题,分布式追踪解决跨服务调用的问题定位。

Spring Cloud 为这些问题提供了成熟的解决方案。更重要的是,这些组件可以独立使用,按需组合,没有强依赖关系。

Spring Cloud 架构全景

Spring Cloud 是一个庞大的生态系统,包含多个子项目。理解这些项目的关系和职责,才能正确选择和使用。

核心组件概览

Spring Cloud 的核心组件可以按功能划分为几个领域。服务治理包括 Eureka(服务注册与发现)、Consul、Zookeeper、Nacos 等组件。配置管理包括 Spring Cloud Config、Nacos Config、Apollo 等。服务调用包括 OpenFeign、RestTemplate 等。负载均衡包括 Spring Cloud LoadBalancer(替代已停止维护的 Ribbon)。容错处理包括 Sentinel、Resilience4j 等。API 网关主要是 Spring Cloud Gateway。消息驱动包括 Spring Cloud Stream。分布式追踪包括 Micrometer Tracing 等。

组件协作关系

一个典型的 Spring Cloud 微服务系统包含以下角色协作:服务提供者启动时向注册中心注册自己的地址,服务消费者从注册中心获取服务地址列表,负载均衡器选择一个实例发起调用,断路器监控调用状态并在故障时熔断,配置中心统一管理各服务的配置,网关作为统一入口处理路由和鉴权。

Spring Cloud 与其他方案对比

Spring Cloud vs Dubbo

Dubbo 是阿里巴巴开源的 RPC 框架,在国内有广泛使用。两者有一些关键区别。

通信协议方面,Dubbo 使用高性能的 RPC 协议(如 Dubbo 协议),适合内部服务调用;Spring Cloud 基于 HTTP REST,更通用但性能稍低。服务治理方面,Dubbo 侧重 RPC 调用的优化,Spring Cloud 提供更完整的微服务生态。学习曲线方面,Dubbo 配置相对简单但生态较小,Spring Cloud 组件多但学习成本较高。

实际上两者可以融合使用,Spring Cloud Alibaba 项目就整合了 Dubbo,可以在 Spring Cloud 体系中使用 Dubbo 进行服务调用。

Spring Cloud vs Kubernetes

Kubernetes 提供了服务发现、负载均衡等能力,与 Spring Cloud 有功能重叠。但两者的定位不同:Kubernetes 侧重基础设施层面的服务治理,Spring Cloud 侧重应用层面的微服务模式。

在云原生架构中,两者通常是互补关系。Kubernetes 提供 Pod 管理、服务发现、滚动升级等能力,Spring Cloud 提供配置管理、熔断降级、分布式追踪等应用层能力。Spring Cloud Kubernetes 项目让 Spring Cloud 可以直接使用 Kubernetes 的服务发现和配置能力。

版本选择与兼容性

Spring Cloud 的版本管理比较特殊,采用"发布列车"(Release Train)机制。每个版本列车包含多个子项目的特定版本组合,确保组件之间的兼容性。

版本命名规则

Spring Cloud 使用伦敦地铁站名作为版本代号,按字母顺序依次命名。从 2020 年开始,版本命名改为年份形式,如 2020.0.x(代号 Ilford)、2021.0.x(代号 Jubilee)等。最新的版本命名规则如下:

版本系列代号Spring Boot 版本JDK状态
2025.1.xOakwood4.0.x21+最新
2025.0.xNorthfields3.5.x17+维护中
2024.0.xMoorgate3.4.x17+维护中
2023.0.xLeyton3.3.x, 3.2.x17+维护中
2022.0.xKilburn3.0.x, 3.1.x17+EOL
2021.0.xJubilee2.6.x, 2.7.x8+EOL

注意:2020.0.x(Ilford)、2021.0.x(Jubilee)、2022.0.x(Kilburn)已达到生命周期终点(EOL),不再受支持。建议新项目使用 2024.0.x 或更新版本。

版本选择的原则是新项目建议使用最新稳定版,存量项目根据 Spring Boot 版本选择对应的 Spring Cloud 版本,务必确保 Spring Cloud 和 Spring Boot 版本匹配,版本不匹配会导致各种不可预期的错误。

Spring Cloud Alibaba 版本

如果需要使用 Nacos、Sentinel、Seata 等阿里开源组件,需要额外引入 Spring Cloud Alibaba 依赖。Spring Cloud Alibaba 有自己的版本号,需要与 Spring Cloud 和 Spring Boot 版本对应:

Spring Cloud AlibabaSpring CloudSpring BootNacosSentinelSeata
2023.0.1.02023.0.x3.2.x2.3.01.8.61.7.0
2022.0.0.02022.0.x3.0.x2.2.x1.8.61.7.0
2021.0.5.02021.0.x2.6.x2.2.01.8.61.6.1

版本选择原则

  • 先确定 Spring Boot 版本
  • 根据 Spring Boot 版本选择对应的 Spring Cloud 版本
  • 最后选择与 Spring Cloud 版本兼容的 Spring Cloud Alibaba 版本

详细版本对应关系请参考 Spring Cloud Alibaba 官方文档

Maven 依赖配置

Spring Cloud 使用 BOM(Bill of Materials)管理版本,在 dependencyManagement 中引入:

<properties>
<spring-cloud.version>2024.0.0</spring-cloud.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>
</dependencies>
</dependencyManagement>

引入 Spring Cloud Alibaba:

<properties>
<spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
<dependencies>
<!-- Spring Cloud Alibaba BOM -->
<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>
<!-- Spring Cloud BOM -->
<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 Cloud 组件选型

Spring Cloud 生态中有多个组件可以实现相同的功能,选择合适的组件很重要。

服务注册与发现

Eureka 是 Netflix 开源的服务注册中心,Spring Cloud Netflix 项目的一部分。优点是与 Spring Cloud 集成度高,使用简单。缺点是 2.x 版本后进入维护模式,不再积极开发新功能。

Nacos 是阿里巴巴开源的服务发现和配置管理平台。优点是功能全面(服务发现+配置管理)、性能好、活跃度高。缺点是需要额外部署 Nacos Server。

Consul 是 HashiCorp 开源的服务网格解决方案。优点是功能丰富(服务发现、配置、健康检查、KV 存储)、支持多数据中心。缺点是架构相对复杂。

对于新项目,推荐使用 Nacos,功能全面且社区活跃。对于简单场景,Eureka 仍然可用但不推荐新项目使用。

配置中心

Spring Cloud Config 是 Spring 官方的配置中心,基于 Git 仓库存储配置。优点是与 Spring 生态集成好、支持版本控制。缺点是配置刷新需要配合 Bus 或手动触发。

Nacos Config 与 Nacos 服务发现一体化,支持配置热更新。优点是配置管理功能强大、控制台友好。缺点是配置存储在数据库,没有 Git 的版本控制优势。

Apollo 是携程开源的配置中心。优点是功能强大(灰度发布、权限管理)、企业级特性完善。缺点是部署相对复杂。

对于已经使用 Nacos 做服务发现的团队,推荐直接使用 Nacos Config。对于有严格配置审计需求的团队,可以考虑 Apollo。

断路器

Hystrix 是 Netflix 开源的断路器,已经停止开发进入维护模式,不推荐新项目使用。

Sentinel 是阿里巴巴开源的流量控制和熔断降级组件。优点是功能丰富(流量控制、熔断降级、系统保护)、控制台完善、文档详尽。缺点是侵入性较强,需要代码改造。

Resilience4j 是轻量级的容错库,设计为 Hystrix 的替代品。优点是模块化设计、轻量级、与 Spring Boot 集成好。缺点是控制台不如 Sentinel 完善。

对于国内团队,推荐使用 Sentinel,社区活跃且中文文档完善。对于追求轻量级的团队,推荐使用 Resilience4j。

API 网关

Zuul 是 Netflix 开源的网关,基于 Servlet 阻塞模型。Zuul 1.x 已停止维护,Zuul 2.x 改为异步模型但 Spring Cloud 官方不再支持。

Spring Cloud Gateway 是 Spring 官方的网关,基于 WebFlux 响应式编程。优点是性能好、与 Spring 生态集成紧密、功能丰富。缺点是需要了解响应式编程。

新项目推荐使用 Spring Cloud Gateway,它是 Spring Cloud 官方维护的网关方案,功能持续更新。

学习路径建议

学习 Spring Cloud 需要循序渐进。建议的学习路径如下:

第一阶段是基础准备,需要掌握 Java 基础、Spring Boot 核心概念、Maven 或 Gradle 构建工具。第二阶段是核心组件学习,依次学习服务注册与发现、配置中心、服务调用(OpenFeign)、负载均衡、API 网关。第三阶段是进阶特性,学习断路器与容错、分布式消息、分布式事务、链路追踪。第四阶段是实战应用,通过完整项目整合所有组件,学习部署运维和性能调优。

参考资源

官方资源包括 Spring Cloud 官方文档、Spring Cloud GitHub、Spring Cloud Alibaba 官方文档。学习资源包括 Spring Cloud Guides、Spring Cloud Alibaba 中文文档。


准备好开始学习了吗?下一章我们将深入学习服务注册与发现,这是微服务架构的基石。