@SentinelResource注解的使用
创始人
2024-03-02 18:21:19
0

@SentinelResource注解的使用

1、按资源名称限流+后续处理

前置条件:

  1. 启动Nacos
  2. 启动Sentinel

1.1、修改cloudalibaba-sentinel-service8401

引入自己的API通用包


com.zcl.springcloudcloud-api-commons1.0-SNAPSHOT

1.2、新建控制器RateLimitController

按资源名称以及兜底方法 @SentinelResource(value = "byResource",blockHandler = "handleException")

package com.zcl.springcloud.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.zcl.springcloud.entities.CommonResult;
import com.zcl.springcloud.entities.Payment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** 描述:@SentinelResource注解使用** @author zhong* @date 2022-10-02 11:23*/
@RestController
public class RateLimitController
{/*** 按value = "byResource"资源名称限流测试* @return*/@GetMapping("/byResource")@SentinelResource(value = "byResource",blockHandler = "handleException")public CommonResult byResource(){return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));}/*** 兜底方法* @param exception* @return*/public CommonResult handleException(BlockException exception){return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");}
}

1.3、配置限流规则

需要先访问http://localhost:8401/byResource

一秒钟访问正常显示,如果超过一秒钟就会执行自定义的兜底方法handleException

在这里插入图片描述

2、按照Url地址限流+后续处理

通过访问的URL来限流,会返回Sentinel自带默认的限流处理信息

2.1、测试控制器

@RestController
public class RateLimitController
{/*** 按URL来进行限流:/rateLimit/byUrl* @return*/@GetMapping("/rateLimit/byUrl")@SentinelResource(value = "byUrl")public CommonResult byUrl(){return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));}
}

2.2、添加流控规则

流控规则既可以使用@GetMapping("/rateLimit/byUrl")访问的URL进行,也可以使用 @SentinelResource(value = "byUrl")指定的资源名称进行

在这里插入图片描述

2.3、测试

当请求的url资源1秒钟超过一个QPS的话就会使用系统的报错提示Blocked by Sentinel (flow limiting),因为没有通过blockHandler = "handleException"指定兜底方法

3、上面兜底方案面临的问题

  1. 系统默认的,没有体现我们自己的业务要求。
  2. 依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观。
  3. 每个业务方法都添加一个兜底的,那代码膨胀加剧。
  4. 全局统一的处理方法没有体现。

4、客户自定义限流处理逻辑

4.1、创建CustomerBlockHandler类用于自定义限流处理逻辑

package com.zcl.springcloud.myhandler;import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.zcl.springcloud.entities.CommonResult;/*** 描述:自定义异常处理类,必须是静态的并且返回值与控制器的一样** @author zhong* @date 2022-10-03 8:12*/
public class CustomerBlockHandler {public static CommonResult handleException(BlockException exception) {return new CommonResult(2022,"使用了自定义的异常处理类------1");}public static CommonResult handleException2(BlockException exception) {return new CommonResult(2022,"使用了自定义的异常处理类------2");}
}

4.2、创建控制器接口测试

blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2"指定自定义资源处理类是哪一个并且通过blockHandler指定类里面的具体某个方法

注意:注解方式埋点不支持private方法

@RestController
public class RateLimitController
{/*** 测试自定义异常处理类* @return*/@GetMapping("/rateLimit/customerBlockHandler")@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2")public CommonResult customerBlockHandler(){return new CommonResult(200,"按客户自定义限流处理逻辑");}
}

4.3、流控规则配置

在这里插入图片描述

4.3、请求测试

  1. 正常请求1秒一个QPS:http://localhost:8401/rateLimit/customerBlockHandler

    {"code": 200,"message": "按客户自定义限流处理逻辑","data": null
    }
    
  2. 异常请求1秒两个QPS:http://localhost:8401/rateLimit/customerBlockHandler

    {"code": 2022,"message": "使用了自定义的异常处理类------2","data": null
    }
    

5、更多注解属性说明

注解官网地址:https://sentinelguard.io/zh-cn/docs/annotation-support.html

@SentinelResource 注解

注意:注解方式埋点不支持 private 方法。

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:

  • value:资源名称,必需项(不能为空)

  • entryType:entry 类型,可选项(默认为 EntryType.OUT

  • blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • fallback
    

    :fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了

    exceptionsToIgnore
    

    里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:

    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback
    

    (since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所以类型的异常(除了

    exceptionsToIgnore
    

    里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:

    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandlerfallbackdefaultFallback,则被限流降级时会将 BlockException 直接抛出

5.1、代码自定义流控规则API

  1. SphU定义资源
  2. Tracer定义统计
  3. ContextUtil定义了上下文

相关内容

热门资讯

修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
【前端】‘??‘与‘||‘有什... 0 问题 经常写const data = res.data.a ?? ''或者const d...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
牛客计算器的改良(Python... 文章目录1.题目描述2.输入描述:3.输出描述:4.示例15.分析6.代码7.结语 链接࿱...
正大杯|市调大赛|2023备赛... 关键信息 同时随着精细化养宠趋势的深入,宠物消费类目日渐丰富。 本报告通过 Niuco...
QGIS下载在线地图(Goog... 前言 国内外有很多在线地图下载软件,但功能单一,基本上只能下载数据&#x...