目录

Spring Cloud 是什么

一、为什么需要 Spring Cloud

二、Spring Cloud 的整体架构

三、Spring Cloud 中最核心的组件

1. 服务注册与发现

2. 服务调用

3. 负载均衡

4. API 网关

5. 配置中心

6. 熔断、降级和限流

熔断

降级

限流

7. 链路追踪

8. 消息驱动

9. 分布式事务

四、Spring Cloud 和 Spring Cloud Alibaba 的区别

Spring Cloud

Spring Cloud Alibaba

五、一个典型技术栈

六、一次请求的完整流程

七、微服务架构的优点

1. 独立部署

2. 独立扩容

3. 故障隔离

4. 团队解耦

5. 技术栈灵活

八、微服务架构的缺点

1. 系统复杂度上升

2. 数据一致性困难

3. 排查问题困难

4. 运维成本高

5. 测试困难

九、Spring Cloud 最容易混淆的几个概念

注册中心和配置中心

Gateway 和 Nginx

Feign 和 RestTemplate

熔断和降级

限流和熔断

十、建议的学习顺序

第一阶段:理解核心调用链

第二阶段:系统稳定性

第三阶段:分布式数据问题

第四阶段:运维和可观测性

十一、面试中怎么回答“什么是 Spring Cloud”

十二、你当前最应该掌握的主线


Spring Cloud 是什么

Spring Cloud 是一套用于构建分布式系统和微服务架构的工具集合。

它不是一个单独的框架,而是基于 Spring Boot,整合了一系列微服务基础设施能力,例如:

  • 服务注册与发现

  • 配置中心

  • 服务调用

  • 负载均衡

  • API 网关

  • 熔断降级

  • 链路追踪

  • 消息驱动

  • 分布式事务

可以把它理解成:

Spring Boot:负责把一个服务写出来
Spring Cloud:负责让多个服务协同工作

一、为什么需要 Spring Cloud

假设你现在开发一个电商系统,最开始可能是单体架构:

mall-system
├── 用户模块
├── 商品模块
├── 订单模块
├── 支付模块
└── 库存模块

所有代码都在一个项目中。

随着业务变大,可以拆成多个服务:

user-service
product-service
order-service
payment-service
inventory-service

拆分后会出现大量新问题:

订单服务怎么找到库存服务?
库存服务有多个实例,调用哪一个?
某个服务宕机怎么办?
所有服务的配置怎么统一管理?
前端应该直接访问每个服务吗?
服务之间调用失败如何重试?
如何知道一次请求经过了哪些服务?

Spring Cloud 的作用,就是解决这些分布式系统中的通用问题。


二、Spring Cloud 的整体架构

一个典型的 Spring Cloud 微服务系统,大致如下:

                    客户端
                       │
                       ▼
                Spring Cloud Gateway
                       │
          ┌────────────┼────────────┐
          ▼            ▼            ▼
     用户服务       订单服务       商品服务
          │            │            │
          └──────服务注册中心───────┘
                       │
                  配置中心
                       │
              链路追踪 / 日志
                       │
               消息队列 / 数据库

核心逻辑是:

  1. 所有服务启动后注册到注册中心。

  2. 网关统一接收外部请求。

  3. 服务之间通过服务名互相调用。

  4. 配置统一放到配置中心。

  5. 调用失败时通过熔断、限流、降级保护系统。

  6. 通过链路追踪排查跨服务问题。


三、Spring Cloud 中最核心的组件

1. 服务注册与发现

服务注册中心维护所有微服务实例的信息。

例如:

user-service
├── 192.168.1.10:8081
├── 192.168.1.11:8081
└── 192.168.1.12:8081

订单服务调用用户服务时,不需要写死 IP:

http://192.168.1.10:8081

而是直接通过服务名调用:

http://user-service

注册中心会返回可用实例。

常见方案:

  • Nacos

  • Eureka

  • Consul

  • ZooKeeper

目前国内 Spring Cloud 项目中,Nacos 非常常见


2. 服务调用

微服务之间通常通过 HTTP 或 RPC 调用。

Spring Cloud 中常用的是 OpenFeign。

例如订单服务调用用户服务:

@FeignClient(name = "user-service")
public interface UserClient {

