分布式系统中,弹性设计的三大核心模式。它们共同构成系统的「免疫系统」,让服务在面对故障和压力时优雅降级而非直接崩溃。
| 维度 | 服务熔断 | 服务降级 | 服务限流 |
|---|---|---|---|
| 核心问题 | 级联故障 一个服务挂了,拖垮整个调用链 | 资源瓶颈 系统过载时核心链路受影响 | 流量冲击 突发流量超过系统承载上限 |
| 触发条件 | 调用失败率 / 慢调用比例超过阈值 | 系统负载高 / 依赖不可用 / 熔断触发 | QPS超过预设阈值 |
| 动作时机 | 事中响应(已经出问题) | 事中兜底(问题发生后保底) | 事前拦截(还没进来就拦) |
| 保护对象 | 调用方(防止被下游拖死) | 被调方 & 调用方(整体可用性) | 被调方(防止被打垮) |
| 典型场景 | 支付服务挂了 → 订单服务熔断支付调用 | 推荐服务超时 → 返回热门商品列表 | 秒杀开始瞬间 → 网关限流 10000 QPS |
| 恢复机制 | 半开探测,成功则恢复 | 条件消失后自动恢复 | 下一个时间窗口自动重置 |
熔断器有三个核心状态,自动流转:
👆 点击 CLOSED 状态模拟故障,观察状态流转
在滑动时间窗口内,失败率达到阈值(如 50%),熔断器打开。此后所有请求直接返回错误(快速失败),不再调用下游。
经过一段冷却时间(如 10s),熔断器进入半开状态。允许少量试探请求通过。
试探请求成功 → 关闭熔断器,恢复正常。试探请求仍失败 → 重新打开熔断器,再次进入冷却等待。
| 参数 | 说明 | 典型值 |
|---|---|---|
| failureRateThreshold | 触发熔断的失败率阈值 | 50% |
| slidingWindowSize | 滑动窗口大小(统计多少请求) | 100 |
| minimumNumberOfCalls | 最小调用次数(窗口内需累积足够样本) | 20 |
| waitDurationInOpenState | 熔断打开后的冷却时间 | 10s |
| permittedNumberOfCallsInHalfOpenState | 半开状态允许的试探请求数 | 5 |
| slowCallDurationThreshold | 慢调用时间阈值 | 3s |
| slowCallRateThreshold | 慢调用比例阈值 | 50% |
minimumNumberOfCalls 确保统计有足够的样本量,failureRateThreshold 允许一定比例失败(因为网络抖动是正常的),避免因偶然波动误触发。
| 框架 | 语言 | 特点 | 适用场景 |
|---|---|---|---|
| Resilience4j | Java | 轻量级、函数式、专为Java8+设计;支持熔断/限流/重试/隔离 | Spring Cloud 官方推荐,替代Hystrix |
| Sentinel | Java / Go / C++ | 阿里开源、控制台可视化、规则动态下发、支持熔断+限流+降级一体化 | 国内互联网主流选择,适合复杂治理 |
| Hystrix | Java | Netflix 出品,线程池隔离 + 信号量隔离,已进入维护模式 | 老项目维护,新项目不建议使用 |
| Polly | .NET | .NET 生态标准选择,策略组合灵活 | .NET / C# 项目 |
| go-kit/circuitbreaker | Go | Go 生态的多种熔断器实现(Hystrix-Go、gobreaker等) | Go 微服务项目 |
降级是主动的取舍策略。当系统资源紧张时,关闭或简化非核心功能,把资源留给核心链路。这就像飞机遇到气流时,先关掉机上娱乐系统,确保飞行控制系统的电力供应。
| 级别 | 策略 | 示例 | 用户体验 |
|---|---|---|---|
| L1 · 静默 | 返回缓存数据 | 首页推荐位读取 Redis 缓存而非实时计算 | 用户几乎无感知 |
| L2 · 简化 | 关闭非核心功能 | 评论功能关闭、个性化推荐改为热门排行 | 功能减少但核心可用 |
| L3 · 兜底 | 返回默认/静态数据 | 用户等级查不到 → 返回"普通会员" | 数据可能不准确 |
| L4 · 提示 | 友好错误提示 | 支付页面显示"系统繁忙,请稍后再试" | 明确告知、不丢失数据 |
| 场景 | 正常返回 | 降级返回 | 降级策略 |
|---|---|---|---|
| 商品详情-推荐 | 实时个性化推荐 | 热门商品Top 100 | L2 简化 |
| 用户等级查询 | 精确等级 | "普通会员" | L3 兜底 |
| 搜索结果 | 完整搜索结果 | 空列表 + 提示 | L4 提示 |
| 评论列表 | 实时评论 | 缓存评论 / 隐藏 | L1/L2 |
| 支付回调查询 | 精确支付状态 | 不能降级! | 核心链路不降级 |
以下四种算法是限流的基础,各有适用场景:
固定速率生成令牌,请求需获取令牌才能放行。可以应对突发流量(桶内积累的令牌一次性消费)。
| 算法 | 原理 | 突发流量 | 平滑性 | 实现复杂度 |
|---|---|---|---|---|
| 固定窗口计数器 | 每个时间窗口(如1s)内计数,超阈值则限流 | ✗ 临界问题(窗口边界两倍流量) | 差 | ★☆☆☆☆ |
| 滑动窗口计数器 | 将窗口细分为多个小格子,滑动统计 | △ 缓解临界问题 | 中 | ★★☆☆☆ |
| 漏桶算法 | 请求进入队列,以固定速率流出处理 | ✗ 无法应对突发(强制平滑) | 高 | ★★★☆☆ |
| 令牌桶算法 | 以固定速率放入令牌,请求消耗令牌 | ✓ 支持突发(积攒的令牌可一次消费) | 中 | ★★★☆☆ |
限流不是只在网关做一层就够了,需要在多个层级协同配合:
| 层级 | 实现方式 | 粒度 | 适用场景 |
|---|---|---|---|
| 接入层 | Nginx / OpenResty / APISIX | IP / 域名 / URI | 防DDoS、防爬虫、全局限流 |
| 网关层 | Spring Cloud Gateway / Kong / Zuul | 用户 / App / 租户 | 多租户隔离、业务限流 |
| 应用层 | Sentinel / Guava RateLimiter | 接口 / 方法 | 核心接口保护、热点参数限流 |
| 中间件层 | Redis + Lua 脚本 | 任意维度 | 分布式限流、跨实例协同 |
| 维度 | 熔断 Circuit Breaker | 降级 Fallback | 限流 Rate Limiting |
|---|---|---|---|
| 设计模式 | 断路器模式 | 兜底 / 后备模式 | 流量整形模式 |
| 作用方向 | 调用方 → 被调方(切断请求) | 被调方 → 调用方(返回兜底) | 入口 → 服务(拦截请求) |
| 时间维度 | 事后响应(已有故障) | 事中兜底(正在过载) | 事前预防(流量未进入) |
| 决策依据 | 失败率 / 慢调用率 | 系统负载 / 依赖状态 | QPS / 并发数 / 令牌 |
| 恢复方式 | 自动(冷却 → 半开 → 关闭) | 自动(条件消失后恢复) | 自动(下一个时间窗口) |
| 对用户的影响 | 快速失败 + 降级兜底 | 有损但可用的服务 | 部分请求被拒绝 |
| 典型框架 | Resilience4j, Sentinel, Hystrix | Sentinel, Hystrix, 业务逻辑 | Sentinel, Guava, Nginx, Redis |
| 组合 | 触发链 | 效果 | 典型场景 |
|---|---|---|---|
| 限流 → 降级 | QPS 超限触发限流 → 对溢出请求执行降级兜底 | 核心用户不受影响,超量请求获得友好提示 | 秒杀活动:限量用户正常下单,其余提示"已售罄" |
| 熔断 → 降级 | 下游服务失败率高触发熔断 → 降级返回缓存/默认数据 | 调用方不被阻塞,用户仍能看到有用内容 | 推荐服务挂了 → 返回热门榜单作为兜底 |
| 限流 → 熔断 | 网关限流不足 → 下游被打垮 → 调用方熔断保护自己 | 多层防御,一层失效后下一层兜底 | 大促期间:Nginx 限流 → 网关限流 → 应用熔断 |
| 限流 + 熔断 + 降级 | 全链路弹性:限流防入口 → 熔断防级联 → 降级保体验 | 三重保障,即使部分服务不可用,用户体验不中断 | 大型电商:双十一等高并发场景的标准配置 |
请求到达,首先通过限流器。令牌桶/滑动窗口检查当前 QPS 是否超限。超限则返回 429 Too Many Requests,或走降级逻辑。
通过限流后,检查目标服务的熔断器状态。如果 OPEN,直接快速失败,走降级逻辑(不实际调用下游)。
限流和熔断都通过,真正发出RPC调用。记录调用的成功/失败/超时,用于更新熔断器统计。
如果调用失败、超时、被限流或被熔断,执行预先定义好的降级逻辑:返回缓存、默认值、或友好提示。
Sentinel 是少数能同时覆盖熔断、降级、限流三个模式的框架,非常适合作为一体化方案。
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| Java 微服务(新项目) | Sentinel | 熔断+降级+限流一体化,可视化控制台,阿里大规模验证 |
| Java 微服务(小团队) | Resilience4j | 轻量、函数式风格、Spring Cloud 官方推荐 |
| Go 微服务 | Sentinel-Go + 自研熔断器 | Sentinel 有 Go SDK,也可用 gobreaker 等轻量库 |
| Python 微服务 | pybreaker + 自研令牌桶 | Python 生态轻量库组合,令牌桶实现简单 |
| 网关层限流 | Nginx / APISIX / Kong | 接入层统一限流,性能最高,运维成熟 |
| 分布式限流 | Redis + Lua | 原子操作保证精确,跨实例共享配额 |