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的工作流程很简单:
- 服务启动时,把自己的IP和端口注册到Nacos。
- 服务消费者从Nacos拉取服务列表。
- 消费者根据负载均衡策略,选择一个服务实例进行调用。
- 服务下线时,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 | 新项目首选 |
选版本时,记住三个原则:
- 看官方文档:Spring官网有版本对应表,照着选最稳。
- 别追最新:最新版可能有坑。等发布3个月后再用。
- 统一版本:一个项目里,所有Spring Cloud组件用同一个大版本。
我曾经在一个项目里,用了Spring Cloud 2021.0.3 + Spring Boot 2.6.8 + Alibaba 2021.0.1.0。这个组合跑了快一年,没出过兼容性问题。你可以参考一下。
4.5 小结
这一章咱们聊了Spring Cloud的生态、核心组件和版本选型。
说白了,Spring Cloud就是一套“拿来即用”的微服务解决方案。你不用自己造轮子,选好组件、配好版本,就能快速搭建起一套生产级的微服务架构。
下一章,咱们会动手搭建一个完整的微服务项目。到时候,这些组件怎么用,你就全明白了。