    @GetMapping("/users/{id}")
    UserDTO getUserById(@PathVariable Long id);
}

业务代码中直接调用:

@Service
public class OrderService {

    private final UserClient userClient;

    public OrderService(UserClient userClient) {
        this.userClient = userClient;
    }

    public OrderVO getOrder(Long orderId) {
        Order order = getOrderFromDatabase(orderId);

        UserDTO user = userClient.getUserById(order.getUserId());

        return buildOrderVO(order, user);
    }
}

你写起来像调用普通 Java 方法,但底层实际上发起了 HTTP 请求。


3. 负载均衡

假设用户服务有三个实例:

user-service-1
user-service-2
user-service-3

订单服务调用 user-service 时,需要选择一个实例。

这就是客户端负载均衡。

常见策略:

轮询
随机
权重
最少连接
一致性哈希

Spring Cloud 当前常用:

Spring Cloud LoadBalancer

例如轮询:

第一次请求 → user-service-1
第二次请求 → user-service-2
第三次请求 → user-service-3
第四次请求 → user-service-1

4. API 网关

网关是整个微服务系统的统一入口。

常用组件:

Spring Cloud Gateway

没有网关时:

前端 → 用户服务
前端 → 商品服务
前端 → 订单服务
前端 → 支付服务

有网关后:

前端 → 网关 → 各个微服务

网关通常负责:

  • 路由转发

  • JWT 鉴权

  • 权限校验

  • 限流

  • 日志记录

  • 跨域处理

  • 黑白名单

  • 请求改写

  • 统一异常处理

