前言
在微服务体系中,服务调用链错综复杂,一个下游服务卡顿、超时、流量暴涨,就会向上传导,引发级联雪崩。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)
xml
<!-- sentinel spring cloud alibaba starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
简单资源埋点示例,注解方式:
java
/**
* 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_write
R_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)
java
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)
java
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 三种熔断策略:
| 熔断策略 | grade值 | 触发条件 | 适用场景 |
|---|---|---|---|
| 慢调用比例 | 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关键参数:
resource:受保护资源;grade:熔断策略;count:阈值(慢调用RT阈值 / 异常比例 / 异常数量);timeWindow:熔断打开持续时间(秒);minRequestAmount:最小请求数,低于该数值不会触发熔断;statIntervalMs:统计时间窗口,毫秒。
代码示例:慢调用比例熔断
java
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 的区别(高频面试)
| 属性 | blockHandler | fallback |
|---|---|---|
| 触发时机 | 限流、熔断、隔离等Sentinel流量防护抛出BlockException | 业务方法本身抛出任意异常 |
| 作用 | 流量防护拦截兜底 | 业务异常兜底返回降级结果 |
| 异常入参 | 必须携带BlockException | 不需要 |
| 典型场景 | 访问太火爆,请稍后重试 | 下游出错返回缓存数据、默认值 |
最佳实践:两个同时配置。流量打满走blockHandler;业务报错走fallback。
第四部分:线程隔离 & 信号量隔离
4.1 两种隔离模式对比(面试重中之重)
隔离目的:某个依赖的慢调用,只耗尽分配给它的资源,不能拖垮整个服务全部线程 。
Sentinel 默认是信号量隔离;Sentinel也支持线程池隔离(类似Hystrix)。
⚠️Sentinel注解默认不是线程池隔离!很多开发者踩坑。
| 对比维度 | 信号量隔离(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,为资源分配独立线程池。
java
// 为券库存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 隔离模式业务选型建议
- 本地内存计算、本地方法调用:信号量隔离,轻量高效;
- RPC调用、第三方http接口、IO外部依赖:线程池隔离,具备超时能力,卡死任务可以终止;
- 不要全部业务共用同一个隔离线程池,不同下游依赖使用独立线程池,防止单点故障扩散。
补充:Hystrix只有线程池隔离和信号量隔离,没有原生限流能力;Sentinel把限流、熔断、隔离整合一套体系。
第五部分:完整业务综合场景:大促领券服务防护
业务背景:
活动领券接口 receiveCoupon(写),券查询 queryCoupon(读)。依赖下游券库存RPC服务。
需求:
- 领券接口QPS限流;
- 下游券库存RPC慢调用、报错触发熔断;
- RPC调用使用线程池隔离,防止下游卡死占满tomcat线程;
- 大促过载,领券写拦截降级,券查询读不受影响;
- 限流熔断均配置兜底返回友好提示。
#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降级返回
券查询读不受写限流影响
保障用户可以查自己已有的券
防护规则清单总结:
- 写类型核心接口配置QPS流量限流,拦截突增流量;
- 使用关联流控实现读写分离防护:写资源流量过载时,仅拦截写请求,保障读资源正常可用;
- 外部RPC/第三方依赖资源配置线程池隔离 + 熔断降级规则,隔离下游故障,慢调用占满资源时触发熔断;
- 受保护资源同时配置
blockHandler流量防护兜底与fallback业务异常兜底; - 所有外部网络调用强制开启客户端超时,避免线程无限阻塞。
🌰业务举例(对应本次大促领券场景)
receiveCoupon领券写接口设置QPS限流;- 配置关联流控:监控领券写资源流量,过载只拦截领券,
queryCoupon券查询读接口正常放行;- 券库存RPC资源开启线程池隔离,配置慢调用比例熔断策略;
- 在
receiveCoupon资源上同时指定blockHandler、fallback兜底方法;- 券库存RPC客户端设置合理超时时间,防止请求卡死。
小节坑点汇总
@SentinelResource只对public生效,同类内部调用不会走Sentinel防护逻辑;- Sentinel注解默认是信号量隔离,不是线程池隔离,不支持线程中断,外部RPC不要踩坑;
- blockHandler只捕获Sentinel流量防护异常BlockException;业务异常走fallback;两者不要混淆;
- 关联流控模式:关联资源是阈值判断对象,限流作用在配置的resource上,配置极易写反;
- 熔断需要达到
minRequestAmount最小请求数,否则不会触发熔断; - 线程池隔离模式,MDC、traceId上下文需要手动传递;
- 不要在业务代码硬编码规则,生产环境建议把规则持久化到Nacos配置中心,Sentinel控制台动态修改;
- 防护兜底逻辑不能做重量级IO,降级逻辑尽量内存返回缓存或者默认值。
文末综合总结
- Sentinel三大核心能力:限流保护入口流量、熔断保护不稳定下游、隔离限制并发资源防止线程耗尽;
- 资源Resource是Sentinel的最小保护单元,
@SentinelResource埋点,区分blockHandler流量拦截、fallback业务异常降级; - 限流有直接、关联、链路模式;大促场景使用关联流控实现:写接口过载限流,读接口继续可用;
- 熔断三种策略:慢调用比例、异常比例、异常数;熔断器三状态:关闭、打开、半开;
- 隔离分为信号量隔离(默认轻量,无超时中断)、线程池隔离(独立线程池,支持超时,适合RPC外部调用);
- 线上稳定性目标:允许部分非核心功能降级,保障核心链路可用,阻止故障级联雪崩。
课后思考题(面试复盘)
- blockHandler 和 fallback 有什么区别,分别什么场景触发?
- Sentinel默认信号量隔离有什么缺陷?为什么调用外部RPC不建议只用默认信号量隔离?
- 关联流控模式,如何实现:领券写接口过载限流,券查询读接口不受影响?
- 熔断器OPEN、HALF_OPEN、CLOSED三种状态流转逻辑,半开状态作用是什么?
- Sentinel和Hystrix在隔离模式上的核心差异是什么?
- 如果下游RPC一直阻塞不返回,只用信号量隔离会发生什么线上故障?