📹限流、熔断与降级:微服务高可用性的核心保障机制
type
Post
status
Published
date
Sep 28, 2025
slug
rate-limiting-circuit-breaker-fallback
summary
category
技术分享
tags
限流
熔断
降级
icon
password
AI summary
Blocked by
Blocking
Category
在分布式系统中,服务间依赖关系复杂,任何一点异常都可能引发连锁反应。限流、熔断、降级是应对流量冲击、故障传播和部分失效的三大利器,三者配合使用,能显著提升系统的稳定性和用户体验。本文结合实际代码,系统梳理三者的概念、关系、实践方法与最佳配置。
一、核心概念
1. 限流(Rate Limiting)
限流是对单位时间内请求数量进行显式限制的机制,目的是防止系统被突发流量击垮。
算法 | 原理简述 | 优点 | 缺点 | 是否允许突发 | 典型应用场景 | 代表实现 |
固定窗口 | 固定时间段(如1s)内计数请求,超过阈值拒绝,窗口结束清零 | 实现最简单、内存开销极低 | 临界问题(窗口边界突发可瞬间超限) | 否 | 简单并发控制、秒杀 | Redis INCR + EXPIRE |
滑动窗口 | 将时间切分成N个小窗口,滑动统计最近一段时间的总请求数 | 解决临界问题,统计更平滑 | 实现稍复杂,需维护队列 | 否 | 高并发API、Hystrix/Sentinel统计 | Sentinel滑动窗口、Guava |
漏桶 | 请求进入“桶”,以固定速率“漏出”处理,桶满则拒绝 | 输出速率绝对平滑,保护下游 | 无法应对突发(即使空闲也匀速) | 否 | 保护下游接口、匀速排队 | Nginx limit_req、Sentinel匀速排队 |
令牌桶 | 以固定速率向桶中生成令牌,请求需消耗令牌通过,桶可积累 | 允许一定突发,限制平均速率 | 短时可能有少量超发 | 是 | 网关限流、接口调用(最常用) | Guava RateLimiter、Redisson |
典型实现方式包括令牌桶、漏桶、固定窗口、滑动窗口等

只要桶中有令牌,请求就可以通过

漏桶:只有等到了水滴,才能被serve
- 漏桶:强迫“流出”匀速,保护下游不被突发打垮(更像流量整形)。
- 令牌桶:允许“流入”有一定突发,但长期平均受控(更像配额/许可制)。
固定窗口
滑动窗口

本质:主动保护系统资源,避免因请求量远超承载能力而导致整体崩溃。
2. 熔断(Circuit Breaker)
熔断器持续监控下游服务的健康状况,当错误率、超时率或并发数超过预设阈值时,自动进入“打开”状态,拒绝后续请求,直接走降级逻辑。
状态机:Closed → Open → Half-Open(探测恢复)
本质:快速失败,阻断故障扩散,避免雪崩效应。
3. 降级(Fallback)
降级是在熔断触发或服务不可用时,主动提供备选方案,使系统仍能返回部分可用结果。
降级策略分为:
- 空结果降级(非核心路径)
- 错误传递降级(核心路径)
- 跳过功能降级(可选增强功能)
- 多级降级(备用配置重试)
本质:在部分功能不可用时,保证系统基本可用性。
二、机制关系图
三、代码实践(基于 Hystrix)
1. 限流配置(并发限流)
超过 100 个并发请求时,后续请求立即失败,无需等待下游。
2. 熔断 + 降级使用示例(Wiki 检索)
3. 多级降级示例(Google Search)
四、最佳实践
熔断器配置推荐值
降级策略选择表
场景 | 推荐策略 | 返回值 | 影响范围 |
并行检索通道 | 空结果降级 | [] 或 nil | 不影响主流程 |
核心功能 | 错误传递 | 原始 error | 上层必须处理 |
可选增强功能 | 跳过功能 | nil | 仅跳过该功能 |
有备用配置 | 多级降级 | 触发 backup | 提升可用性 |
监控建议
五、总结
机制 | 核心作用 | 主要手段 | 实践原则 |
限流 | 防止过载 | 令牌桶 / MaxConcurrentRequests | 优先级最高,先保护自己 |
熔断 | 阻断故障扩散 | 错误率/慢调用 + 状态机 | 快速失败,给下游恢复时间 |
降级 | 保证基本可用 | 空结果/缓存/多级 backup | 根据功能重要性分层设计 |
实践铁律:
- 先做限流,保护系统不被击垮;
- 再做熔断,阻断故障蔓延;
- 最后做降级,确保“坏了也能用”。
三者配合得当,系统才能在高并发、故障频发的真实生产环境中保持稳定。
Prev
服务网格 | istio
Next
在k8s环境中使用vgpu | HAMI
Loading...