例如:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/users/**

含义:

请求路径:
/api/users/**

转发到:
user-service

这里的:

lb://

表示通过注册中心和负载均衡查找服务实例。


5. 配置中心

在微服务项目中,每个服务都有配置:

数据库地址
Redis 地址
MQ 地址
端口
日志级别
业务开关
第三方密钥

如果每个服务都保存一份 application.yml,配置很难统一管理。

配置中心可以统一存储配置:

user-service-dev.yml
order-service-dev.yml
payment-service-prod.yml

常见方案:

  • Nacos Config

  • Spring Cloud Config

  • Apollo

配置中心的优点:

  • 集中管理

  • 多环境隔离

  • 动态刷新

  • 权限控制

  • 配置历史版本

  • 灰度发布

例如:

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/order_db
    username: root
    password: xxx

服务启动后从 Nacos 拉取配置,而不是完全依赖本地文件。


6. 熔断、降级和限流

这是 Spring Cloud 中非常重要的一部分。

假设调用链如下:

网关 → 订单服务 → 用户服务 → 积分服务

如果积分服务变慢,订单服务大量线程会阻塞,最终可能造成整个系统雪崩。

因此需要:

  • 超时

  • 重试

  • 熔断

  • 降级

  • 限流

  • 隔离

国内常用:

Sentinel

国外常见:

Resilience4j

熔断

连续调用失败时,暂时停止调用下游服务。

正常:
订单服务 → 积分服务

积分服务大量失败后:
订单服务 ✕ 积分服务
订单服务 → 直接执行降级逻辑

降级

调用失败时返回备用结果。

例如:

public UserDTO fallback(Long id, Throwable throwable) {
    UserDTO user = new UserDTO();
    user.setId(id);
    user.setUsername("默认用户");
    return user;
}

限流

例如限制接口:

每秒最多 100 个请求

超过后直接拒绝,避免系统被压垮。


7. 链路追踪

微服务中一次请求可能经过多个服务:

Gateway
  ↓
Order Service
  ↓
Product Service
  ↓
Inventory Service
  ↓
Payment Service

如果请求耗时 3 秒,需要知道:

网关耗时多少?
订单服务耗时多少?
库存服务是否超时?
哪个服务报错?

链路追踪会给一次请求分配统一的 Trace ID:

traceId = abc123

各服务日志中都会带上它:

Gateway         traceId=abc123
Order Service   traceId=abc123
Inventory       traceId=abc123
Payment         traceId=abc123

常见方案:

  • Micrometer Tracing

  • Zipkin

  • SkyWalking

  • Jaeger

  • OpenTelemetry

企业项目中,SkyWalking 比较常见。


8. 消息驱动

部分业务不适合直接同步调用。

例如用户下单后:

创建订单
扣减库存
发送短信
增加积分
发送优惠券
记录日志

如果全部同步调用:

订单服务
  → 库存服务
  → 短信服务
  → 积分服务
  → 优惠券服务

调用链太长,容易失败。

可以改为消息驱动:

订单服务
   │
   ▼
发送“订单创建成功”消息
   │
   ├── 库存服务消费
   ├── 积分服务消费
   ├── 短信服务消费
   └── 优惠券服务消费

常见中间件:

  • RabbitMQ

  • Kafka

  • RocketMQ

Spring 体系还提供:

Spring Cloud Stream

用于屏蔽部分消息中间件差异。


9. 分布式事务

单体系统中,一个本地事务可以完成:

@Transactional
public void createOrder() {
    insertOrder();
    updateInventory();
}

但微服务中:

订单服务操作订单数据库
库存服务操作库存数据库
账户服务操作账户数据库

不同数据库之间无法直接使用一个本地事务。

因此需要考虑分布式事务。

常见方案:

  • Seata

  • TCC

  • Saga

  • 可靠消息最终一致性

  • 本地消息表

  • 事务消息

需要注意:

微服务中不是所有业务都应该使用强一致分布式事务。

实际项目更常见的是:

本地事务 + MQ + 重试 + 幂等 + 最终一致性

四、Spring Cloud 和 Spring Cloud Alibaba 的区别

很多人容易混淆。

Spring Cloud

Spring 官方微服务体系,包含:

  • Gateway

  • OpenFeign

  • LoadBalancer

  • Config

  • Circuit Breaker

  • Stream

Spring Cloud Alibaba

阿里提供的一套 Spring Cloud 扩展生态,常用组件:

  • Nacos:注册中心、配置中心

  • Sentinel:限流、熔断、降级

  • Seata:分布式事务

  • RocketMQ:消息队列

  • Dubbo:RPC

国内常见组合:

Spring Boot
+ Spring Cloud
+ Spring Cloud Alibaba
+ Nacos
+ OpenFeign
+ Gateway
+ Sentinel
+ Seata
+ RocketMQ

可以理解为:

Spring Cloud:制定微服务接口规范和整体体系
Spring Cloud Alibaba:提供一套国内常用的具体实现

五、一个典型技术栈

对于 Java 后端项目,常见微服务技术栈可能是:

功能常用技术
单体服务基础Spring Boot
微服务框架Spring Cloud
注册中心Nacos
配置中心Nacos
服务调用OpenFeign
负载均衡Spring Cloud LoadBalancer
网关Spring Cloud Gateway
熔断限流Sentinel
分布式事务Seata
消息队列RocketMQ / RabbitMQ / Kafka
数据库MySQL
缓存Redis
链路追踪SkyWalking
日志ELK / Loki
容器化Docker
编排Kubernetes

六、一次请求的完整流程

以“查询订单详情”为例:

1. 前端请求:
   GET /api/orders/1001

2. 请求进入 Gateway。

3. Gateway 校验 JWT。

4. Gateway 根据路由规则找到 order-service。

5. 注册中心返回 order-service 的多个实例。

6. LoadBalancer 选择一个实例。

7. order-service 查询订单数据库。

8. order-service 使用 OpenFeign 调用 user-service。

9. user-service 返回用户信息。

10. order-service 使用 OpenFeign 调用 product-service。

11. product-service 返回商品信息。

12. order-service 组装结果返回。

13. 链路追踪系统记录整个调用链。

结构如下:

前端
 ↓
Gateway
 ↓
order-service
 ├── MySQL
 ├── user-service
 └── product-service

七、微服务架构的优点

1. 独立部署

修改订单服务,不一定要重新部署整个系统。

2. 独立扩容

订单服务压力大,可以单独扩容:

order-service × 10
user-service × 3
product-service × 5

3. 故障隔离

推荐服务宕机,不应该拖垮支付服务。

4. 团队解耦

不同团队负责不同服务:

用户团队
订单团队
支付团队
商品团队

5. 技术栈灵活

虽然 Java 项目一般统一使用 Spring Boot,但理论上部分服务可以使用不同语言。


八、微服务架构的缺点

微服务不是“拆得越多越好”。

1. 系统复杂度上升

单体方法调用:

userService.getUser(id);

微服务调用需要考虑:

网络超时
服务宕机
重试
熔断
负载均衡
序列化
版本兼容

2. 数据一致性困难

多个服务操作不同数据库,事务变复杂。

3. 排查问题困难

一次请求跨越多个服务,需要链路追踪。

4. 运维成本高

需要管理:

  • 服务实例

  • 配置中心

  • 注册中心

  • 网关

  • MQ

  • Redis

  • 日志平台

  • 监控平台

  • Docker

  • Kubernetes

5. 测试困难

需要同时启动多个依赖服务。

因此:

业务规模不大时,优先选择模块化单体,而不是盲目拆微服务。


九、Spring Cloud 最容易混淆的几个概念

注册中心和配置中心

注册中心:
管理服务在哪里、是否存活。

配置中心:
管理服务使用什么配置。

Nacos 同时支持这两项能力。


Gateway 和 Nginx

Nginx 更偏基础设施层:

  • 静态资源

  • 反向代理

  • TLS

  • 负载均衡

Gateway 更偏业务网关层:

  • JWT 鉴权

  • 动态路由

  • 用户上下文

  • 限流

  • 灰度发布

  • 业务过滤器

实际项目可能是:

用户
 ↓
Nginx
 ↓
Spring Cloud Gateway
 ↓
微服务

Feign 和 RestTemplate

RestTemplate:

restTemplate.getForObject(
    "http://user-service/users/1",
    UserDTO.class
);

Feign:

userClient.getUserById(1L);

Feign 更加声明式,代码更简洁。


熔断和降级

熔断:
暂时不调用已经出问题的服务。

降级:
不调用或调用失败时,返回备用结果。

通常两者配合使用。


限流和熔断

限流:
控制进入系统的请求数量。

熔断:
保护对下游服务的调用。

一个主要控制入口流量,一个主要保护服务调用链。


十、建议的学习顺序

你是 Java 后端开发,不建议一开始就把所有组件全部学一遍。按下面顺序更合理:

第一阶段:理解核心调用链

先学:

Spring Boot
Nacos 注册中心
OpenFeign
LoadBalancer
Gateway

目标是实现:

用户请求
→ Gateway
→ order-service
→ user-service

第二阶段:系统稳定性

再学:

Sentinel
超时
重试
熔断
降级
限流

重点理解:

服务调用失败后,系统如何自我保护

第三阶段:分布式数据问题

学习:

Redis
MQ
幂等
分布式锁
分布式事务
最终一致性

重点理解:

消息重复消费怎么办?
库存扣减失败怎么办?
订单和支付状态不一致怎么办?

第四阶段:运维和可观测性

学习:

Docker
SkyWalking
Prometheus
Grafana
ELK
Kubernetes

重点理解:

服务是否存活?
接口为什么慢?
一次请求在哪里失败?
如何扩容?

十一、面试中怎么回答“什么是 Spring Cloud”

可以这样回答:

Spring Cloud 是基于 Spring Boot 构建微服务和分布式系统的一套工具体系。它主要解决服务注册与发现、服务调用、负载均衡、统一网关、配置管理、熔断降级、限流、链路追踪和消息驱动等问题。

Spring Boot 负责快速开发单个服务,Spring Cloud 负责多个服务之间的治理和协作。在国内项目中,通常会结合 Spring Cloud Alibaba,使用 Nacos 作为注册和配置中心,OpenFeign 进行服务调用,Gateway 作为统一入口,Sentinel 进行限流和熔断保护。


十二、你当前最应该掌握的主线

不要先背组件,而是记住这一条调用链:

客户端
  ↓
Gateway:鉴权、路由、限流
  ↓
注册中心:查询服务实例
  ↓
LoadBalancer:选择实例
  ↓
OpenFeign:远程调用
  ↓
Sentinel:熔断、降级、限流
  ↓
微服务 + 数据库 + Redis + MQ

Spring Cloud 的本质可以归纳成一句话:

把单体系统中的本地方法调用,变成可治理、可容错、可观测的远程服务调用。

更多推荐