Sentinel实战:微服务限流熔断与降级全解析
2026/9/1 20:11:48 网站建设 项目流程

在实际微服务项目中,Sentinel 通常不会一开始就出现,但当流量突增、下游抖动、接口耗时上涨时,限流和熔断就成了保证系统不被打垮的关键手段。很多人对 Sentinel 的第一印象是“一个限流工具”,但它实际解决的是微服务流量治理问题:哪些请求可以进来、进多少、进来以后如果下游变慢怎么办、某个接口持续报错要不要暂时切断。这篇文章用一条主线把 Sentinel 拆开讲:先理解为什么微服务需要限流和熔断,再掌握 Sentinel 的核心机制,接着用最小项目跑通限流和熔断,最后沉淀一套可复用的排查思路和生产配置建议。读完以后,你可以在自己的 Spring Boot 或 Spring Cloud 项目里接入 Sentinel,也能回答“规则为什么不生效”“被限流后日志怎么看”这一类问题。

1. 先从微服务的稳定性问题说起

微服务不是把单体拆开就结束了。拆开之后,服务之间的调用关系变多,链路变长,稳定性问题也从“单个进程内如何避免崩溃”变成了“整个分布式链路如何避免雪崩”。在这一节里,我们先看清问题本身,再去理解 Sentinel 的定位。

1.1 为什么微服务容易雪崩

在单体应用中,所有请求都进入同一个进程,线程、内存、连接池是共享的。一个接口出现问题,最多是某个功能不可用,系统整体还能继续启动,故障范围相对可控。但微服务按照业务边界拆分以后,一个用户请求往往要经过多个服务协作。

例如,一个商品详情接口可能依赖:

  • 价格服务:查询商品价格。
  • 库存服务:查询当前库存。
  • 评价服务:查询用户评价。
  • 推荐服务:查询推荐商品。

如果评价服务突然变慢,调用方“商品服务”中的线程会一直等待响应。评价服务自身线程池被打满后,新的请求开始排队,商品服务的线程也被大量占用。接着依赖商品服务的上层服务也开始卡顿。流量越大,故障传播越快,最终从单个服务的不稳定扩散成整条链路不可用。

这种现象叫作“服务雪崩”。雪崩的本质不是某个服务挂了,而是“慢请求占用线程”导致资源耗尽,随后故障沿着调用链向上传导。

1.2 限流、熔断、降级各自解决什么问题

很多人把限流、熔断、降级混在一起说,但它们在微服务稳定性体系里的关注点完全不同。

手段作用典型场景主要控制对象
限流控制进入系统的流量速率或并发数秒杀、抢购、异常爬虫、刷接口请求量、并发线程数
熔断当下游或目标资源持续异常时快速失败接口响应时间过长、错误率上升服务调用关系
降级提供兜底结果,避免用户直接看到错误非核心服务不可用、超时业务返回值

限流是“关口检查”,不让太多流量进入系统。熔断是“故障开关”,当某个被调用的服务已经出现明显问题,直接切断调用,避免调用方继续等待。降级则是熔断或异常发生后的“备用方案”,例如返回缓存数据、返回空列表、返回友好提示。

三者经常组合使用:接口先限流,保护系统入口;调用下游时设置熔断,保护自身线程;熔断触发后走降级逻辑,保证用户体验。

1.3 Sentinel 在微服务体系中的定位

Sentinel 是阿里巴巴开源的面向分布式服务架构的流量防护组件,官方定位是“流量控制、熔断降级、系统负载保护”。在微服务体系中,它解决的问题正好对应上面三条链路:

  • 对某个资源做 QPS 或线程数限流。
  • 对慢调用比例、异常比例、异常数做熔断。
  • 配合@SentinelResource注解做降级兜底。

Sentinel 与网关限流的不同点在于:网关适合在入口处做比较粗粒度的全局限流,例如限制某个路由每秒最多 1000 次请求;Sentinel 可以直接保护服务内部的方法、接口和数据库访问逻辑。它不只盯着“入口流量”,而是把每个可保护的业务逻辑都抽象成“资源”,规则只对具体资源生效。

理解了这一点,后面所有配置就都好理解了:先定资源,再定规则,最后观察统计效果。

2. Sentinel 核心概念与工作方式

Sentinel 的模型并不复杂,核心只有两个词:资源和规则。真正的复杂度在底层统计和状态切换上。我们先用最小例子说清楚模型,再解释滑动窗口和熔断算法。

