SpringCloud Sentinel 组件中,blockHandler 和 fallback 的区别是什么?

摘要:在Sentinel的异常处理机制中,blockHandler与fallback是两个高频使用,但极易
在Sentinel的异常处理机制中,blockHandler与fallback是两个高频使用,但极易混淆的核心配置,二者虽均用于异常兜底、避免服务崩溃或返回不友好响应,但在触发场景、处理范围、语法规范、使用优先级上截然不同,若使用不当会导致兜底失效、异常无法正常拦截等问题。 ======= 🌟 青柠来相伴,代码更简单。🌟 ======= 📚 本文所有内容,我都整理在了 青柠合集 里。👇 🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~ ======= 🌟 ================ 🌟 ======= 一、Sentinel异常处理核心场景与执行流程 在讲解二者区别前,先明确Sentinel的两类核心异常场景及整体执行流程,这是理解blockHandler与fallback的基础: 流量控制/熔断降级异常(平台级拦截): 由Sentinel的五大核心规则(限流、熔断、热点、系统保护、授权规则)触发,抛出BlockException及其子类,具体包括: 此类异常属于“平台级拦截”,触发时机早于业务逻辑执行,即Sentinel先拦截请求,再判断是否执行业务代码,因此业务逻辑未执行或未执行完毕。 FlowException:限流异常(请求QPS/线程数超出阈值); DegradeException:熔断异常(服务调用失败率、响应时间超出阈值,触发熔断); ParamFlowException:热点参数限流异常(指定热点参数的请求超出阈值); SystemException:系统保护异常(系统负载、CPU、内存超出阈值,触发系统保护); AuthorityException:授权异常(请求来源未通过授权校验)。 业务逻辑异常(业务级错误): 业务代码执行过程中抛出的各类异常,包括但不限于: 此类异常属于“业务级错误”,此时Sentinel规则未触发,业务逻辑已执行但出现异常,需通过兜底逻辑避免异常扩散。 基础异常:NullPointerException(空指针)、IllegalArgumentException(参数非法); 业务异常:自定义业务异常(如OrderNotFoundException订单不存在、StockInsufficientException库存不足); 外部依赖异常:SQLException(数据库异常)、FeignException(远程调用异常)、TimeoutException(超时异常)。 Sentinel异常处理执行流程 请求进入Sentinel保护的资源 → Sentinel执行规则校验 → 若触发规则(限流/熔断等)→ 抛出BlockException → 优先执行blockHandler(若配置)→ 若未配置blockHandler → 执行fallback(若配置)→ 若均未配置 → 抛出原始BlockException; 若未触发Sentinel规则 → 执行业务逻辑 → 业务逻辑抛出异常 → 执行fallback(若配置)→ 若未配置fallback → 抛出原始业务异常; blockHandler与fallback的核心区别,本质就是对这两类异常的处理分工不同——前者专注处理平台级拦截异常,后者专注处理业务级错误,二者协同可构建完善的微服务容错体系,覆盖从请求拦截到业务执行的全链路异常兜底。 二、blockHandler 详解 2.1 核心定义 blockHandler是Sentinel提供的「平台级异常处理机制」,专门用于处理因Sentinel规则触发的BlockException及其子类异常,核心作用是当请求被限流、熔断、热点拦截、系统保护或授权拦截时,提供统一的兜底响应(如友好提示、默认数据),避免直接抛出原始异常给前端。 核心特点:仅响应Sentinel规则触发的异常,不处理业务逻辑本身的异常;触发时机早于业务逻辑执行(或业务逻辑未执行);优先级高于fallback;兜底方法需严格遵循语法规范,否则无法生效。 2.2 语法规范 blockHandler的配置依赖@SentinelResource注解(Sentinel核心注解,用于定义受保护的资源),需严格遵循以下规范: 注解配置:在需要保护的资源(接口方法、业务方法)上添加@SentinelResource注解,通过blockHandler属性指定兜底方法名(必须与兜底方法名完全一致,区分大小写);若兜底方法在其他类中,需配合blockHandlerClass属性指定类对象(如blockHandlerClass = SentinelBlockHandler.class)。
阅读全文