限流:我最多扛多少请求,多了直接拦在外边。
熔断:你老挂 / 老慢,我就不调你了,直接断开。
降级:整体不能挂,非核心功能先停 / 简化,保核心。
三者都是微服务高可用、防雪崩的手段。
限流(Rate Limiting)
目的:保护自己,不让流量打崩服务。
核心思想
控制单位时间内的请求数,超过阈值直接拒绝 / 排队。
常见场景
接口 QPS 限制
防爬虫、防恶意刷接口
秒杀、热点商品防击穿
常见策略
计数器限流
滑动窗口
漏桶(Leaky Bucket)
令牌桶(Token Bucket)——Spring Cloud Gateway、Sentinel 常用
需要队列等待的场景

熔断(Circuit Breaker)
目的:防止连锁故障,避免雪崩。
核心思想
调用下游服务时:
失败率 / 超时率达到阈值
自动切断调用,不再请求下游
等一段时间半开试探,恢复正常再闭合
三个状态
闭合(Closed):正常调用
打开(Open):触发熔断,直接失败
半开(Half-Open):放少量请求试探,恢复则闭合
典型组件
Resilience4j
Sentinel
Hystrix(已停更)
降级(Degradation)
目的:保主线,弃支线,保证系统不死。
核心思想
压力大 / 出问题时:
关掉非核心功能
返回兜底数据、默认值、缓存数据
简化流程,减少计算 / 调用
降级什么
非核心接口:推荐、热搜、统计
非核心查询:复杂计算、多表联查
第三方依赖:短信、日志上报、埋点
总结

Sentinel (阿里开源,Apache 孵化)
1. 核心定位
轻量级、高性能、无依赖、Java/Go/C++ 多语言
三大能力:流量控制、熔断降级、系统负载保护
无缝整合:Spring Cloud、Dubbo、gRPC、Web 等
2. 核心原理:Slot 责任链
请求依次通过插槽:
NodeSelectorSlot:构建调用链路
ClusterBuilderSlot:集群统计
LogSlot:日志
StatisticSlot:指标统计(RT、QPS、异常)
FlowSlot:限流
DegradeSlot:熔断降级
SystemSlot:系统保护(CPU/Load)
3. 限流(FlowSlot)实现
(1)限流维度
QPS:每秒请求数(最常用)
线程数:限制并发线程,防慢调用占资源
热点参数:对商品 ID、用户 ID、IP 限流
调用来源:网关、服务间调用区分控制
(2)限流算法(Sentinel 支持)
滑动窗口:精确统计,解决固定窗口边界问题
令牌桶(默认):支持突发流量,匀速放行
漏桶:严格匀速,防流量毛刺
预热模式(Warm Up):冷启动低阈值,逐步放开,防冷服务被打垮
(3)限流控制行为
快速失败:直接报错(默认)
匀速排队:等待执行,适合消息队列、批处理
预热启动:冷启动保护
(4)代码示例(注解版)
// 1. 引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>sentinel-spring-boot-starter</artifactId>
<version>1.8.6</version>
</dependency>
// 2. 接口限流(QPS=100,线程=20)
@SentinelResource(
value = "getOrder",
blockHandler = "flowHandler", // 限流兜底
fallback = "fallbackHandler" // 异常/熔断兜底
)
@GetMapping("/order/{id}")
public Order getOrder(@PathVariable Long id) {
return orderService.getById(id);
}
// 限流兜底
public Order flowHandler(Long id, BlockException e) {
return Order.error("访问繁忙,请稍后");
}
// 熔断/异常兜底
public Order fallbackHandler(Long id, Throwable e) {
return Order.cacheGet(orderService.getCache(id));
}
推荐使用自定义注解。
4. 熔断降级(DegradeSlot)实现
(1)三种熔断策略(核心)Sentinel
慢调用比例(SLOW_REQUEST_RATIO)
RT > 阈值(如 500ms)为慢调用
单位时间(1s)请求数 > 最小请求(5)
慢调用比例 > 阈值(0.8 → 80%)→ 熔断Sentinel
异常比例(ERROR_RATIO)
异常数 / 总数 > 阈值(0.5 → 50%)→ 熔断Sentinel
异常数(ERROR_COUNT)
单位时间异常数 > 阈值 → 熔断Sentinel
(2)熔断状态流转
Closed:正常,统计指标
Open:熔断,拒绝所有请求,持续 timeWindow=5s
Half-Open:5s 后放行 1 个探测
成功 → Closed
失败 → 重回 Open,重新计时
(3)熔断规则配置
// 代码配置(也支持控制台、Nacos/Apollo)
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("getOrder");//给名为 getOrder 的接口,注册一条熔断规则:异常比例超过 50% → 熔断 10 秒
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例
rule.setCount(0.5); // 50%异常
rule.setTimeWindow(10); // 熔断10秒
rule.setMinRequestAmount(5); // 最小5个请求才统计
rules.add(rule);
DegradeRuleManager.loadRules(rules);
放置位置
1.新建一个配置类(推荐)
import com.alibaba.csp.sentinel.datasource.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SentinelDegradeConfig {
// 项目启动后自动执行一次
@PostConstruct
public void initDegradeRules() {
// 1. 创建规则列表
List<DegradeRule> rules = new ArrayList<>();
// 2. 创建熔断规则
DegradeRule rule = new DegradeRule();
rule.setResource("getOrder"); // 你的资源名(接口名)
rule.setGrade(DEGRADE_GRADE_EXCEPTION_RATIO); // 按异常比例熔断
rule.setCount(0.5); // 异常比例 50%
rule.setTimeWindow(10); // 熔断 10 秒
rule.setMinRequestAmount(5); // 最少 5 个请求才开始统计
// 3. 加入规则
rules.add(rule);
// 4. 加载规则到 Sentinel(关键!)
DegradeRuleManager.loadRules(rules);
}
}
2.放在启动类里(最简单)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
// 这里直接写熔断规则!
// ... 上面那段代码 ...
}
}
- 系统保护(SystemSlot)
按 CPU、Load、内存、RT、入口 QPS 全局保护
例:CPU>80%,自动拒绝新请求,防雪崩 - 控制台(Dashboard)
实时监控、规则配置、链路查看、机器管理
生产必备:动态推规则、实时告警