2.1 资源与规则

所谓“资源”,就是你想保护的任何一段代码。它可以是一个 HTTP 接口、一个方法、一段依赖下游的调用逻辑。资源名建议使用可读性强的字符串,例如getUserByIdorder:createrpc:stock:query

访问资源时,Sentinel 会执行统计和规则判断。最小写法如下:

Entry entry = null; try { entry = SphU.entry("getUserById"); // 这里是被保护的业务逻辑 return "user:" + id; } catch (BlockException ex) { // 流量超过阈值,或者熔断打开时会走到这里 return "请求过快,请稍后再试"; } finally { if (entry != null) { entry.exit(); } }

SphU.entry("getUserById")表示进入一个资源。如果当前资源触发了流控或熔断,Sentinel 会抛出BlockExceptionBlockException不是业务异常,它专门表示“被 Sentinel 拦截了”。最后必须调用entry.exit(),否则统计信息会不完整,后续规则可能判断不准确。

在实际项目中,大部分场景不需要手写这段代码。接入spring-cloud-starter-alibaba-sentinel后,常用 Web 接口会自动被包装成资源;使用@SentinelResource注解则可以给任意方法添加保护。

2.2 Sentinel 的统计模型:滑动窗口

Sentinel 的限流不是简单地记录“上一秒请求了多少次”,而是通过滑动窗口完成更精确的统计。

如果只记录“当前 1 秒”的请求数,会遇到临界问题。例如 0 秒到 1 秒内请求了 1000 次,1 秒到 2 秒内又请求了 1000 次,单看每秒都没超限,但 0.5 秒到 1.5 秒这个连续的 1 秒窗口内,请求数可能是 2000。如果阈值正好是 1000,这个流量缺口就漏掉了。

滑动窗口会把时间切成更小的桶。例如把 1 秒切成 2 个 500ms 的桶,统计当前最近 1 秒的数据时,只保留落在窗口内的桶,过期的桶自动失效。桶的数量越多,统计精度越高,但内存和计算开销也会增加。

Sentinel 内部默认就是使用类似的LeapArray滑动窗口结构,把统计周期切分成多个采样桶。这样做的好处是:既能做秒级 QPS 统计,又能支持分钟级异常比例统计,而且统计数据不需要全量重算。

2.3 熔断算法的核心原理

熔断不是简单的“连续失败 N 次就断开”。Sentinel 支持三种熔断维度:

  • 慢调用比例:统计最近一段时间内,响应时间超过阈值的请求占比。
  • 异常比例:统计最近一段时间内,抛出异常的业务请求占比。
  • 异常数:统计最近一段时间内,异常请求的总数。

熔断状态有三种:

  • CLOSED:关闭状态,请求正常放行。
  • OPEN:打开状态,请求直接进入降级逻辑。
  • HALF_OPEN:半开状态,允许少量探测请求通过,如果探测成功,状态恢复为 CLOSED;如果探测失败,状态重新变为 OPEN。

这种状态机设计很关键。如果熔断打开后不经过任何探测就直接恢复,一旦下游还没恢复,很容易再次被打挂;如果一直保持打开,下游恢复后又不能及时恢复服务。半开状态就是“低成本试一下,看看下游是否已经恢复”的机制。

在 Sentinel 的DegradeRule中,timeWindow表示熔断打开后持续多少秒。超过这个时间后,会进入半开状态进行探测。

2.4 控制台与客户端如何配合

Sentinel 控制台是可视化管理端,一般用来查看实时监控、配置规则、管理应用列表。客户端是嵌在业务应用里的 SDK,负责统计请求数据、执行规则判断。

客户端需要配置两个关键信息:

  • csp.sentinel.dashboard.server:控制台地址。
  • project.name:应用名称,控制台用它来区分不同服务。

启动时通过 JVM 参数传入:

java -jar -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-demo app.jar

客户端会通过 HTTP 心跳与控制台保持连接,把监控数据上报上去。控制台也可以把规则推送到客户端。但要注意:默认情况下,控制台配置的规则保存在内存里,客户端重启后规则会丢失。生产环境需要接入 Nacos、Apollo 等持久化数据源。

3. 从零搭建一个 Sentinel 最小可运行示例

理解概念之后,自己动手跑通一遍比看十遍文档都有效。这里用 Spring Boot 加sentinel-core搭建最小示例,不引入 Spring Cloud Alibaba,避免让自动配置干扰我们理解核心流程。

3.1 环境准备

你本机需要准备:

  • JDK 1.8 或更高版本。
  • Maven 3.6 或更高版本。
  • 可以访问 Maven 中央仓库的网络环境。
  • Sentinel Dashboard 的 jar 包,如果本地没有,可以从官方 GitHub Release 下载对应版本。

如果你的项目已经使用 Spring Cloud Alibaba,也可以直接使用spring-cloud-starter-alibaba-sentinel。但为了先把原理跑通,下面示例使用sentinel-core配合 Spring Boot Web,这样每一步都能看清。

3.2 Spring Boot 项目引入 Sentinel

创建一个普通的 Spring Boot 工程,在pom.xml中加入依赖:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.18</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.6</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.8.6</version> </dependency>

说明:

  • sentinel-core提供资源和规则的核心 API。
  • sentinel-transport-simple-http负责把应用注册到控制台,并提供本地监控端口,默认是 8719。
  • Spring Boot Web 只用来提供一个 HTTP 接口,方便我们通过浏览器和命令行验证效果。

如果你的项目版本比较新,建议先确认依赖兼容性,不要盲目使用最新版本。版本不对时,客户端可能无法上报数据,或者控制台无法下发规则。

3.3 配置客户端连接控制台

application.yml中只配置应用端口:

server: port: 8090 spring: application: name: sentinel-demo

启动类不需要额外配置。为了把客户端连上控制台,在启动命令中传入 JVM 参数:

java -jar -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-demo target/sentinel-demo.jar

如果没有启动控制台,只做限流演示也可以运行。客户端会监听 8719 端口用于接收控制台请求和控制台上报数据。

3.4 定义资源并触发限流

编写一个简单的 Controller,给/user/{id}接口设置资源名getUserById

import com.alibaba.csp.sentinel.Entry; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @GetMapping("/user/{id}") public String getUserById(@PathVariable("id") Long id) { Entry entry = null; try { entry = SphU.entry("getUserById"); if (id > 100) { throw new RuntimeException("模拟下游服务异常"); } return "user:" + id; } catch (BlockException ex) { return "请求过快或被熔断,请稍后再试"; } finally { if (entry != null) { entry.exit(); } } } }

