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资源上同时指定blockHandlerfallback兜底方法;
  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一直阻塞不返回,只用信号量隔离会发生什么线上故障?
相关推荐
考虑考虑9 小时前
数据库中的EXISTS
运维·数据库·后端
郑州光合科技余经理10 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼10 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
苏三说技术14 小时前
为什么越来越多人用OpenWiki?
后端
IT_陈寒14 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet15 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
码事漫谈15 小时前
FDE 的起源、形态与真实边界
后端
ServBay15 小时前
Grok Bot 还是 OpenClaw?聊聊真正能替人打杂的 AI 智能体
后端·aigc·grok
掘金挖土16 小时前
前端手摸手跑路之 AI 应用开发(五)
前端·后端