---
title: 限流、熔断与降级（韧性设计）
type: concept
domain: microservice
tags: [microservice, rate-limiting, circuit-breaker, fallback, sentinel, hystrix, resilience4j]
status: mastered
created: 2026-09-27
last_reviewed: 2026-09-27
method: feynman
related_questions:
  - "限流、降级、熔断有什么区别？"
related_knowledge:
  - ./microservice-communication.md
  - ./microservice-architecture.md
anki_cards: 7
interview_rounds:
  - "2026-09-27-round-1-Q8"
---

# 限流、熔断与降级（韧性设计）

> 三者是**三种独立的防护策略**（不是"三个阶段"）：限流=入口守门员，熔断=下游保险丝，降级=兜底策略。

## TL;DR（30 秒扫完）

- **限流（Rate Limiting）**：入口流量控制，防本服务被打爆。作用于**本服务**。算法：计数器/漏桶/令牌桶/滑动窗口
- **熔断（Circuit Breaking）**：下游依赖保护，防下游拖垮调用方。作用于**下游服务**。三态机：CLOSED → OPEN → HALF-OPEN
- **降级（Fallback/Degrade）**：兜底策略，让系统异常下仍可用。作用于**本服务对外接口**。5 种类型
- **典型组合**：网关限流 + 服务熔断 + 熔断后降级
- **主流工具**：Sentinel（阿里，功能最全）、Hystrix（Netflix，已停维护）、Resilience4j（Java 8+）

## 关键结论

- **结论 A**：三者是三种独立的防护策略，不是"限流→降级→熔断"的阶段关系
- **结论 B**：熔断核心是三态机（CLOSED/OPEN/HALF-OPEN），不是简单的"切断"
- **结论 C**：降级有 5 种类型（服务/功能/数据/排队/消息），不只是"返回随机值"
- **结论 D**：三者典型组合是"网关限流 + 服务熔断 + 熔断后降级"，形成三层保护

## 完整讲解（费曼四步）

### STEP 1 · 概念

限流、熔断、降级是微服务的三大流量治理策略，防止系统被流量打爆或依赖拖垮。

### STEP 2 · 大白话

**限流像景区限流**：游客太多，门口排队长龙，限制每小时进园人数，保护景区不被挤爆。
**熔断像保险丝**：某个电器坏了导致短路，保险丝自动断开，防止整栋楼着火。
**降级像备用发电机**：主电源断了，启动备用电源保证基本供电（虽然亮度差一点）。

### STEP 3 · 底层

**1. 限流（Rate Limiting）**——作用点：**本服务入口**

**4 大算法**：

| 算法 | 特点 | 缺陷 | 适用 |
|------|------|------|------|
| 计数器 | 简单，QPS 窗口重置 | 边界突发问题（窗口前后都允许 100% QPS） | 简单场景 |
| 漏桶 | 恒定速率出 | 不支持突发流量 | 严格匀速 |
| 令牌桶 | 允许突发（桶内累积令牌） | 参数多 | 主流（Guava RateLimiter） |
| 滑动窗口 | 精细统计 | 实现复杂 | 精细限流 |

**单机 vs 集群**：
- 单机限流：Guava RateLimiter、Resilience4j
- 集群限流：Redis + Lua、Sentinel 集群限流

**典型场景**：秒杀接口防刷、登录接口防暴力破解、API 网关限流

**2. 熔断（Circuit Breaking）**——作用点：**下游依赖**

**熔断三态机**：

```
        正常放行，统计错误率
              ↓ 触发阈值（如 10s 内错误率>50%）
   CLOSED ──────→ OPEN ──── 等待恢复期（如 10s）
              ↑                  ↓
              │                  ↓ 放一半请求探测
              │                  ↓
              └──── HALF-OPEN ←──┘
              探测成功回 CLOSED / 失败回 OPEN
```

**三种触发方式**：
1. **慢调用比例**：响应时间超阈值（如 500ms）的比例
2. **错误比例**：错误率（超时/异常/5xx）
3. **错误数**：固定窗口内的错误绝对数

**核心参数**：
- 熔断阈值：错误率 > 50%（或错误数 > 阈值）
- 统计窗口：10s
- 恢复期：10-30s
- 探测请求数：3-10 个

**3. 降级（Fallback/Degrade）**——作用点：**本服务对外接口**

**5 种类型**：

| 类型 | 说明 | 举例 |
|------|------|------|
| 服务降级 | 返回兜底值/错误提示 | 三方接口挂了返回随机推荐位 |
| 功能降级 | 隐藏非核心功能 | 推荐位挂了、评论区挂了 |
| 数据降级 | 返回缓存旧数据 | 库存查询挂了返回上次缓存 |
| 排队降级 | 同步转异步，进队列稍后处理 | 支付成功但积分/通知稍后处理 |
| 消息降级 | 同步转异步（用 MQ） | 下单主流程异步通知下游 |

**三者关系**：

| 策略 | 作用点 | 目的 |
|------|-------|------|
| 限流 | 本服务入口 | 控制总流量，防被打爆 |
| 熔断 | 下游依赖 | 快速失败，防被拖垮 |
| 降级 | 本服务对外接口 | 兜底可用，防完全失败 |

