SpringCloud Alibaba Sentinel 教学:限流、熔断、降级、线程/信号量隔离、活动过载保护

前言

在微服务体系中,服务调用链错综复杂,一个下游服务卡顿、超时、流量暴涨,就会向上传导,引发级联雪崩。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。

流控模式:

  1. 直接:对当前资源本身限流;
  2. 关联:关联其他资源,关联资源达到阈值,限流本资源;典型场景:写操作过载,限制查询;
  3. 链路:只记录指定调用链路上的流量,只对指定入口限流。

#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关键参数:

  1. resource:受保护资源;
  2. grade:熔断策略;
  3. count:阈值(慢调用RT阈值 / 异常比例 / 异常数量);
  4. timeWindow:熔断打开持续时间(秒);
  5. minRequestAmount:最小请求数,低于该数值不会触发熔断;
  6. 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 隔离模式业务选型建议

  1. 本地内存计算、本地方法调用:信号量隔离,轻量高效;
  2. RPC调用、第三方http接口、IO外部依赖:线程池隔离,具备超时能力,卡死任务可以终止;
  3. 不要全部业务共用同一个隔离线程池,不同下游依赖使用独立线程池,防止单点故障扩散。

补充:Hystrix只有线程池隔离和信号量隔离,没有原生限流能力;Sentinel把限流、熔断、隔离整合一套体系。


第五部分:完整业务综合场景:大促领券服务防护

业务背景:

活动领券接口 receiveCoupon(写),券查询 queryCoupon(读)。依赖下游券库存RPC服务。

需求:

  1. 领券接口QPS限流;
  2. 下游券库存RPC慢调用、报错触发熔断;
  3. RPC调用使用线程池隔离,防止下游卡死占满tomcat线程;
  4. 大促过载,领券写拦截降级,券查询读不受影响;
  5. 限流熔断均配置兜底返回友好提示。

#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降级返回
券查询读不受写限流影响

保障用户可以查自己已有的券

防护规则清单总结:

  1. 写类型核心接口配置QPS流量限流,拦截突增流量;
  2. 使用关联流控实现读写分离防护:写资源流量过载时,仅拦截写请求,保障读资源正常可用;
  3. 外部RPC/第三方依赖资源配置线程池隔离 + 熔断降级规则,隔离下游故障,慢调用占满资源时触发熔断;
  4. 受保护资源同时配置blockHandler流量防护兜底与fallback业务异常兜底;
  5. 所有外部网络调用强制开启客户端超时,避免线程无限阻塞。

🌰业务举例(对应本次大促领券场景)

  1. receiveCoupon领券写接口设置QPS限流;
  2. 配置关联流控:监控领券写资源流量,过载只拦截领券,queryCoupon券查询读接口正常放行;
  3. 券库存RPC资源开启线程池隔离,配置慢调用比例熔断策略;
  4. 在receiveCoupon资源上同时指定blockHandler、fallback兜底方法;
  5. 券库存RPC客户端设置合理超时时间,防止请求卡死。

小节坑点汇总

  1. @SentinelResource只对public生效,同类内部调用不会走Sentinel防护逻辑;
  2. Sentinel注解默认是信号量隔离,不是线程池隔离,不支持线程中断,外部RPC不要踩坑;
  3. blockHandler只捕获Sentinel流量防护异常BlockException;业务异常走fallback;两者不要混淆;
  4. 关联流控模式:关联资源是阈值判断对象,限流作用在配置的resource上,配置极易写反;
  5. 熔断需要达到minRequestAmount最小请求数,否则不会触发熔断;
  6. 线程池隔离模式,MDC、traceId上下文需要手动传递;
  7. 不要在业务代码硬编码规则,生产环境建议把规则持久化到Nacos配置中心,Sentinel控制台动态修改;
  8. 防护兜底逻辑不能做重量级IO,降级逻辑尽量内存返回缓存或者默认值。

文末综合总结

  1. Sentinel三大核心能力:限流保护入口流量、熔断保护不稳定下游、隔离限制并发资源防止线程耗尽;
  2. 资源Resource是Sentinel的最小保护单元,@SentinelResource埋点,区分blockHandler流量拦截、fallback业务异常降级;
  3. 限流有直接、关联、链路模式;大促场景使用关联流控实现:写接口过载限流,读接口继续可用;
  4. 熔断三种策略:慢调用比例、异常比例、异常数;熔断器三状态:关闭、打开、半开;
  5. 隔离分为信号量隔离(默认轻量,无超时中断)、线程池隔离(独立线程池,支持超时,适合RPC外部调用);
  6. 线上稳定性目标:允许部分非核心功能降级,保障核心链路可用,阻止故障级联雪崩。

课后思考题(面试复盘)

  1. blockHandler 和 fallback 有什么区别,分别什么场景触发?
  2. Sentinel默认信号量隔离有什么缺陷?为什么调用外部RPC不建议只用默认信号量隔离?
  3. 关联流控模式,如何实现:领券写接口过载限流,券查询读接口不受影响?
  4. 熔断器OPEN、HALF_OPEN、CLOSED三种状态流转逻辑,半开状态作用是什么?
  5. Sentinel和Hystrix在隔离模式上的核心差异是什么?
  6. 如果下游RPC一直阻塞不返回,只用信号量隔离会发生什么线上故障?
相关推荐
程序员老赵1 小时前
Docker 部署 Dolibarr:轻松搭建开源 ERP/CRM 平台
运维·前端·后端
量化分析码农1 小时前
【Python量化系统工程实战 #06】从本地脚本到云端部署:量化系统的最小可运行架构
后端
136096757231 小时前
页面打不开不是 Nginx 的错
前端·后端
ALONE阿龙太原微码1 小时前
RBAC 以及主流权限模型
后端
斑鸠喳喳1 小时前
线程本地存储 ThreadLocal
java·后端
你顶住我先撤1 小时前
RocketMQ 消息类型
后端
高频因子挖掘机3 小时前
批量行情返回后,怎样把请求失败的股票单独挑出来?
后端·github·api
記億揺晃着的那天3 小时前
【Agent 架构实战】大模型长期项目开发:决策文档生命周期管理与 CI 门禁治理
软件工程·devops·架构设计·ai agent·文档管理
小蒜学长3 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
我的div丢了肿么办5 小时前
go语言中管道 channel的使用
后端·go