@SentinelResource
相当于Hystrix中的@HystrixCommand
1. 按资源名称限流
-
环境说明
启动了单机版的Nacos
启动了Sentinel
基于项目
cloudalibaba-sentinel-service8401
继续改造 -
增加RateLimitController
package com.atguigu.springcloud.alibaba.controller; import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.atguigu.springcloud.entities.CommonResult; import com.atguigu.springcloud.entities.Payment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class RateLimitController { @GetMapping("/byResource") @SentinelResource(value = "byResource",blockHandler = "handleException") public CommonResult byResource() { return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001")); } /** 自定义处理方法可以接收异常 **/ public CommonResult handleException(BlockException exception) { return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用"); } }
-
使用
项目启动后,由于使用了@SentinelResource,在
簇点链路
下可以针对@SentinelResource的value值所对应的资源配置规则。注:要访问一次http://localhost:8401/byResource
-
配置规则,这里以流控规则为例
-
快速多次访问http://localhost:8401/byResource,限流,走了我们自定义的处理方法。
至此,按资源名称限流配置完成。
关闭cloudalibaba-sentinel-service8401,刚刚配置的规则消失了,参考3.10 规则持久化。
2. 按照Url地址限流
-
环境说明
启动了单机版的Nacos
启动了Sentinel
基于项目
cloudalibaba-sentinel-service8401
继续改造 -
修改RateLimitController,增加如下代码
@GetMapping("/rateLimit/byUrl") @SentinelResource(value = "byUrl") public CommonResult byUrl() { return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002")); }
-
这里使用的是接口路径作为资源名进行配置的
-
触发限流时,由于此次没有指定自定义限流处理方法,所以会使用系统默认的。
至此,按Url地址限流配置完成。
3. 面临的问题
- 自定义的限流处理逻辑跟业务代码耦合
- 每个接口都想进行自定义限流处理的话需要为每个接口定义一个自定义的限流处理方法,代码膨胀。
- 全局统一的处理方法没有体现。
4. 自定义限流处理类实现解耦
解决3. 面临的问题
-
创建CustomerBlockHandler
package com.atguigu.springcloud.alibaba.myhandler; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.atguigu.springcloud.entities.CommonResult; public class CustomerBlockHandler { /** * 1.必须是类方法 * 2.自定义限流处理方法的返回值要与业务接口的返回值一致 * 3.使用时需要指定具体哪个方法做限流处理 * @param exception * @return */ public static CommonResult handleException(BlockException exception) { return new CommonResult(2020, "自定义限流处理信息....CustomerBlockHandler1111111"); } public static CommonResult handleException2(BlockException exception) { return new CommonResult(2020, "自定义限流处理信息....CustomerBlockHandler22222222"); } }
-
修改RateLimitController,增加如下代码
/** * blockHandlerClass指定自定义的限流处理类 * blockHandler指定具体的处理方法 * @return */ @GetMapping("/rateLimit/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2") public CommonResult customerBlockHandler() { return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003")); }
-
配置规则
-
触发限流时,走了我们自定义的限流处理逻辑。
5. 更多注解属性说明
@SentinelResource
用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource
注解包含以下属性:
-
value
:资源名称,必需项(不能为空) -
entryType
:entry 类型,可选项(默认为EntryType.OUT
) -
blockHandler
/blockHandlerClass
:blockHandler
对应处理BlockException
的函数名称,可选项。blockHandler 函数访问范围需要是public
,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException
。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。 -
fallback
/fallbackClass
:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore
里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要和原函数一致,或者可以额外多一个
Throwable
类型的参数用于接收对应的异常。 - fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定
fallbackClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。
注:1.6.0 之前的版本 fallback 函数只针对降级异常(
DegradeException
)进行处理,不能针对业务异常进行处理。 -
defaultFallback
(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了exceptionsToIgnore
里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要为空,或者可以额外多一个
Throwable
类型的参数用于接收对应的异常。 - defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定
fallbackClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。
注:1.8.0 版本开始,
defaultFallback
支持在类级别进行配置。 -
exceptionsToIgnore
(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
注意:注解方式埋点不支持 private 方法。
Sentinel也支持直接编码的方式定义资源,但是侵入性太强,跟我们自己的业务代码耦合度很高,更推荐注解方式。
参考网站:https://github.com/alibaba/Sentinel/wiki/介绍#step-2-定义资源
Sentinel主要有三个核心API
- SphU:定义资源
- Tracer:定义统计(线程数、QPS等)
- ContextUtil:定义了上下文
6. 总结
使用@SentinelResource可以自定义资源名
资源名可以是两种,一种是接口路径,一种是@SentinelResource注解的value属性的值
如果@SentinelResource注解不配置blockHandler,就用系统默认的限流处理方法,如果配置了就用自定义的限流处理方法。
标签:系列,函数,自定义,SentinelResource,限流,Sentinel,CommonResult,fallback From: https://www.cnblogs.com/wzzzj/p/18039350