**典型组合**：
```
入口请求 → [网关限流] → [调用下游] → 下游失败率超阈值
                                        ↓
                                    [熔断打开，快速失败]
                                        ↓
                                    [触发降级，返回兜底值]
```

**主流工具对比**：

| 工具 | 特点 | 状态 |
|------|------|------|
| Hystrix | Netflix 经典，线程池隔离，概念最清晰 | **已停止维护** |
| Sentinel | 阿里，信号量隔离（无线程切换），支持热点参数限流、系统自适应保护、熔断规则多样 | 当前主流 |
| Resilience4j | Java 8+ 模块化，轻量，Hystrix 替代 | 活跃 |

**生产阈值推荐**：
- 限流阈值 = 压测 80%（留 20% 余量）
- 熔断阈值 = 50% 错误率持续 10s
- 恢复期 = 10-30s
- 探测请求数 = 3-10 个（连续 N 次成功后回 CLOSED）

### STEP 4 · 简化

> **口诀**：限流=入口守门员，熔断=下游保险丝，降级=兜底策略；熔断三态机 CLOSED→OPEN→HALF-OPEN；三者组合：网关限流+服务熔断+熔断后降级。

## 常见误区（从面试记录提炼）

- **误区 1**："限流→降级→熔断是三个阶段"→ 正确：三者是独立的防护策略，可以独立使用或组合
- **误区 2**：只说"熔断就是切断"→ 正确：熔断是三态机，有 CLOSED/OPEN/HALF-OPEN 迁移过程
- **误区 3**：降级只说"返回随机值"→ 正确：有 5 种类型（服务/功能/数据/排队/消息）
- **误区 4**：不提主流工具→ 正确：Sentinel、Hystrix、Resilience4j 都要能说出区别

## 延伸追问（面试追问预演）

1. **熔断三态具体怎么迁移？**
   - 要点：CLOSED（正常放行）→ 触发阈值（如 10s 内错误率>50%）→ OPEN（快速失败，不再调用）→ 等恢复期（如 10s）→ HALF-OPEN（放一半请求探测）→ 探测成功回 CLOSED / 失败回 OPEN。
2. **Hystrix 熔断和 Sentinel 熔断有什么区别？**
   - 要点：Hystrix 用滑动时间窗口的孤立线程池隔离，Sentinel 用信号量隔离（无线程切换开销）；Hystrix 已停止维护，Sentinel 是当前主流；Sentinel 支持热点参数限流、系统自适应保护等。
3. **什么时候用限流而不是熔断？**
   - 要点：本服务流量过载用限流（入口保护）；下游服务不稳定用熔断（依赖保护）；两者互补。典型组合：网关限流 + 服务熔断 + 熔断后降级。
4. **生产环境如何确定限流阈值和熔断阈值？**
   - 要点：压测（JMeter/AB）确定单机 QPS 上限，取 80% 作为限流阈值；熔断阈值参考 P95 错误率，一般 50% 持续 10s 触发；恢复期一般 10-30s；Sentinel 自适应规则可动态调整。

## 速查表

```
限流：入口控制（本服务），4 算法：计数器/漏桶/令牌桶/滑动窗口
熔断：下游保护，三态机：CLOSED→OPEN→HALF-OPEN
降级：兜底策略，5 类型：服务/功能/数据/排队/消息
组合：网关限流 + 服务熔断 + 熔断后降级
工具：Sentinel（主流）/ Hystrix（停维护）/ Resilience4j（Hystrix 替代）
阈值：限流=压测 80%；熔断=50% 错误率持续 10s；恢复期=10-30s
```

## 关联题目（题库）

- [x] 《限流、降级、熔断有什么区别？》—— 2026-09-27 Round 1 Q8, 评分 ⭐⭐⭐⭐

## 关联知识

- [微服务调用方式全景](./microservice-communication.md)
- [微服务架构演进与特征](./microservice-architecture.md)

## Anki 候选卡片

1. **正**：限流、熔断、降级三者的本质区别？**反**：限流=入口流量控制（本服务）；熔断=下游依赖保护（快速失败）；降级=兜底策略（返回非真实结果）——三者是独立策略，不是阶段
2. **正**：熔断三态机如何迁移？**反**：CLOSED（正常）→ 触发阈值（如 10s 内错误率>50%）→ OPEN（快速失败）→ 等恢复期 → HALF-OPEN（放一半请求探测）→ 成功回 CLOSED/失败回 OPEN
3. **正**：4 种限流算法？**反**：计数器（简单但边界突发）/ 漏桶（恒定速率出）/ 令牌桶（允许突发，主流）/ 滑动窗口（精细统计）
4. **正**：5 种降级类型？**反**：服务降级（返回兜底值）/ 功能降级（隐藏非核心功能）/ 数据降级（返回缓存旧数据）/ 排队降级（进队列稍后处理）/ 消息降级（同步转异步）
5. **正**：Hystrix vs Sentinel 区别？**反**：Hystrix 线程池隔离、已停止维护；Sentinel 信号量隔离（无线程切换开销）、当前主流、支持热点参数限流和自适应保护
6. **正**：熔断三种触发方式？**反**：慢调用比例 / 错误比例 / 错误数
7. **正**：三者典型组合？**反**：网关限流 + 服务熔断 + 熔断后降级，形成三层保护

---

*最后更新：2026-09-27*
