• Sentinel注解@SentinelResource详解


    Sentinel注解@SentinelResource详解

    熔断

    针对访问超过限制【sentinel中配置的限制】的资源,通过java代码配置,返回一个自定义的结果,需要用到 @SentinelResource 注解的 blockHandlerClassblockHandler 属性。

    blockHandlerClass:自定义处理类

    blockHandler:自定义处理方法,填方法名即可

    配置方式

    // 接口配置
    @GetMapping(path = {"/testD"})
    @SentinelResource(value = "test_d",blockHandlerClass = HandlerConfig.class,blockHandler = "errorMsg")
    public Map testD(@RequestParam("p1") String p1){
        Map result = new HashMap<String,Object>();
        result.put("sentinel_server:","testD");
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    // 自定义限流后的返回结果类
    public class HandlerConfig {
        public static Map errorMsg(String p1,BlockException blockException){
            Map result = new HashMap<String,Object>();
            result.put("error:","400");
            result.put("msgA","接口限流");
            result.put("p1",p1);
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ⚠️注意

    1. testD方法自定义返回结果处理方法errorMsg 必须返回统一的数据类型
    2. 如果testD方法中携带参数,那么 自定义返回结果处理方法errorMsg 必须定义类型,顺序一样的参数
    3. 自定义返回结果处理方法errorMsg 必须使用static修饰
    4. 自定义返回结果处理方法errorMsg 的参数必须携带BlockException且必须作为最后一个参数

    内部错误

    对于方法内部出现的异常,sentinel也是可以处理的,通过java代码配置,不返回一个类似如下图的报错,而是返回一个自定义的结果。需要用到 @SentinelResource 注解的 fallbackClassfallback 属性。

    📓 对于内部异常的处理,即使不在sentinel中配置,也可以正常执行。

    fallbackClass:自定义处理类

    fallback:自定义处理方法,填方法名即可

    配置方式

    // 接口配置
    @GetMapping(path = {"/testD"})
    @SentinelResource(value = "test_d",fallbackClass = FallbackConfig.class, fallback="handlerException")
    public Map testD(@RequestParam("p1") String p1){
        int i = 10/0;// 这里一定会触发异常
        Map result = new HashMap<String,Object>();
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    // 自定义的对方法内部产生的异常返回我们自定义的结果处理类
    @Slf4j
    public class FallbackConfig {
        public static Map handlerException(String p1){
            Map result = new HashMap<String,Object>();
            result.put("error:","400内部错误");
            result.put("p1",p1);
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ⚠️注意

    1. testD方法自定义返回结果处理方法handlerException 必须返回统一的数据类型
    2. 如果testD方法中携带参数,那么 自定义返回结果处理方法handlerException 必须定义类型和参数名以及顺序一样的参数
    3. 自定义返回结果处理方法handlerException 必须使用static修饰

    内部错误和熔断同时存在的情况

    那么如果说一个web接口既存在发生内部错误的可能,也需要超阈熔断。那么这两个配置,是否可以同时配置呢?直接说答案:可以!在未超阈的前提下,直接进入web接口方法中,如果方法执行出现内部错误,走fallback,熔断后走HandlerConfig,根本就不到fallback这一步,直到时间窗口过去进入新的时间窗口。

    开发者自定义忽略异常

    绝大多数开发环境中,以上两种配置方式已经足够使用;不过在一些特殊的情况下,开发者不希望sentinel对某些异常直接以自定义fallback方法的形式返回,而是直接返回异常本身,这就需要另一个属性exceptionsToIgnore,它所包含的异常是不被sentinel的fallback管理的,也就是说一旦发生它所定义的异常,程序将不会再走自定义的fallback方法

    @GetMapping(path = {"/testD"})
    @SentinelResource(value = "test_d",
                      blockHandlerClass = HandlerConfig.class,blockHandler = "errorMsg",
                      fallbackClass = FallbackConfig.class, fallback="fallback",
                      exceptionsToIgnore = {IllegalArgumentException.class})
    public Map testD(@RequestParam("p1") String p1){
        if ( p1.equals("admin")){
            // 非法参数异常被exceptionsToIgnore属性包含,所以不会走fallback方法,而是直接返回异常
            throw new IllegalArgumentException("非法参数异常-admin不能用于申请");
        } else if ( p1.isEmpty() ) {
            // 空指针异常并未被exceptionsToIgnore属性包含,所以最后还是要走fallback方法
            throw new NullPointerException("p1不能为空");
        }
        Map result = new HashMap<String,Object>();
        result.put("sentinel_server:","testD");
        result.put("p1:",p1);
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    演示效果如下

  • 相关阅读:
    文心一言 VS 讯飞星火 VS chatgpt (203)-- 算法导论15.3 2题
    为什么选择虚拟展会展览?了解虚拟展会展览的应用领域
    Java-全网最详细数据结构
    碰到一个用pip死活装不上模块的问题(ModuleNotFoundError: No module named ‘triton‘)
    【Linux】kubernetes - kubectl
    Keras深度学习实战——推荐系统数据编码
    前端基础建设与架构20 如何理解前端中面向对象的思想?
    a commponent required a bean of type XXXXXX that could not be found-2022新项目
    使用pg_hint_plan定义Postgresql执行计划
    VisualAssistX无法加载,加载问题异常解决
  • 原文地址:https://blog.csdn.net/qq_35215728/article/details/136142300