4. Spring Cloud概述:Spring Cloud生态、核心组件介绍、版本选型

好,咱们进入第四章。这一章我打算聊聊Spring Cloud。

说实话,Spring Cloud这玩意儿,刚接触的时候会觉得特别乱。组件多,版本多,命名还老变。我当年第一次搭建微服务架构时,光选版本就折腾了两天。嗯,今天我把这些经验梳理一下,希望能帮你少走弯路。

4.1 什么是Spring Cloud?

Spring Cloud,说白了就是一套工具集。它帮我们解决微服务架构中的各种“麻烦事”。

你想想看,一个系统拆成几十个服务后,服务之间怎么通信?配置怎么管理?服务挂了怎么办?这些问题,Spring Cloud都给出了现成的解决方案。

我个人习惯把Spring Cloud理解成“微服务的全家桶”。它不重复造轮子,而是把业界成熟的解决方案(比如Netflix的组件、阿里巴巴的组件)整合进来,让我们用Spring Boot的方式就能轻松使用。

核心要点:Spring Cloud = 微服务治理的标准化方案。它让开发者不用关心底层实现细节,专注于业务代码。

4.2 Spring Cloud生态

Spring Cloud的生态,我把它分成三个阵营。

4.2.1 Netflix阵营(老牌劲旅)

这是最早的一批。我记得2016年左右,大家聊微服务必提Netflix。它的组件包括:

  • Eureka:服务注册与发现。每个服务启动后,都去Eureka那里报个到。
  • Ribbon:客户端负载均衡。调用服务时,它帮你决定调用哪一台机器。
  • Hystrix:熔断器。服务出问题时,它帮你“断臂求生”,防止雪崩。
  • Zuul:网关。所有请求的入口,负责路由和过滤。

不过,Netflix组件现在大多进入维护模式了。什么意思?就是不再加新功能,只修修bug。我建议新项目慎重考虑。

4.2.2 Alibaba阵营(后起之秀)

这是目前国内用得最多的。阿里巴巴把内部成熟的中间件开源出来,形成了Spring Cloud Alibaba。

  • Nacos:注册中心 + 配置中心。一个组件干两件事,很香。
  • Sentinel:流量控制 + 熔断降级。比Hystrix更强大,控制台也漂亮。
  • Seata:分布式事务解决方案。处理跨服务的数据一致性。
  • Dubbo:RPC框架。性能比Feign好,适合内部服务调用。

我在项目中遇到过几次Netflix组件出问题的情况,后来全换成Alibaba了。说实话,稳定性好很多。

4.2.3 Spring官方阵营(亲儿子)

Spring官方自己也在推一些组件:

  • Spring Cloud Gateway:替代Zuul的网关。基于WebFlux,性能更好。
  • Spring Cloud LoadBalancer:替代Ribbon的负载均衡器。
  • Spring Cloud Circuit Breaker:熔断器的抽象接口,可以接入Resilience4j。

我个人建议:网关用Spring Cloud Gateway,注册中心用Nacos,熔断用Sentinel。这个组合我用了两年,很稳。

4.3 核心组件介绍

咱们挑几个最常用的,深入聊一聊。

4.3.1 服务注册与发现:Nacos

服务注册与发现,是微服务的基础。没有它,服务之间根本找不到对方。

Nacos的工作流程很简单:

  1. 服务启动时,把自己的IP和端口注册到Nacos。
  2. 服务消费者从Nacos拉取服务列表。
  3. 消费者根据负载均衡策略,选择一个服务实例进行调用。
  4. 服务下线时,Nacos会自动剔除它。

我曾经遇到过一个坑:服务明明还在运行,但Nacos里却找不到它了。后来发现是心跳超时设置得太短。嗯,这里要注意,生产环境的心跳间隔建议设成5秒,超时时间设成15秒。

4.3.2 配置中心:Nacos Config

配置中心解决的是“改配置要重启”的问题。

传统做法:改一个数据库连接串,要重新打包、部署、重启。微服务有几十个实例,改一次配置能让人崩溃。

Nacos Config的做法:配置统一存在Nacos里,服务启动时拉取。配置变了,服务能实时刷新,不用重启。

代码示例:

// 1. 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

// 2. 配置bootstrap.yml
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

// 3. 使用@RefreshScope实现动态刷新
@RestController
@RefreshScope
public class ConfigController {
    @Value("${user.default.name}")
    private String defaultName;
    
    @GetMapping("/config")
    public String getConfig() {
        return defaultName;
    }
}

小技巧:配置变更后,Nacos会通过WebSocket通知客户端。客户端收到通知后,会重新拉取配置。整个过程是自动的,你只需要在Bean上加个@RefreshScope注解就行。

4.3.3 网关:Spring Cloud Gateway

网关是系统的“大门”。所有外部请求都先经过它。

网关的作用:

  • 路由转发:根据请求路径,转发到对应的微服务。
  • 统一鉴权:在网关层做登录校验,不用每个服务都写一遍。
  • 限流熔断:防止恶意请求打垮后端服务。
  • 日志记录:统一记录请求日志。

配置示例:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter:
                  replenishRate: 10
                  burstCapacity: 20

这个配置的意思是:所有以/user/开头的请求,都转发到user-service。同时做了限流,每秒最多处理10个请求,突发流量最多20个。

注意:Gateway基于WebFlux,所以你的项目里不能有spring-boot-starter-web依赖。否则会冲突。我见过有人因为这个原因,启动报错查了一整天。

4.4 版本选型

版本选型是个大问题。选错了,各种不兼容,能把你搞疯。

我总结了一个版本对应关系表:

Spring Cloud版本 Spring Boot版本 Spring Cloud Alibaba版本 推荐场景
2020.0.x (Ilford) 2.4.x / 2.5.x 2.2.x 老项目维护
2021.0.x (Jubilee) 2.6.x / 2.7.x 2021.x 稳定生产环境
2022.0.x (Kabul) 3.0.x 2022.x 新项目首选

选版本时,记住三个原则:

  1. 看官方文档:Spring官网有版本对应表,照着选最稳。
  2. 别追最新:最新版可能有坑。等发布3个月后再用。
  3. 统一版本:一个项目里,所有Spring Cloud组件用同一个大版本。

我曾经在一个项目里,用了Spring Cloud 2021.0.3 + Spring Boot 2.6.8 + Alibaba 2021.0.1.0。这个组合跑了快一年,没出过兼容性问题。你可以参考一下。

4.5 小结

这一章咱们聊了Spring Cloud的生态、核心组件和版本选型。

说白了,Spring Cloud就是一套“拿来即用”的微服务解决方案。你不用自己造轮子,选好组件、配好版本,就能快速搭建起一套生产级的微服务架构。

下一章,咱们会动手搭建一个完整的微服务项目。到时候,这些组件怎么用,你就全明白了。