前言
在微服务体系中,服务调用链错综复杂,一个下游服务卡顿、超时、流量暴涨,就会向上传导,引发级联雪崩。Sentinel 是阿里开源的流量防护组件,核心能力:限流、熔断降级、线程隔离、系统自适应保护、热点参数防护。
本文结合真实业务案例:大促领券活动,过载时关闭领券写接口,但保留券查询读接口可用,完整讲解Sentinel核心概念、两种隔离模式、规则配置、代码示例、原理图、踩坑总结、对比表格,文末附带复盘总结与面试思考题。
核心目标:保护自身服务,也保护下游依赖,故障不扩散,做到部分功能降级,核心链路可用。
第一部分:Sentinel 基础概念
1.1 什么是Sentinel
Sentinel 面向分布式微服务的流量控制防护组件。核心工作模式:资源埋点 → 设置规则 → 运行时统计QPS、线程数、响应时间、异常比例 → 触发规则执行防护动作。
- 资源Resource:需要保护的对象,可以是接口、方法、代码块;通过注解@SentinelResource或者API埋点定义。
- 规则Rule:流控规则、熔断降级规则、系统规则、热点参数规则。
- Slot责任链:Sentinel底层Slot链依次执行统计、流控、熔断、隔离等逻辑。
- BlockException:被限流/隔离触发抛出的基础异常;业务捕获该异常做降级兜底逻辑。
和Hystrix对比:Hystrix主要以线程池隔离为主;Sentinel支持信号量隔离,也支持线程池隔离,同时提供丰富限流能力,Hystrix已经停止维护,微服务主流选型Sentinel。
1.2 微服务雪崩是怎么发生的
#mermaid-svg-BTxSC63A7w0kovEi{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BTxSC63A7w0kovEi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BTxSC63A7w0kovEi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BTxSC63A7w0kovEi .error-icon{fill:#552222;}#mermaid-svg-BTxSC63A7w0kovEi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BTxSC63A7w0kovEi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BTxSC63A7w0kovEi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BTxSC63A7w0kovEi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BTxSC63A7w0kovEi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BTxSC63A7w0kovEi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BTxSC63A7w0kovEi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BTxSC63A7w0kovEi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BTxSC63A7w0kovEi .marker.cross{stroke:#333333;}#mermaid-svg-BTxSC63A7w0kovEi svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BTxSC63A7w0kovEi p{margin:0;}#mermaid-svg-BTxSC63A7w0kovEi .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-BTxSC63A7w0kovEi .cluster-label text{fill:#333;}#mermaid-svg-BTxSC63A7w0kovEi .cluster-label span{color:#333;}#mermaid-svg-BTxSC63A7w0kovEi .cluster-label span p{background-color:transparent;}#mermaid-svg-BTxSC63A7w0kovEi .label text,#mermaid-svg-BTxSC63A7w0kovEi span{fill:#333;color:#333;}#mermaid-svg-BTxSC63A7w0kovEi .node rect,#mermaid-svg-BTxSC63A7w0kovEi .node circle,#mermaid-svg-BTxSC63A7w0kovEi .node ellipse,#mermaid-svg-BTxSC63A7w0kovEi .node polygon,#mermaid-svg-BTxSC63A7w0kovEi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BTxSC63A7w0kovEi .rough-node .label text,#mermaid-svg-BTxSC63A7w0kovEi .node .label text,#mermaid-svg-BTxSC63A7w0kovEi .image-shape .label,#mermaid-svg-BTxSC63A7w0kovEi .icon-shape .label{text-anchor:middle;}#mermaid-svg-BTxSC63A7w0kovEi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BTxSC63A7w0kovEi .rough-node .label,#mermaid-svg-BTxSC63A7w0kovEi .node .label,#mermaid-svg-BTxSC63A7w0kovEi .image-shape .label,#mermaid-svg-BTxSC63A7w0kovEi .icon-shape .label{text-align:center;}#mermaid-svg-BTxSC63A7w0kovEi .node.clickable{cursor:pointer;}#mermaid-svg-BTxSC63A7w0kovEi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BTxSC63A7w0kovEi .arrowheadPath{fill:#333333;}#mermaid-svg-BTxSC63A7w0kovEi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BTxSC63A7w0kovEi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BTxSC63A7w0kovEi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BTxSC63A7w0kovEi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BTxSC63A7w0kovEi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BTxSC63A7w0kovEi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BTxSC63A7w0kovEi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BTxSC63A7w0kovEi .cluster text{fill:#333;}#mermaid-svg-BTxSC63A7w0kovEi .cluster span{color:#333;}#mermaid-svg-BTxSC63A7w0kovEi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BTxSC63A7w0kovEi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BTxSC63A7w0kovEi rect.text{fill:none;stroke-width:0;}#mermaid-svg-BTxSC63A7w0kovEi .icon-shape,#mermaid-svg-BTxSC63A7w0kovEi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BTxSC63A7w0kovEi .icon-shape p,#mermaid-svg-BTxSC63A7w0kovEi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BTxSC63A7w0kovEi .icon-shape .label rect,#mermaid-svg-BTxSC63A7w0kovEi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BTxSC63A7w0kovEi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BTxSC63A7w0kovEi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BTxSC63A7w0kovEi :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
网关
活动领券服务
券库存服务
用户信息服务
券库存服务慢/卡顿大量请求堆积
请求堆积,线程耗尽
新请求全部阻塞
领券服务线程打满连带券查询接口也不可用
现象:下游服务响应变慢,上游大量请求堆积,线程耗尽,整个服务所有接口卡死,哪怕和故障下游无关的接口也无法响应,这就是服务雪崩。
防护手段:限流、熔断降级、线程/信号量隔离。
1.3 快速引入依赖(Maven)
<!– sentinel spring cloud alibaba starter –>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
简单资源埋点示例,注解方式:
/**
* value: 资源名称
* blockHandler: 限流/隔离触发的兜底函数
* fallback: 业务异常的降级函数
*/
@SentinelResource(value = "receiveCoupon", blockHandler = "receiveCouponBlockHandler")
public String receiveCoupon(Long activityId, Long userId){
// 领券业务逻辑
return "领券成功";
}
// blockHandler 兜底,入参必须带上BlockException
public String receiveCouponBlockHandler(Long activityId, Long userId, BlockException ex){
log.warn("领券接口被流量防护拦截", ex);
return "活动访问过于火爆,请稍后重试";
}
⚠️坑点:@SentinelResource注解只对public方法生效,同类内部调用注解不生效,不会走Sentinel防护逻辑。
第二部分:流量限流(FlowRule)
2.1 限流核心概念
限流:限制资源的访问速率,防止请求量超过服务处理能力。Sentinel流控规则FlowRule。
流控模式:
#mermaid-svg-IonKIXmdK5N1MuZC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IonKIXmdK5N1MuZC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IonKIXmdK5N1MuZC .error-icon{fill:#552222;}#mermaid-svg-IonKIXmdK5N1MuZC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IonKIXmdK5N1MuZC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IonKIXmdK5N1MuZC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IonKIXmdK5N1MuZC .marker.cross{stroke:#333333;}#mermaid-svg-IonKIXmdK5N1MuZC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IonKIXmdK5N1MuZC p{margin:0;}#mermaid-svg-IonKIXmdK5N1MuZC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-IonKIXmdK5N1MuZC .cluster-label text{fill:#333;}#mermaid-svg-IonKIXmdK5N1MuZC .cluster-label span{color:#333;}#mermaid-svg-IonKIXmdK5N1MuZC .cluster-label span p{background-color:transparent;}#mermaid-svg-IonKIXmdK5N1MuZC .label text,#mermaid-svg-IonKIXmdK5N1MuZC span{fill:#333;color:#333;}#mermaid-svg-IonKIXmdK5N1MuZC .node rect,#mermaid-svg-IonKIXmdK5N1MuZC .node circle,#mermaid-svg-IonKIXmdK5N1MuZC .node ellipse,#mermaid-svg-IonKIXmdK5N1MuZC .node polygon,#mermaid-svg-IonKIXmdK5N1MuZC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IonKIXmdK5N1MuZC .rough-node .label text,#mermaid-svg-IonKIXmdK5N1MuZC .node .label text,#mermaid-svg-IonKIXmdK5N1MuZC .image-shape .label,#mermaid-svg-IonKIXmdK5N1MuZC .icon-shape .label{text-anchor:middle;}#mermaid-svg-IonKIXmdK5N1MuZC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IonKIXmdK5N1MuZC .rough-node .label,#mermaid-svg-IonKIXmdK5N1MuZC .node .label,#mermaid-svg-IonKIXmdK5N1MuZC .image-shape .label,#mermaid-svg-IonKIXmdK5N1MuZC .icon-shape .label{text-align:center;}#mermaid-svg-IonKIXmdK5N1MuZC .node.clickable{cursor:pointer;}#mermaid-svg-IonKIXmdK5N1MuZC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IonKIXmdK5N1MuZC .arrowheadPath{fill:#333333;}#mermaid-svg-IonKIXmdK5N1MuZC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IonKIXmdK5N1MuZC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IonKIXmdK5N1MuZC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IonKIXmdK5N1MuZC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IonKIXmdK5N1MuZC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IonKIXmdK5N1MuZC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IonKIXmdK5N1MuZC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IonKIXmdK5N1MuZC .cluster text{fill:#333;}#mermaid-svg-IonKIXmdK5N1MuZC .cluster span{color:#333;}#mermaid-svg-IonKIXmdK5N1MuZC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IonKIXmdK5N1MuZC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IonKIXmdK5N1MuZC rect.text{fill:none;stroke-width:0;}#mermaid-svg-IonKIXmdK5N1MuZC .icon-shape,#mermaid-svg-IonKIXmdK5N1MuZC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IonKIXmdK5N1MuZC .icon-shape p,#mermaid-svg-IonKIXmdK5N1MuZC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IonKIXmdK5N1MuZC .icon-shape .label rect,#mermaid-svg-IonKIXmdK5N1MuZC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IonKIXmdK5N1MuZC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IonKIXmdK5N1MuZC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IonKIXmdK5N1MuZC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
流控模式
直接限流
资源R自身QPS达到阈值拦截R的请求
关联限流
监控关联资源R_writeR_write流量超限 → 拦截R_read
案例:领券写流量暴增,限制查询接口
链路限流
资源R可从多个入口调用只统计入口Entrance1的流量,Entrance2不统计
用户
流控效果:
- 快速失败:达到阈值直接抛出BlockException;
- Warm Up(预热):冷启动,阈值缓慢上升,应对系统刚启动JIT未预热;
- 排队等待:漏桶模式,匀速处理请求,允许请求排队,设置最大等待时间。
#mermaid-svg-wZWW4movyUF5BZLe{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wZWW4movyUF5BZLe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wZWW4movyUF5BZLe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wZWW4movyUF5BZLe .error-icon{fill:#552222;}#mermaid-svg-wZWW4movyUF5BZLe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wZWW4movyUF5BZLe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wZWW4movyUF5BZLe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wZWW4movyUF5BZLe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wZWW4movyUF5BZLe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wZWW4movyUF5BZLe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wZWW4movyUF5BZLe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wZWW4movyUF5BZLe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wZWW4movyUF5BZLe .marker.cross{stroke:#333333;}#mermaid-svg-wZWW4movyUF5BZLe svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wZWW4movyUF5BZLe p{margin:0;}#mermaid-svg-wZWW4movyUF5BZLe .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wZWW4movyUF5BZLe .cluster-label text{fill:#333;}#mermaid-svg-wZWW4movyUF5BZLe .cluster-label span{color:#333;}#mermaid-svg-wZWW4movyUF5BZLe .cluster-label span p{background-color:transparent;}#mermaid-svg-wZWW4movyUF5BZLe .label text,#mermaid-svg-wZWW4movyUF5BZLe span{fill:#333;color:#333;}#mermaid-svg-wZWW4movyUF5BZLe .node rect,#mermaid-svg-wZWW4movyUF5BZLe .node circle,#mermaid-svg-wZWW4movyUF5BZLe .node ellipse,#mermaid-svg-wZWW4movyUF5BZLe .node polygon,#mermaid-svg-wZWW4movyUF5BZLe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wZWW4movyUF5BZLe .rough-node .label text,#mermaid-svg-wZWW4movyUF5BZLe .node .label text,#mermaid-svg-wZWW4movyUF5BZLe .image-shape .label,#mermaid-svg-wZWW4movyUF5BZLe .icon-shape .label{text-anchor:middle;}#mermaid-svg-wZWW4movyUF5BZLe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wZWW4movyUF5BZLe .rough-node .label,#mermaid-svg-wZWW4movyUF5BZLe .node .label,#mermaid-svg-wZWW4movyUF5BZLe .image-shape .label,#mermaid-svg-wZWW4movyUF5BZLe .icon-shape .label{text-align:center;}#mermaid-svg-wZWW4movyUF5BZLe .node.clickable{cursor:pointer;}#mermaid-svg-wZWW4movyUF5BZLe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wZWW4movyUF5BZLe .arrowheadPath{fill:#333333;}#mermaid-svg-wZWW4movyUF5BZLe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wZWW4movyUF5BZLe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wZWW4movyUF5BZLe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wZWW4movyUF5BZLe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wZWW4movyUF5BZLe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wZWW4movyUF5BZLe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wZWW4movyUF5BZLe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wZWW4movyUF5BZLe .cluster text{fill:#333;}#mermaid-svg-wZWW4movyUF5BZLe .cluster span{color:#333;}#mermaid-svg-wZWW4movyUF5BZLe div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wZWW4movyUF5BZLe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wZWW4movyUF5BZLe rect.text{fill:none;stroke-width:0;}#mermaid-svg-wZWW4movyUF5BZLe .icon-shape,#mermaid-svg-wZWW4movyUF5BZLe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wZWW4movyUF5BZLe .icon-shape p,#mermaid-svg-wZWW4movyUF5BZLe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wZWW4movyUF5BZLe .icon-shape .label rect,#mermaid-svg-wZWW4movyUF5BZLe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wZWW4movyUF5BZLe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wZWW4movyUF5BZLe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wZWW4movyUF5BZLe :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
流控效果
快速失败
QPS超限 → 立刻拒绝,抛出BlockException
Warm Up预热
启动初期阈值低,逐步提升至设定阈值避免冷启动流量打垮服务
排队等待-漏桶
请求进入队列,匀速放行超出最大等待时间直接拒绝
| resource | 受保护资源名 | 和@SentinelResourcevalue保持一致 |
| count | 阈值 | QPS阈值,每秒允许请求数 |
| grade | 阈值类型:0线程数,1 QPS | 绝大多数场景使用QPS(1) |
| strategy | 流控模式:直接/关联/链路 | 大促写过载保护读使用关联模式 |
| controlBehavior | 流控效果:快速失败/warmup/排队 | 接口普通限流用快速失败;异步消息可用排队等待 |
Java代码定义流控规则示例(也可以在Sentinel控制台配置持久化到Nacos)
private void initFlowRule(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("receiveCoupon");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(200); // QPS限制200
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
2.2 业务案例:大促活动过载:关闭领券(写),保留券查询(读)
业务需求:活动流量洪峰,领券写接口过载,直接限制领券,但是券查询读接口必须正常对外提供服务。
方案:使用关联流控模式
- 资源A:receiveCoupon 领券写接口
- 资源B:queryCoupon 券查询读接口
- 设置流控规则:对queryCoupon设置关联资源为receiveCoupon。
含义:当receiveCoupon领券的QPS超过阈值,触发限流,限制领券;查询接口本身不受影响。
#mermaid-svg-vrMEVAUNPs0LHDv1{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vrMEVAUNPs0LHDv1 .error-icon{fill:#552222;}#mermaid-svg-vrMEVAUNPs0LHDv1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vrMEVAUNPs0LHDv1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .marker.cross{stroke:#333333;}#mermaid-svg-vrMEVAUNPs0LHDv1 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vrMEVAUNPs0LHDv1 p{margin:0;}#mermaid-svg-vrMEVAUNPs0LHDv1 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster-label text{fill:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster-label span{color:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster-label span p{background-color:transparent;}#mermaid-svg-vrMEVAUNPs0LHDv1 .label text,#mermaid-svg-vrMEVAUNPs0LHDv1 span{fill:#333;color:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .node rect,#mermaid-svg-vrMEVAUNPs0LHDv1 .node circle,#mermaid-svg-vrMEVAUNPs0LHDv1 .node ellipse,#mermaid-svg-vrMEVAUNPs0LHDv1 .node polygon,#mermaid-svg-vrMEVAUNPs0LHDv1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .rough-node .label text,#mermaid-svg-vrMEVAUNPs0LHDv1 .node .label text,#mermaid-svg-vrMEVAUNPs0LHDv1 .image-shape .label,#mermaid-svg-vrMEVAUNPs0LHDv1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-vrMEVAUNPs0LHDv1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .rough-node .label,#mermaid-svg-vrMEVAUNPs0LHDv1 .node .label,#mermaid-svg-vrMEVAUNPs0LHDv1 .image-shape .label,#mermaid-svg-vrMEVAUNPs0LHDv1 .icon-shape .label{text-align:center;}#mermaid-svg-vrMEVAUNPs0LHDv1 .node.clickable{cursor:pointer;}#mermaid-svg-vrMEVAUNPs0LHDv1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .arrowheadPath{fill:#333333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vrMEVAUNPs0LHDv1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vrMEVAUNPs0LHDv1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vrMEVAUNPs0LHDv1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster text{fill:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 .cluster span{color:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vrMEVAUNPs0LHDv1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vrMEVAUNPs0LHDv1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-vrMEVAUNPs0LHDv1 .icon-shape,#mermaid-svg-vrMEVAUNPs0LHDv1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vrMEVAUNPs0LHDv1 .icon-shape p,#mermaid-svg-vrMEVAUNPs0LHDv1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vrMEVAUNPs0LHDv1 .icon-shape .label rect,#mermaid-svg-vrMEVAUNPs0LHDv1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vrMEVAUNPs0LHDv1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vrMEVAUNPs0LHDv1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vrMEVAUNPs0LHDv1 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
大促活动服务
QPS 超过 300 触发阈值
拦截写请求
领券 receiveCoupon 写资源
券查询 queryCoupon 读资源
流控规则资源:queryCoupon模式:关联关联资源:receiveCoupon阈值QPS=300
用户
查询读接口不受影响,正常返回
注意:关联流控:阈值是关联资源的指标,限流作用在当前配置的资源上。不要搞反配置对象。
Java代码定义流控规则示例(也可以在Sentinel控制台配置持久化到Nacos)
private void initFlowRule(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("receiveCoupon");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(200); // QPS限制200
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
2.2 业务案例:大促活动过载:关闭领券(写),保留券查询(读)
业务需求:活动流量洪峰,领券写接口过载,直接限制领券,但是券查询读接口必须正常对外提供服务。
方案:使用关联流控模式
- 资源A:receiveCoupon 领券写接口
- 资源B:queryCoupon 券查询读接口
- 设置流控规则:对queryCoupon设置关联资源为receiveCoupon。
含义:当receiveCoupon领券的QPS超过阈值,触发限流,限制领券;查询接口本身不受影响。
#mermaid-svg-f6DXgEMY2jXgcBwm{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-f6DXgEMY2jXgcBwm .error-icon{fill:#552222;}#mermaid-svg-f6DXgEMY2jXgcBwm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-f6DXgEMY2jXgcBwm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-f6DXgEMY2jXgcBwm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-f6DXgEMY2jXgcBwm .marker.cross{stroke:#333333;}#mermaid-svg-f6DXgEMY2jXgcBwm svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-f6DXgEMY2jXgcBwm p{margin:0;}#mermaid-svg-f6DXgEMY2jXgcBwm .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster-label text{fill:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster-label span{color:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster-label span p{background-color:transparent;}#mermaid-svg-f6DXgEMY2jXgcBwm .label text,#mermaid-svg-f6DXgEMY2jXgcBwm span{fill:#333;color:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm .node rect,#mermaid-svg-f6DXgEMY2jXgcBwm .node circle,#mermaid-svg-f6DXgEMY2jXgcBwm .node ellipse,#mermaid-svg-f6DXgEMY2jXgcBwm .node polygon,#mermaid-svg-f6DXgEMY2jXgcBwm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-f6DXgEMY2jXgcBwm .rough-node .label text,#mermaid-svg-f6DXgEMY2jXgcBwm .node .label text,#mermaid-svg-f6DXgEMY2jXgcBwm .image-shape .label,#mermaid-svg-f6DXgEMY2jXgcBwm .icon-shape .label{text-anchor:middle;}#mermaid-svg-f6DXgEMY2jXgcBwm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-f6DXgEMY2jXgcBwm .rough-node .label,#mermaid-svg-f6DXgEMY2jXgcBwm .node .label,#mermaid-svg-f6DXgEMY2jXgcBwm .image-shape .label,#mermaid-svg-f6DXgEMY2jXgcBwm .icon-shape .label{text-align:center;}#mermaid-svg-f6DXgEMY2jXgcBwm .node.clickable{cursor:pointer;}#mermaid-svg-f6DXgEMY2jXgcBwm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-f6DXgEMY2jXgcBwm .arrowheadPath{fill:#333333;}#mermaid-svg-f6DXgEMY2jXgcBwm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-f6DXgEMY2jXgcBwm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-f6DXgEMY2jXgcBwm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-f6DXgEMY2jXgcBwm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-f6DXgEMY2jXgcBwm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-f6DXgEMY2jXgcBwm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster text{fill:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm .cluster span{color:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-f6DXgEMY2jXgcBwm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-f6DXgEMY2jXgcBwm rect.text{fill:none;stroke-width:0;}#mermaid-svg-f6DXgEMY2jXgcBwm .icon-shape,#mermaid-svg-f6DXgEMY2jXgcBwm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-f6DXgEMY2jXgcBwm .icon-shape p,#mermaid-svg-f6DXgEMY2jXgcBwm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-f6DXgEMY2jXgcBwm .icon-shape .label rect,#mermaid-svg-f6DXgEMY2jXgcBwm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-f6DXgEMY2jXgcBwm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-f6DXgEMY2jXgcBwm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-f6DXgEMY2jXgcBwm :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
大促活动服务
QPS 超过 300 触发阈值
拦截写请求
领券 receiveCoupon 写资源
券查询 queryCoupon 读资源
流控规则资源:queryCoupon模式:关联关联资源:receiveCoupon阈值QPS=300
User
查询读接口不受影响,正常返回
注意:关联流控:阈值是关联资源的指标,限流作用在当前配置的资源上。不要搞反配置对象。
第三部分:熔断降级 DegradeRule
3.1 熔断降级是什么
限流解决流量过大;熔断降级解决下游依赖不稳定、慢调用问题。
当调用下游服务出现大量慢调用、异常,达到阈值,Sentinel打开熔断器,短时间内直接拒绝调用该资源,执行降级兜底逻辑,避免大量超时请求堆积耗尽线程。
Sentinel 三种熔断策略:
| 慢调用比例 | 0 | 超过最大RT的请求占比达到阈值 | 下游接口响应缓慢,IO耗时高 |
| 异常比例 | 1 | 异常请求占比超过阈值 | 业务抛出异常,报错激增 |
| 异常数 | 2 | 单位时间内异常总数达到阈值 | 短时间大量报错 |
熔断器状态流转:
#mermaid-svg-fF9V8t1FfBCatvkJ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fF9V8t1FfBCatvkJ .error-icon{fill:#552222;}#mermaid-svg-fF9V8t1FfBCatvkJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fF9V8t1FfBCatvkJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fF9V8t1FfBCatvkJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ .marker.cross{stroke:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fF9V8t1FfBCatvkJ p{margin:0;}#mermaid-svg-fF9V8t1FfBCatvkJ defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-fF9V8t1FfBCatvkJ g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-fF9V8t1FfBCatvkJ g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-fF9V8t1FfBCatvkJ g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-fF9V8t1FfBCatvkJ g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-fF9V8t1FfBCatvkJ .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-fF9V8t1FfBCatvkJ .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-fF9V8t1FfBCatvkJ .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-fF9V8t1FfBCatvkJ .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-fF9V8t1FfBCatvkJ .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-fF9V8t1FfBCatvkJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fF9V8t1FfBCatvkJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fF9V8t1FfBCatvkJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fF9V8t1FfBCatvkJ .edgeLabel .label text{fill:#333;}#mermaid-svg-fF9V8t1FfBCatvkJ .label div .edgeLabel{color:#333;}#mermaid-svg-fF9V8t1FfBCatvkJ .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-fF9V8t1FfBCatvkJ .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-fF9V8t1FfBCatvkJ .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-fF9V8t1FfBCatvkJ .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ #statediagram-barbEnd{fill:#333333;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fF9V8t1FfBCatvkJ .cluster-label,#mermaid-svg-fF9V8t1FfBCatvkJ .nodeLabel{color:#131300;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-fF9V8t1FfBCatvkJ .note-edge{stroke-dasharray:5;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-note text{fill:black;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram-note .nodeLabel{color:black;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagram .edgeLabel{color:red;}#mermaid-svg-fF9V8t1FfBCatvkJ #dependencyStart,#mermaid-svg-fF9V8t1FfBCatvkJ #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-fF9V8t1FfBCatvkJ .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fF9V8t1FfBCatvkJ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
初始关闭状态,正常放行请求
统计窗口内达到熔断阈值,打开熔断
熔断时间窗口结束,进入半开
探测请求成功,关闭熔断器恢复
探测请求失败,重新打开熔断
CLOSED
OPEN
HALF_OPEN
- CLOSED关闭:正常放行请求,做指标统计;
- OPEN打开:熔断开启,所有请求直接走降级,不执行业务调用;
- HALF_OPEN半开:时间窗口到期,放行少量探测请求,探测下游是否恢复。
DegradeRule关键参数:
代码示例:慢调用比例熔断
DegradeRule degradeRule = new DegradeRule("couponStockApi")
.setGrade(RuleConstant.DEGRADE_GRADE_SLOW_RATIO)
.setCount(500) // RT大于500ms判定为慢调用
.setTimeWindow(10) //熔断窗口10秒
.setSlowRatioThreshold(0.6) //60%请求慢调用触发熔断
.setMinRequestAmount(10);
3.2 fallback 与 blockHandler 的区别(高频面试)
| 触发时机 | 限流、熔断、隔离等Sentinel流量防护抛出BlockException | 业务方法本身抛出任意异常 |
| 作用 | 流量防护拦截兜底 | 业务异常兜底返回降级结果 |
| 异常入参 | 必须携带BlockException | 不需要 |
| 典型场景 | 访问太火爆,请稍后重试 | 下游出错返回缓存数据、默认值 |
最佳实践:两个同时配置。流量打满走blockHandler;业务报错走fallback。
第四部分:线程隔离 & 信号量隔离
4.1 两种隔离模式对比(面试重中之重)
隔离目的:某个依赖的慢调用,只耗尽分配给它的资源,不能拖垮整个服务全部线程。
Sentinel 默认是信号量隔离;Sentinel也支持线程池隔离(类似Hystrix)。
⚠️Sentinel注解默认不是线程池隔离!很多开发者踩坑。
| 底层实现 | 当前调用线程执行,通过计数器控制并发数 | 独立业务线程池执行任务 |
| 线程来源 | Tomcat/Web容器线程 | 自定义隔离线程池 |
| 超时控制 | 不支持线程超时中断 | 支持线程池超时 |
| 资源开销 | 轻量,无线程创建开销 | 较重,每个资源创建线程池 |
| 上下文传递 | 请求上下文可直接传递 | 需要手动传递上下文(MDC、请求头) |
| 适用场景 | 内部接口、内存运算、本地逻辑;不依赖超时中断 | 外部RPC调用、第三方HTTP调用,需要超时销毁阻塞线程 |
#mermaid-svg-97LM7t3uDvk75NwS{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-97LM7t3uDvk75NwS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-97LM7t3uDvk75NwS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-97LM7t3uDvk75NwS .error-icon{fill:#552222;}#mermaid-svg-97LM7t3uDvk75NwS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-97LM7t3uDvk75NwS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-97LM7t3uDvk75NwS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-97LM7t3uDvk75NwS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-97LM7t3uDvk75NwS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-97LM7t3uDvk75NwS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-97LM7t3uDvk75NwS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-97LM7t3uDvk75NwS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-97LM7t3uDvk75NwS .marker.cross{stroke:#333333;}#mermaid-svg-97LM7t3uDvk75NwS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-97LM7t3uDvk75NwS p{margin:0;}#mermaid-svg-97LM7t3uDvk75NwS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-97LM7t3uDvk75NwS .cluster-label text{fill:#333;}#mermaid-svg-97LM7t3uDvk75NwS .cluster-label span{color:#333;}#mermaid-svg-97LM7t3uDvk75NwS .cluster-label span p{background-color:transparent;}#mermaid-svg-97LM7t3uDvk75NwS .label text,#mermaid-svg-97LM7t3uDvk75NwS span{fill:#333;color:#333;}#mermaid-svg-97LM7t3uDvk75NwS .node rect,#mermaid-svg-97LM7t3uDvk75NwS .node circle,#mermaid-svg-97LM7t3uDvk75NwS .node ellipse,#mermaid-svg-97LM7t3uDvk75NwS .node polygon,#mermaid-svg-97LM7t3uDvk75NwS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-97LM7t3uDvk75NwS .rough-node .label text,#mermaid-svg-97LM7t3uDvk75NwS .node .label text,#mermaid-svg-97LM7t3uDvk75NwS .image-shape .label,#mermaid-svg-97LM7t3uDvk75NwS .icon-shape .label{text-anchor:middle;}#mermaid-svg-97LM7t3uDvk75NwS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-97LM7t3uDvk75NwS .rough-node .label,#mermaid-svg-97LM7t3uDvk75NwS .node .label,#mermaid-svg-97LM7t3uDvk75NwS .image-shape .label,#mermaid-svg-97LM7t3uDvk75NwS .icon-shape .label{text-align:center;}#mermaid-svg-97LM7t3uDvk75NwS .node.clickable{cursor:pointer;}#mermaid-svg-97LM7t3uDvk75NwS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-97LM7t3uDvk75NwS .arrowheadPath{fill:#333333;}#mermaid-svg-97LM7t3uDvk75NwS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-97LM7t3uDvk75NwS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-97LM7t3uDvk75NwS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-97LM7t3uDvk75NwS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-97LM7t3uDvk75NwS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-97LM7t3uDvk75NwS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-97LM7t3uDvk75NwS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-97LM7t3uDvk75NwS .cluster text{fill:#333;}#mermaid-svg-97LM7t3uDvk75NwS .cluster span{color:#333;}#mermaid-svg-97LM7t3uDvk75NwS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-97LM7t3uDvk75NwS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-97LM7t3uDvk75NwS rect.text{fill:none;stroke-width:0;}#mermaid-svg-97LM7t3uDvk75NwS .icon-shape,#mermaid-svg-97LM7t3uDvk75NwS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-97LM7t3uDvk75NwS .icon-shape p,#mermaid-svg-97LM7t3uDvk75NwS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-97LM7t3uDvk75NwS .icon-shape .label rect,#mermaid-svg-97LM7t3uDvk75NwS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-97LM7t3uDvk75NwS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-97LM7t3uDvk75NwS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-97LM7t3uDvk75NwS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
线程池隔离
线程可用
线程耗尽
Tomcat线程
独立隔离线程池
执行业务逻辑隔离池线程
触发BlockException降级
支持任务超时终止
信号量隔离(默认)
计数器未超限
超限
Tomcat线程
信号量计数器
执行业务逻辑使用Tomcat线程
触发BlockException降级
4.2 信号量隔离坑点
信号量隔离仅仅限制并发请求数量,无法中断阻塞线程。
如果下游RPC卡死不返回,Tomcat线程会一直阻塞,信号量计数器释放不了,时间久后Tomcat线程池依然会被占满。
结论:调用外部不稳定第三方服务,不要单纯依赖默认信号量隔离;优先使用线程池隔离,同时客户端必须设置超时时间。
4.3 Sentinel线程池隔离代码示例
需要手动配置SentinelThreadPoolExecutor,为资源分配独立线程池。
// 为券库存RPC资源分配独立隔离线程池
ThreadPoolExecutor pool = new SentinelThreadPoolExecutor(
5,
10,
30,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(20),
new NamedThreadFactory("sentinel-coupon-rpc-"),
new ThreadPoolExecutor.AbortPolicy()
);
// 定义线程池隔离规则
ExecutorServiceRule executorRule = new ExecutorServiceRule();
executorRule.setResource("couponStockRpc");
executorRule.setExecutor(pool);
ExecutorServiceRuleManager.loadRules(Collections.singletonList(executorRule));
4.4 隔离模式业务选型建议
补充:Hystrix只有线程池隔离和信号量隔离,没有原生限流能力;Sentinel把限流、熔断、隔离整合一套体系。
第五部分:完整业务综合场景:大促领券服务防护
业务背景:
活动领券接口 receiveCoupon(写),券查询 queryCoupon(读)。依赖下游券库存RPC服务。
需求:
#mermaid-svg-MMHn7NorVcH6JUg7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MMHn7NorVcH6JUg7 .error-icon{fill:#552222;}#mermaid-svg-MMHn7NorVcH6JUg7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MMHn7NorVcH6JUg7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MMHn7NorVcH6JUg7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MMHn7NorVcH6JUg7 .marker.cross{stroke:#333333;}#mermaid-svg-MMHn7NorVcH6JUg7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MMHn7NorVcH6JUg7 p{margin:0;}#mermaid-svg-MMHn7NorVcH6JUg7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster-label text{fill:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster-label span{color:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster-label span p{background-color:transparent;}#mermaid-svg-MMHn7NorVcH6JUg7 .label text,#mermaid-svg-MMHn7NorVcH6JUg7 span{fill:#333;color:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 .node rect,#mermaid-svg-MMHn7NorVcH6JUg7 .node circle,#mermaid-svg-MMHn7NorVcH6JUg7 .node ellipse,#mermaid-svg-MMHn7NorVcH6JUg7 .node polygon,#mermaid-svg-MMHn7NorVcH6JUg7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MMHn7NorVcH6JUg7 .rough-node .label text,#mermaid-svg-MMHn7NorVcH6JUg7 .node .label text,#mermaid-svg-MMHn7NorVcH6JUg7 .image-shape .label,#mermaid-svg-MMHn7NorVcH6JUg7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-MMHn7NorVcH6JUg7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MMHn7NorVcH6JUg7 .rough-node .label,#mermaid-svg-MMHn7NorVcH6JUg7 .node .label,#mermaid-svg-MMHn7NorVcH6JUg7 .image-shape .label,#mermaid-svg-MMHn7NorVcH6JUg7 .icon-shape .label{text-align:center;}#mermaid-svg-MMHn7NorVcH6JUg7 .node.clickable{cursor:pointer;}#mermaid-svg-MMHn7NorVcH6JUg7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MMHn7NorVcH6JUg7 .arrowheadPath{fill:#333333;}#mermaid-svg-MMHn7NorVcH6JUg7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MMHn7NorVcH6JUg7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MMHn7NorVcH6JUg7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MMHn7NorVcH6JUg7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MMHn7NorVcH6JUg7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MMHn7NorVcH6JUg7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster text{fill:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 .cluster span{color:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MMHn7NorVcH6JUg7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MMHn7NorVcH6JUg7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-MMHn7NorVcH6JUg7 .icon-shape,#mermaid-svg-MMHn7NorVcH6JUg7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MMHn7NorVcH6JUg7 .icon-shape p,#mermaid-svg-MMHn7NorVcH6JUg7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MMHn7NorVcH6JUg7 .icon-shape .label rect,#mermaid-svg-MMHn7NorVcH6JUg7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MMHn7NorVcH6JUg7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MMHn7NorVcH6JUg7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MMHn7NorVcH6JUg7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
触发限流
触发熔断
线程耗尽
User
网关
receiveCoupon 领券写
queryCoupon 券查询读
Sentinel防护链
流控规则
熔断降级规则
线程池隔离
券库存RPC下游
blockHandler降级返回
券查询读不受写限流影响保障用户可以查自己已有的券
防护规则清单总结:
🌰业务举例(对应本次大促领券场景)
网硕互联帮助中心



评论前必须登录!
注册