流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式

Posted IT挖掘机y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式相关的知识,希望对你有一定的参考价值。

fallback顾名思义当Java程序运行发生错误时,由该参数定义的方法进行处理

    @GetMapping(value = "/consumer/{id}")
    @SentinelResource(value = "consumer", fallback = "handlerFallback")
    public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
        ResponseEntity<String> entity = remoteService.getData(id);
        if (id <= 0) {
            throw new IllegalArgumentException("非法参数异常!");
        } else if (entity.getData() == null) {
            throw new NullPointerException("无响应数据,空指针异常!");
        }
        return entity;
    }

    public ResponseEntity<String> handlerFallback(Integer id, Throwable e) {
        return new ResponseEntity<>(443, "程序处理异常,开始执行fallback数据-->" +e.getMessage());
    }
  

在这里插入图片描述

blockHandler这个也很好明白,也就是当API违背控制台设置的阈值时,执行该参数定义的方法进行处理;说白了就是限流之后的处理

@GetMapping(value = "/consumer/{id}")
    @SentinelResource(value = "consumer",blockHandler = "blockHandler")
    public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
        ResponseEntity<String> entity = remoteService.getData(id);
        if (id <= 0) {
            throw new IllegalArgumentException("非法参数异常!");
        } else if (entity.getData() == null) {
            throw new NullPointerException("无响应数据,空指针异常!");
        }
        return entity;
    }

    public ResponseEntity<String> blockHandler(BlockException blockException) {
        return new ResponseEntity<>(444, "QPS过高,服务开始熔断降级--->"+blockException.getMessage());
    }

在这里插入图片描述

那么问题来了,如果同时发生Java运行错误和限流,那么会走哪个默认的方法呢?

 @GetMapping(value = "/consumer/{id}")
    @SentinelResource(value = "consumer", fallback = "handlerFallback", blockHandler = "blockHandler")
    public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
        ResponseEntity<String> entity = remoteService.getData(id);
        if (id <= 0) {
            throw new IllegalArgumentException("非法参数异常!");
        } else if (entity.getData() == null) {
            throw new NullPointerException("无响应数据,空指针异常!");
        }
        return entity;
    }

    public ResponseEntity<String> handlerFallback(Integer id, Throwable e) {
        return new ResponseEntity<>(443, "程序处理异常,开始执行fallback数据-->" +e.getMessage());
    }
    public ResponseEntity<String> blockHandler(Integer id, BlockException blockException) {
        return new ResponseEntity<>(444, "QPS过高,服务开始熔断降级--->"+blockException.getMessage());
    }

设置限流规则
在这里插入图片描述

当我持续刷新,它走的是blockHandler路线

在这里插入图片描述
记得在配置文件加入以下

feign:
  sentinel:
    enabled: true

以上是关于流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式的主要内容,如果未能解决你的问题,请参考以下文章

预告第 89 期 Sentinel 面向云原生微服务的高可用流控防护组件

Sentinel的核心注解SentinelResource简介与实践

配置容错组件 Sentinel

zuul集成Sentinel最新的网关流控组件

阿里开源Sentinel流控框架基本介绍与简单使用

SpringCloud Alibaba——Sentinel服务熔断与限流(四@SentinelResource注解)