限流、熔断与降级(韧性设计)

microservice ✅ mastered resilience-patterns · microservice · rate-limiting · circuit-breaker · fallback · sentinel · hystrix · resilience4j

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
三种触发方式:
  • 慢调用比例:响应时间超阈值(如 500ms)的比例
  • 错误比例:错误率(超时/异常/5xx)
  • 错误数:固定窗口内的错误绝对数
核心参数:
  • 熔断阈值:错误率 > 50%(或错误数 > 阈值)
  • 统计窗口:10s
  • 恢复期:10-30s
  • 探测请求数:3-10 个
3. 降级(Fallback/Degrade)——作用点:本服务对外接口 5 种类型:
类型说明举例
服务降级返回兜底值/错误提示三方接口挂了返回随机推荐位
功能降级隐藏非核心功能推荐位挂了、评论区挂了
数据降级返回缓存旧数据库存查询挂了返回上次缓存
排队降级同步转异步,进队列稍后处理支付成功但积分/通知稍后处理
消息降级同步转异步(用 MQ)下单主流程异步通知下游
三者关系:
策略作用点目的
限流本服务入口控制总流量,防被打爆
熔断下游依赖快速失败,防被拖垮
降级本服务对外接口兜底可用,防完全失败
典型组合:
入口请求 → [网关限流] → [调用下游] → 下游失败率超阈值
                                        ↓
                                    [熔断打开,快速失败]
                                        ↓
                                    [触发降级,返回兜底值]
主流工具对比:
工具特点状态
HystrixNetflix 经典,线程池隔离,概念最清晰已停止维护
Sentinel阿里,信号量隔离(无线程切换),支持热点参数限流、系统自适应保护、熔断规则多样当前主流
Resilience4jJava 8+ 模块化,轻量,Hystrix 替代活跃
生产阈值推荐:
  • 限流阈值 = 压测 80%(留 20% 余量)
  • 熔断阈值 = 50% 错误率持续 10s
  • 恢复期 = 10-30s
  • 探测请求数 = 3-10 个(连续 N 次成功后回 CLOSED)

STEP 4 · 简化

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

常见误区

只说"熔断就是切断"
熔断是三态机,有 CLOSED/OPEN/HALF-OPEN 迁移过程
降级只说"返回随机值"
有 5 种类型(服务/功能/数据/排队/消息)
不提主流工具
Sentinel、Hystrix、Resilience4j 都要能说出区别

延伸追问

熔断三态具体怎么迁移?
要点:CLOSED(正常放行)→ 触发阈值(如 10s 内错误率>50%)→ OPEN(快速失败,不再调用)→ 等恢复期(如 10s)→ HALF-OPEN(放一半请求探测)→ 探测成功回 CLOSED / 失败回 OPEN。
Hystrix 熔断和 Sentinel 熔断有什么区别?
要点:Hystrix 用滑动时间窗口的孤立线程池隔离,Sentinel 用信号量隔离(无线程切换开销);Hystrix 已停止维护,Sentinel 是当前主流;Sentinel 支持热点参数限流、系统自适应保护等。
什么时候用限流而不是熔断?
要点:本服务流量过载用限流(入口保护);下游服务不稳定用熔断(依赖保护);两者互补。典型组合:网关限流 + 服务熔断 + 熔断后降级。
生产环境如何确定限流阈值和熔断阈值?
要点:压测(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

Anki 候选卡片

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

关联题目

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

    三者独立策略;熔断三态机;5 种降级类型;Sentinel vs Hystrix
    ✦ 记 忆 口 诀 ✦
    限流入口 / 熔断下游 / 降级兜底 / 三态机 CLOSED-OPEN-HALF
    关键可视化
    暂无可视化
    知识关系

    ⬆️ 前置(Prerequisite)

    暂无

    🔄 延伸(Extends)

    暂无

    ⚡ 对比(Contrast)

    暂无
    🎯 概念 📏 规则 ⚠️ 误区 🔍 追问 ✨ 口诀 共 0 张卡,点击翻面