Skip to content

Spring Cloud 速查

微服务基础设施的 Spring 实现。本节为轻量速查,覆盖核心组件和面试常考点。深度内容参见 微服务架构

概念

  • Spring Cloud 是一套微服务基础设施的解决方案,提供服务注册发现、网关、熔断限流、配置中心等能力。
  • 主流技术栈已从 Netflix 全家桶(Eureka、Zuul、Hystrix)迁移到 Alibaba 体系(Nacos、Gateway、Sentinel)。
  • Spring Cloud 本身是规范和抽象,具体实现由 Spring Cloud Netflix、Spring Cloud Alibaba 等提供。

服务注册与发现

Nacos vs Eureka

对比项NacosEureka
功能✅ 注册发现 + 配置管理只有注册发现
一致性模型AP / CP 可切换AP(最终一致)
健康检查服务端主动检测 + 客户端心跳客户端心跳
控制台✅ 自带 Web UI简单的状态页
维护状态✅ 活跃维护Netflix 停止维护(2.x 闭源后开源社区维护)
推荐度✅ 推荐不推荐新项目使用

AP vs CP:

  • AP(可用性优先):注册信息可能短暂不一致,但服务不会中断。适合大多数微服务场景。
  • CP(一致性优先):注册信息严格一致,但网络分区时可能不可用。适合对一致性要求高的场景。
  • Nacos 默认 AP,可以切换为 CP(临时实例用 AP,持久实例用 CP)。

服务注册与发现流程

服务启动 → 注册到 Nacos(IP、端口、元数据)

消费者 → 从 Nacos 获取服务列表 → 负载均衡选择实例 → 发起调用

服务下线 → Nacos 检测到心跳停止 → 从服务列表移除

API 网关

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring 官方的网关实现,基于 WebFlux(非阻塞),替代了 Zuul:

对比项Spring Cloud GatewayZuul 1.x
性能模型✅ 非阻塞(WebFlux / Netty)阻塞(Servlet)
性能✅ 高较低
长连接✅ 支持 WebSocket不支持
维护状态✅ 活跃Netflix 停止维护

核心概念

概念说明示例
Route(路由)路由规则,匹配请求转发到目标将 /api/user/** 转发到 user-service
Predicate(断言)匹配条件Path、Method、Header、Query 等
Filter(过滤器)请求/响应处理添加 Header、限流、鉴权、日志
yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service        # lb:// 表示从注册中心获取并负载均衡
          predicates:
            - Path=/api/user/**         # 路径匹配
          filters:
            - StripPrefix=1             # 去掉第一段路径前缀
            - AddRequestHeader=X-Request-Source, gateway

网关的典型职责

  • 路由转发 — 将请求分发到对应的微服务
  • 负载均衡 — 配合服务发现实现
  • 统一鉴权 — 在网关层校验 Token
  • 限流熔断 — 保护后端服务
  • 日志监控 — 统一的请求日志和指标收集
  • 跨域处理 — 统一配置 CORS

熔断与限流

为什么需要熔断?

微服务调用链中,一个服务不可用会导致级联故障(雪崩效应):

A → B → C(故障) → B 线程被阻塞 → A 线程被阻塞 → 全部不可用

熔断器在检测到下游故障时快速失败,避免资源耗尽。

熔断器状态机

Closed(正常)→ 失败率超过阈值 → Open(熔断,快速失败)

                                  等待一段时间

                                Half-Open(放行少量请求试探)

                            成功 → Closed  /  失败 → Open

Sentinel vs Resilience4j

对比项SentinelResilience4j
来源阿里巴巴开源社区
功能✅ 限流 + 熔断 + 热点 + 系统保护熔断 + 重试 + 限流 + 隔离
控制台✅ 实时监控 Dashboard无(依赖外部监控)
规则配置✅ 动态规则(可运行时修改)静态配置为主
生态Spring Cloud AlibabaSpring Cloud 官方推荐
适用国内微服务主流轻量项目

Sentinel 限流策略

策略说明
QPS 限流每秒请求数超过阈值则拒绝
线程数限流并发线程数超过阈值则拒绝
热点参数限流针对某个参数值限流(如 userId)
系统保护根据系统指标(CPU、负载)自动限流

分布式配置中心

Nacos Config

将配置从应用中抽离,集中管理,支持运行时动态更新:

yaml
# bootstrap.yml(配置中心的配置在 bootstrap 中,优先于 application.yml 加载)
spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yml

配置热更新

java
@RestController
@RefreshScope  // 标注这个注解的 Bean 在配置变更时会重新创建
public class ConfigController {
    
    @Value("${app.feature-flag:false}")
    private boolean featureFlag;
    
    @GetMapping("/config")
    public boolean getFlag() {
        return featureFlag;  // Nacos 中修改配置后自动更新
    }
}

原理: Nacos 客户端长轮询监听配置变更 → 检测到变化 → 发布 RefreshEvent → Spring 销毁 @RefreshScope 的 Bean 并重新创建。

服务调用

OpenFeign

声明式 HTTP 客户端,定义接口 + 注解即可调用其他微服务:

java
@FeignClient(name = "user-service")  // 服务名(从注册中心解析)
public interface UserClient {
    
    @GetMapping("/api/users/{id}")
    UserDTO getUser(@PathVariable Long id);
    
    @PostMapping("/api/users")
    UserDTO createUser(@RequestBody CreateUserRequest request);
}

// 使用 — 像调用本地方法一样
@Service
public class OrderService {
    @Autowired private UserClient userClient;
    
    public void createOrder(Long userId) {
        UserDTO user = userClient.getUser(userId); // 实际发 HTTP 请求
    }
}

负载均衡

Spring Cloud LoadBalancer(替代 Ribbon)提供客户端负载均衡:

  • 从注册中心获取服务实例列表
  • 按策略选择实例(轮询、随机等)
  • 发起 HTTP 请求

lb://user-service 中的 lb:// 前缀就是触发负载均衡的标识。

面试常问 & 怎么答

Q1: Nacos 和 Eureka 的区别?

三个核心区别:1) Nacos 同时支持注册发现和配置管理,Eureka 只有注册发现;2) Nacos 支持 AP/CP 切换,Eureka 只支持 AP;3) Nacos 有完善的控制台,Eureka 基本只有状态页。另外 Eureka 已经停止官方维护。

Q2: Gateway 和 Zuul 的区别?

Gateway 基于 WebFlux(非阻塞),性能高,支持 WebSocket;Zuul 1.x 基于 Servlet(阻塞),性能较低。Gateway 是 Spring 官方推荐,Zuul 已停止维护。Gateway 的核心模型是 Route + Predicate + Filter。

Q3: 什么是熔断?

当检测到下游服务故障(失败率超过阈值)时,熔断器切换到 Open 状态,后续请求直接快速失败,不再调用下游。等待一段时间后进入 Half-Open 状态,放行少量请求试探,成功则恢复,失败则继续熔断。目的是防止级联故障(雪崩效应)。

Q4: Sentinel 的限流策略有哪些?

四种:QPS 限流(每秒请求数)、线程数限流(并发线程数)、热点参数限流(针对特定参数值)、系统保护(根据 CPU/负载自动限流)。Sentinel 的优势是支持动态规则和实时监控 Dashboard。

看到什么就先想到这类

  • 出现服务注册、Nacos、Eureka。
  • 出现网关、Gateway、路由。
  • 出现熔断、限流、Sentinel、雪崩。
  • 出现配置中心、@RefreshScope、热更新。
  • 出现 Feign、服务调用、负载均衡。