跳到主要内容

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 中文文档。


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