这里有一个关键设计:BlockException单独捕获,业务异常RuntimeException让它继续抛出。这样能区分“被 Sentinel 拦截”和“业务本身出错”,熔断统计才能准确感知异常比例。

配置一个简单的流控规则,QPS 阈值设置为 20:

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.util.Collections; @Component public class SentinelRuleConfig { @PostConstruct public void initFlowRules() { FlowRule rule = new FlowRule(); rule.setResource("getUserById"); rule.setGrade(1); // 1 表示按 QPS 限流 rule.setCount(20); FlowRuleManager.loadRules(Collections.singletonList(rule)); } }

启动应用后,连续快速请求接口,当瞬时 QPS 超过 20,就会返回“被拦截”的提示。

4. 规则配置的几种方式与参数详解

规则配置是 Sentinel 使用中最容易混淆的部分。同一份规则,既可以在代码里写,也可以在控制台配,还可以通过数据源动态推送。下面把常用方式和关键参数完整过一遍。

4.1 代码规则 vs 控制台规则 vs 配置文件

配置方式优点缺点适用场景
代码硬编码简单直观,启动即生效改规则要改代码发布本地 Demo、确定不变的规则
控制台配置可视化、实时调整默认只存在内存,重启丢失联调、临时排查
动态数据源规则持久化,支持远程推送需要额外部署 Nacos/Apollo/Redis生产环境

在最小示例里,我们用代码加载了FlowRuleManager.loadRules。控制台配置则是在“流控规则”页面新增,并选择资源名。动态数据源最常见的是 Nacos,客户端通过监听配置变化,实时更新规则。

如果业务从零开始,建议不要把控制台规则当作持久化方案。控制台适合看监控和临时调试,生产规则要落到配置中心,否则一次重启就会把你维护的几百条规则全部清空。

4.2 流控规则参数说明

流控规则最常用,理解下面的参数后,其他规则也能触类旁通:

参数含义常见值
resource资源名,必须与代码中的资源名一致getUserById
grade限流维度,0 表示并发线程数,1 表示 QPS1
count阈值,QPS 模式下表示每秒最大请求数20
limitApp调用来源,用于按来源限流,默认 defaultdefault
strategy流控模式,0 直接,1 关联,2 链路0
controlBehavior流控效果,0 快速失败,1 Warm Up,2 排队等待0

其中controlBehavior值得重点解释:

  • 快速失败:超限后立即抛出BlockException
  • Warm Up:也就是预热模式。系统启动时阈值较低,在warmUpPeriodSec秒内逐渐提升到配置阈值,适合冷启动场景。
  • 排队等待:超限请求进入队列,每隔一个固定时间放行一个,适合需要削峰填谷的场景,比如定时任务批量导入。

预热模式在秒杀和活动场景中比较实用,它避免了一开始就放大量请求进入尚未完成缓存预热或连接池初始化的系统。

4.3 熔断规则参数说明

熔断规则对应DegradeRule,常用参数:

参数含义
resource资源名
grade0 表示慢调用比例,1 表示异常比例,2 表示异常数
count慢调用比例模式下是 RT 阈值,异常比例模式下是比例阈值,异常数模式下是异常数量阈值
timeWindow熔断打开后持续多少秒
minRequestAmount触发熔断的最小请求数,避免极少量样本导致误判
statIntervalMs统计时间窗口,单位毫秒

举个例子,如果某个下游服务在 1 秒内有超过 5 个请求,且异常比例超过 50%,就熔断 10 秒:

import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import java.util.Collections; public void initDegradeRules() { DegradeRule rule = new DegradeRule(); rule.setResource("getUserById"); rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); rule.setCount(0.5); rule.setTimeWindow(10); rule.setMinRequestAmount(5); rule.setStatIntervalMs(1000); DegradeRuleManager.loadRules(Collections.singletonList(rule)); }

这里设置minRequestAmount为 5 很重要。如果只有 1 个请求且刚好失败,就直接熔断会过于敏感。设置最小请求数,相当于告诉 Sentinel:样本太少时先不急着下结论。

4.4 热点参数限流与系统自适应限流

除了基础 QPS 限流,Sentinel 还支持两种更高阶的规则。

热点参数限流针对的是同一个接口中不同参数值的流量差异。例如同一商品,热门商品请求量很大,普通商品请求量很小。可以针对参数索引和参数值单独设置阈值。

系统自适应限流则不针对单个资源,而是根据系统全局负载,比如 CPU 使用率、总体 QPS、线程数,自动限制整体流量。生产环境中,当机器 CPU 已经很高时,再精确的资源级限流可能来不及,系统自适应规则可以作为最后一道保护。

5. 运行验证:如何观察限流和熔断效果

配置写完之后,关键是验证规则到底有没有生效。这一步需要同时用到控制台、命令行和日志。

5.1 启动控制台与客户端

启动控制台:

java -Dserver.port=8080 -jar sentinel-dashboard.jar

启动客户端:

java -jar -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-demo target/sentinel-demo.jar

打开浏览器访问http://localhost:8080,默认账号密码是sentinel。登录后应该能看到sentinel-demo应用。

注意:如果应用还没有任何请求,控制台可能看不到“实时监控”曲线。因为 Sentinel 默认是有流量产生时才记录数据,可以先访问几次接口再刷新页面。

5.2 用并发请求验证限流

先访问一次接口,确认正常返回:

curl http://localhost:8090/user/1

然后并发发送 200 个请求,观察返回结果:

seq 1 200 | xargs -P 50 -I {} curl -s http://localhost:8090/user/1 | sort | uniq -c

假设 QPS 阈值是 20,而命令并发很高,结果中可能同时出现:

正常返回的 user:1 请求过快或被熔断,请稍后再试

如果全是正常返回,说明并发没有超过阈值。可以调低阈值到 1,再用同样命令测试,确保限流生效。

也可以使用压测工具,例如ab

ab -n 200 -c 50 http://localhost:8090/user/1

这时控制台的“实时监控”会出现明显的 QPS 流量曲线。

5.3 用异常比例验证熔断

在 Controller 中,id > 100时会抛出模拟异常。配置异常比例为 0.5、最小请求数为 5 后,执行:

seq 1 50 | xargs -P 10 -I {} curl -s http://localhost:8090/user/100

因为请求全部携带id = 100,业务异常比例会达到 100%。当请求量超过minRequestAmount后,熔断状态从 CLOSED 切换到 OPEN。

熔断打开后,即使请求换回id = 1,也会在一段时间内直接返回被拦截提示,直到timeWindow结束进入半开状态,才可能恢复正常。

5.4 查看实时监控与控制台事件

控制台左侧菜单中的“实时监控”可以看到资源维度的 QPS、RT 和阻塞 QPS。这里要注意:

  • “通过 QPS”表示正常通过的请求。
  • “阻塞 QPS”表示被 Sentinel 拦截的请求。
  • “异常 QPS”表示业务抛异常的请求。

如果一个资源大量请求走了被拦截分支,说明规则生效了。如果阻塞 QPS 一直为 0,但业务上明显超限,就要按下一节的排查链路去查。

6. 常见问题排查:为什么规则不生效、被限流后怎么办

接入 Sentinel 之后,最常遇到的问题是“我明明配置了规则,为什么接口还是不限流?”这类问题通常不是 Sentinel 本身有 bug,而是资源名、版本、规则来源或异常处理没有对齐。

6.1 规则不生效的检查链路

按这个顺序排查效率最高:

  1. 检查资源名是否完全匹配,包括大小写、空格、前缀后缀。
  2. 检查规则是否真的加载成功,可以通过调用FlowRuleManager.getRules()打印当前规则列表。
  3. 检查entry()是否包住了真正的业务逻辑。
  4. 检查BlockException是捕获后正常返回,还是被误当成业务异常吞掉。
  5. 检查是否启动了多个实例,但规则只配置到了其中一个。
  6. 检查客户端是否连接了正确的控制台,以及控制台页面显示的规则是否和代码里的规则一致。

常见错误是在代码里给资源名写成了getUserById,但请求的资源名是getUserById,多了一个空格就完全不匹配。

6.2 被 blocked by sentinel 的排查

当请求被拦截时,使用spring-cloud-starter-alibaba-sentinel的项目可能看到类似Blocked by Sentinel (flow limiting)的响应。这不是系统崩溃,而是限流规则正常触发。

排查时重点看两点:

  • 该资源的 QPS 是否真的超过了阈值。
  • 触发限流的调用来源是什么。

如果确认流量没超过阈值,却仍然被拦,检查是否配置了系统自适应规则、热点参数规则,或者是否存在多个规则的叠加效果。比如单独看流控规则 QPS 100,但系统规则中 CPU 阈值很低,同样会触发限流。

6.3 控制台看不到应用

控制台不显示应用,常见原因:

现象可能原因检查方式处理建议
控制台应用列表为空未配置 dashboard server查看启动命令中的 JVM 参数加入-Dcsp.sentinel.dashboard.server=localhost:8080
应用出现但监控无数据还没有产生请求流量多次访问业务接口强制产生一些请求,等 1 到 2 秒
应用状态离线客户端心跳中断或端口被占用查看 8719 端口是否被占用检查防火墙和端口占用,必要时用-Dcsp.sentinel.api.port=8720换端口
版本不一致客户端与控制台版本差异过大查看启动日志中的版本信息尽量对齐客户端和控制台版本

控制台只是辅助工具,限流的核心判断仍然在客户端本地完成。即使控制台暂时连不上,代码里配置的规则也仍然生效。

6.4 生产环境常见配置错误

生产环境最容易踩的坑有三个。

第一个坑:控制台修改规则后不持久化。很多团队测试时在控制台上加规则,看起来很顺利,一重启应用,规则全部丢失。生产环境的规则必须落到配置中心,并明确规则来源。

第二个坑:降级兜底方法写错。使用@SentinelResource时,blockHandler处理BlockExceptionfallback处理业务异常。如果只配置了blockHandler,业务异常还是会在调用方抛出来;如果只配置了fallback,被限流时也可能走不到预期分支。两者要区分清楚。

第三个坑:把限流阈值拍脑袋定死。新服务上线时不知道容量水位,随手写一个 QPS 100,结果实际压测只能支撑 50,流量一上来就把服务打崩。阈值应该来自压测,而不是经验估算。

7. 生产环境实践:限流熔断配置规范与扩展方向

最后回到生产环境。Sentinel 跑通 Demo 很简单,真正难的是把规则定得合理、把规则管理做规范,并且能在故障时快速定位。

7.1 学习环境与生产环境的差异

维度学习环境生产环境
规则加载代码写死即可配置中心推送,持久化管理
阈值确定随意设一个演示值压测得出的容量水位
降级兜底返回简单字符串缓存数据、默认值、提示文案
监控控制台够用需要对接 Prometheus、日志平台、告警
配置变更重启应用生效必须有动态刷新和灰度策略
安全本地调试控制台需要认证和权限隔离

生产环境下,建议至少完成以下工作:

  • 规则统一放在 Nacos 或 Apollo,按环境区分命名空间。
  • 对核心接口先压测,记录正常 QPS、RT、错误率。
  • 每个熔断规则都配套一个降级处理逻辑,不能让用户看到裸异常。
  • 对“阻塞 QPS”和“熔断打开次数”设置告警。

7.2 核心接口限流阈值怎么定

限流阈值不能从网上抄,也不能完全拍脑袋。推荐做法:

  1. 先对接口做全链路压测,找到系统开始出现性能拐点的 QPS。
  2. 取拐点值的 70% 到 80% 作为线上限流阈值,预留突发流量和资源波动空间。
  3. 对读接口和写接口分别设阈值,写接口的阈值通常比读接口低。
  4. 对热点参数单独设规则,避免一个热门商品占满整个接口的额度。
  5. 定期根据流量增长和容量扩容重新调整规则。

如果一个服务平时 QPS 只有 50,压测能支撑 200,你可以把阈值设置为 150。这样既不会频繁误伤正常流量,又能在流量突然增长时切断超出容量部分。

7.3 熔断降级如何与兜底逻辑配合

熔断和降级必须成对出现。只熔断不降级,用户看到的是 500 错误;熔断加降级,用户看到的是可接受的后备结果。

使用@SentinelResource时,推荐这样组织代码:

@SentinelResource( value = "getUserById", blockHandler = "getUserByIdBlockHandler", fallback = "getUserByIdFallback" ) public String getUserById(Long id) { if (id > 100) { throw new RuntimeException("模拟异常"); } return "user:" + id; } public String getUserByIdBlockHandler(Long id, BlockException ex) { return "当前请求过多,请稍后再试"; } public String getUserByIdFallback(Long id, Throwable ex) { return "服务暂时不可用,请稍后再试"; }

其中:

  • blockHandler处理被限流、熔断触发时抛出的BlockException
  • fallback处理业务本身的Throwable
  • 两者返回值、参数列表必须和原方法兼容,blockHandler需要额外接收一个BlockException参数。

实际项目里,降级结果可以从缓存读取,也可以使用本地内存快照。但缓存设计要注意:如果下游服务已经故障,缓存里可能是旧数据,要在返回时标记数据时间,让业务知道这是降级数据。

7.4 接入 Sentinel 前的检查清单

以下清单可以直接复制到你的项目里:

  • [ ] 确认 Java 版本、Spring Boot 版本、Sentinel 版本兼容。
  • [ ] 确定要保护的资源名,避免多个地方出现同名字段。
  • [ ] 确认规则来源:代码、控制台,还是配置中心。
  • [ ] 对限流接口设置合理的阈值,并记录依据。
  • [ ] 对熔断接口配置blockHandlerfallback
  • [ ] 验证被限流时返回内容对用户友好。
  • [ ] 验证熔断打开后能恢复,且恢复时间符合预期。
  • [ ] 控制台能否正常看到应用和实时监控。
  • [ ] 生产环境的规则是否具备持久化和动态更新能力。
  • [ ] 是否有针对阻塞 QPS 和熔断事件的告警。

7.5 扩展方向

从 Sentinel 这一套机制出发,你还可以继续深入几个方向:

  • 源码阅读:重点看SphU.entry()的调用链,以及FlowRuleChecker如何判断规则。
  • 动态数据源:学习sentinel-datasource-nacos的实现原理,理解配置变更如何推送到客户端。
  • 集群限流:了解独立 Token Server 的集群流控方案。
  • Sentinel 结合 OpenFeign 和 RestTemplate:为远程调用设置熔断降级。
  • Sentinel 与网关整合:在 Spring Cloud Gateway 中使用官方网关适配。

真正遇到线上故障时,限流熔断的价值才会体现出来。但不要等到故障发生才去接,而是应该现在就在核心链路上把规则、降级、监控和告警配好,这样流量高峰来临时,系统才不会成为下一个雪崩案例。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询