首页 > 其他分享 >Sentinel系列之(八)@SentinelResource

Sentinel系列之(八)@SentinelResource

时间:2024-02-28 11:16:00浏览次数:20  
标签:系列 函数 自定义 SentinelResource 限流 Sentinel CommonResult fallback

@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

相关文章

  • Sentinel系列之(七)系统规则
    系统规则【系统自适应限流】官网:https://github.com/alibaba/Sentinel/wiki/系统自适应限流1.基本介绍从整体维度对应用入口流量进行控制【其他规则是针对接口的,系统规则是针对所有接口的】违反规则后整个系统不可用阈值类型Load自适应(仅对Linux/Unix-like机器生效):系......
  • Sentinel系列之(六)热点参数限流规则
    热点参数限流规则......
  • Sentinel系列之(五)降级规则
    降级规则官网:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html1.基本介绍​ Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。​ 当资源被降级......
  • Sentinel系列之(四)流控规则
    流控规则流量控制官网:https://github.com/alibaba/Sentinel/wiki/流量控制1.基本介绍资源名:唯一名称,默认请求路径针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)阈值类型/单机阈值:QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时......
  • Sentinel系列之(三)初始化演示工程
    初始化演示工程1.构建cloudalibaba-sentinel-service8401建Module【cloudalibaba-sentinel-service8401】改POM<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="ht......
  • Sentinel系列之(二)安装Sentinel控制台
    安装Sentinel控制台Sentinel分为两个部分:核心库(ava客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/SpringCloud等框架也有较好的支持。【后台的监控程序】控制台(Dashboard)基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。【前......
  • Sentinel系列之(一)简介
    简介SpringCloudAlibabaSentinel实现熔断与限流1.官网https://github.com/alibaba/Sentinelhttps://github.com/alibaba/Sentinel/wiki/介绍https://sentinelguard.io/zh-cn/docs/introduction.html2.是什么面向云原生微服务的流量控制、熔断降级组件。阿里版的Hystri......
  • Nacos系列之(一)简介
    简介SpringCloudAlibabaNacos服务注册和配置中心1.为什么叫NacosNamingConfigurationService2.是什么官网:一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心Nacos=Eureka+Config+Bus疑问:Bus是服务总线,为什么也包含在Nacos里3.能干嘛替代Eureka做服......
  • Nacos系列之(五)Nacos集群和持久化配置
    Nacos集群和持久化配置......
  • Nacos系列之(四)Nacos作为服务配置中心
    Nacos作为服务配置中心以前我们使用配置中心:我们把配置放到Github上,Config作配置中心,Bus实现配置动态刷新现在使用配置中心:配置放到Nacos中,Nacos作配置中心,Nacos实现配置动态刷新1.Nacos作为配置中心-基础配置建Module【cloudalibaba-config-nacos-client3377】改POM......