Sentinel 资源异常处理优先级笔记

一、Sentinel 资源异常处理的 3 级优先级规则

针对 @SentinelResource 标注的资源,异常处理按以下顺序生效(优先级从高到低):

  1. blockHandler :仅处理 Sentinel 规则触发的异常 (如限流、熔断、授权拦截),对应 BlockException 及其子类;
  2. fallback :处理 业务异常 (如空指针、远程调用失败),也可兼容处理 BlockException
  3. defaultFallback:全局兜底处理器,未被前两者捕获的所有异常都会进入这里;
  4. 若三者都未配置:直接抛出异常到上层(如控制器,也就是Springboot默认的控制器的异常)。

二、基于代码的配置示例(以createOrder资源为例)

1. 服务层:配置 3 级处理器

复制代码
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private ProductFeignClient productFeignClient;

    // 核心:配置blockHandler、fallback、defaultFallback
    @SentinelResource(
        value = "createOrder",
        blockHandler = "createOrderBlockHandler", // 1. 限流/熔断兜底
        fallback = "createOrderFallback",          // 2. 业务异常兜底
        defaultFallback = "createOrderDefaultFallback" // 3. 全局兜底
    )
    @Override
    public Order createOrder(Long productId, Long userId) {
        // 1. Feign远程调用(可能触发业务异常)
        Product product = productFeignClient.getProductById(productId);
        if (product == null) {
            throw new RuntimeException("商品不存在"); // 模拟业务异常
        }

        // 2. 业务逻辑(可能触发Sentinel规则)
        Order order = new Order();
        order.setId(1L);
        order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));
        order.setUserId(userId);
        order.setNickName("zhangsan");
        order.setAddress("尚硅谷");
        order.setProductList(Arrays.asList(product));
        return order;
    }


    // 1. blockHandler:仅处理BlockException(限流/熔断)
    public Order createOrderBlockHandler(Long productId, Long userId, BlockException e) {
        Order order = new Order();
        order.setId(0L);
        order.setAddress("限流/熔断拦截:" + e.getClass().getSimpleName());
        return order;
    }


    // 2. fallback:处理业务异常(也可加BlockException参数兼容处理)
    public Order createOrderFallback(Long productId, Long userId, Throwable e) {
        Order order = new Order();
        order.setId(0L);
        order.setAddress("业务异常:" + e.getMessage());
        return order;
    }


    // 3. defaultFallback:全局兜底(无方法参数,仅Throwable)
    public Order createOrderDefaultFallback(Throwable e) {
        Order order = new Order();
        order.setId(0L);
        order.setAddress("全局兜底:" + e.getClass().getSimpleName());
        return order;
    }
}

2. 控制器层:无需额外处理(异常已被服务层兜底)

复制代码
@RestController
public class OrderController {

    @Autowired
    private OrderService orderService;

    // 前端请求直接调用,服务层已通过Sentinel完成异常兜底
    @GetMapping("/create")
    public Order createOrder(
        @RequestParam("userId") Long userId,
        @RequestParam("productId") Long productId
    ) {
        return orderService.createOrder(productId, userId);
    }
}

三、关键注意事项

  1. 方法签名规则
    • blockHandler:必须和原方法参数一致 ,最后加 BlockException 参数;
    • fallback:必须和原方法参数一致 ,最后加 Throwable 参数;
    • defaultFallback无原方法参数 ,仅需 Throwable 参数。
  1. 方法访问权限 :处理器方法(如createOrderBlockHandler)必须是 public 且和原方法在同一个类中 (或通过blockHandlerClass指定外部类)。
  2. 异常覆盖范围

blockHandler 仅管 Sentinel 规则异常;

fallback 管业务异常,也可通过加 BlockException 参数同时管规则异常;

defaultFallback 是最终兜底。

相关推荐
罗罗攀6 小时前
PyTorch学习笔记|张量的广播和科学运算
人工智能·pytorch·笔记·python·学习
小江的记录本6 小时前
【MyBatis-Plus】Spring Boot + MyBatis-Plus 进行各种数据库操作(附完整 CRUD 项目代码示例)
java·前端·数据库·spring boot·后端·sql·mybatis
左左右右左右摇晃6 小时前
Java 笔记--OOM产生原因以及解决方法
java·笔记
码界奇点7 小时前
基于Spring Boot的医院药品管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理
ShiJiuD6668889997 小时前
mysql 基础笔记一
数据库·笔记·mysql
海南java第二人7 小时前
Cursor 高级实战:从 Spring Boot 到微服务,AI 驱动的全流程开发指南
人工智能·spring boot·微服务
爱笑的源码基地8 小时前
门诊his系统源码,中西医结合的数字化门诊解决方案
java·spring boot·源码·二次开发·门诊系统·云诊所系统·诊所软件源码
2501_926978338 小时前
“术“与“道“的平衡---“缺失“与“完整”的统一
经验分享·笔记·ai写作
智者知已应修善业8 小时前
【51单片机用两个定时计数器级联实现定时】2023-04-12
c语言·经验分享·笔记·算法·51单片机