七、Sentinel的注解@SentinelResource详细介绍

这篇具有很好参考价值的文章主要介绍了七、Sentinel的注解@SentinelResource详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


@SentinelResource 注解

Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ (切面)的扩展用于自动定义资源、处理 BlockException 等。

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

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

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

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

    资源调用的流量类型,是入口流量(EntryType.IN)还是出口流量(EntryType.OUT),注意系统规则只对 IN 生效

    /**
     * @return the entry type (inbound or outbound), outbound by default
     */
    EntryType entryType() default EntryType.OUT;
    

    为了验证,添加如下两个接口,并配置系统入口流量限流规则:

    @GetMapping("/out")
    @SentinelResource(value = "entryTypeOut", entryType = EntryType.OUT)
    public String entryTypeOut() {
        return "sentinelResource-out";
    }
    
    @GetMapping("/in")
    @SentinelResource(value = "entryTypeIn", entryType = EntryType.IN)
    public String entryTypeIn() {
        return "sentinelResource-in";
    }
    

    新增系统规则:

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

   此时查看实时监控面板,可以看出/in的通过的QPS为1,/out的入口通过的QPS为2,所以系统规则对/in是生效的

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

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

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

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

    • 返回值类型必须与原函数返回值类型一致;

    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

      @GetMapping("/fallback/{id}")
      //添加SentinelResource注解的fallback属性,同时设置方法来解决Java异常
      @SentinelResource(value = "fallback", fallback = "fallbackHandler")
      public String fallback(@PathVariable Long id){
          return "success";
      }
      
      //保证方法签名与原方法一致或加一个 Throwable 类型的参数
      public String fallbackHandler(Long id, Throwable e) {
          xxxxx
      }
      
      // 或者
       public String fallbackHandler(Long id) {
          xxxxx
       }
      
    • fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所以类型的异常(除了exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:

    • 返回值类型必须与原函数返回值类型一致;

    • 方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。

      public String defaultFallbackHandle(Throwable ex){
      	xxxxx
      }
      // 或者
      public String defaultFallbackHandle(){
      	xxxxx
      }
      
    • defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

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

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

自定义限流处理逻辑

其实我们在使用@SentinelResource注解这两种方案的时候,会出现一些问题:

  1. 没有体现我们自己的业务要求。
  2. 自定义处理方法和业务代码耦合在一起。
  3. 每个业务方法都添加一个限流处理方法,代码将会加剧膨胀。
  4. 无法实现统一全局处理。

解决:@SentinelResource除了blockHandler可以设置自定义限流处理逻辑方法以外,还提供另外一个属性来设置限流处理逻辑类型blockHandlerClass属性,此属性中设置的方法必需为 static 函数,否则无法解析。

具体逻辑

第一步

创建CustomerBlockHandler类型用于处理自定义限流处理逻辑,首先创建myhandler.CustomerBlockHandler

/**
 * 此类型用来处理限流自定义逻辑
 */
public class CustomerBlockHandler {
    public static String handlerException1(BlockException exception){
        return "handlerException1:系统异常,请稍后重试!";
    }
    public static String handlerException2(BlockException exception){
        return "handlerException2:网络崩溃了,请稍后重试!";
    }
}

第二步

我们在SentinelResourceTestController类型中添加一个接口方法,同时设置@SentinelResource注解和blockHandlerClass属性对应的类型和这个类型中对应的处理方法

/**
     * 此方法用到了自定义限流处理类型CustomerBlockHandler
     * 中的handlerException1方法来处理限流逻辑。
     */
@GetMapping("/byCustomer")
@SentinelResource(value = "byCustomer",
                  blockHandlerClass = CustomerBlockHandler.class,
                  blockHandler = "handlerException1")
public String byCustomer(){
    return "-----byCustomer";
}

第三步

测试:给byCustomer资源添加限流规则,然后来测试在超过限流阈值时处理方法是否为CustomerBlockHandler中handlerException1来进行处理。

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

流控效果:

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

fallback函数

(定义如上)

注意: fallback属性和blockHandler属性的本质不同在于他们作用的异常不同

  • blockHandler:针对违反Sentinel控制台配置规则时触发BlockException异常时对应处理的属性
  • fallback:针对Java本身出现的异常进行处理的对应属性。
@GetMapping("/fallback/{id}")
//添加SentinelResource注解的fallback属性,同时设置方法来解决Java异常
@SentinelResource(value = "fallback", fallback = "fallbackHandler")
public String fallback(@PathVariable Long id){
    if (id < 0 || id > 3) {
        throw new NullPointerException("无对应的记录");
    }
    return "success";
}

//保证方法签名与原方法一致或加一个 Throwable 类型的参数
public String fallbackHandler(Long id, Throwable e) {
    return "出现未知的记录";
}

效果(未加流控规则前):

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

然后,我们添加流控规则:

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

F5刷新,这时地效果为:
@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

总结:

fallback定义的函数方法,抛出了任何异常,都会触发指定函数的执行。(除了exceptionsToIgnore 里面排除掉的异常类型)
在触发定义的流控规则后,Sentinel会自动抛出BlockException异常。只有fallback存在,没有定义blockHandler时,此时也会触发fallback定义的函数方法




同时配置blockHandler和fallback属性
@GetMapping("/fallback/{id}")
//同时添加SentinelResource注解的fallback和blockHandler属性 exceptionsToIgnore被标注的异常将会被 原样抛出
@SentinelResource(value = "falllback", fallback = "fallbackHandler", blockHandler = "blockHandler", exceptionsToIgnore = {ArrayIndexOutOfBoundsException.class})
public String fallback(@PathVariable Long id){
    if (id < 0 || id > 3) {
        throw new NullPointerException("无对应的记录");
    }
    return "success";
}

//保证方法签名与原方法一致或加一个 Throwable 类型的参数
public String fallbackHandler(Long id, Throwable e) {
    return "出现未知的记录";
}

//处理Sentinel限流
public String blockHandler(Long id, BlockException e){
    return "BlockException限流";
}

添加流控规则:

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

  • 在没有触发流控规则之前的异常交给fallback来处理

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

  • 但是一旦触发流控规则就变成了blockHandler来处理

@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud

exceptionsToIgnore属性

exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

修改代码:

@GetMapping("/fallback/{id}")
//同时添加SentinelResource注解的fallback和blockHandler属性 exceptionsToIgnore被标注的异常将会被 原样抛出
@SentinelResource(value = "falllback", fallback = "fallbackHandler", blockHandler = "blockHandler", exceptionsToIgnore = {NullPointerException.class})
public String fallback(@PathVariable Long id){
    if (id < 0 || id > 3) {
        throw new NullPointerException("无对应的记录");
    }
    return "success";
}

效果:


@sentinelresource,Sentinel,sentinel,后端,微服务,spring cloud文章来源地址https://www.toymoban.com/news/detail-548547.html

到了这里,关于七、Sentinel的注解@SentinelResource详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初始Sentinel(Sentinel的简单介绍及项目整合)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍Sentinel的概念,优点,与Hystrix的对比以及微服务中整合Sentinel,后续文章将详细介绍Sentinel的细节部分。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬

    2024年02月05日
    浏览(39)
  • SpringCloudAlibaba之Sentinel介绍

    Sentinel 是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 上面两句话来自 Sentinel 官网的自我介绍

    2024年02月09日
    浏览(40)
  • sentinel介绍-分布式微服务流量控制

    https://sentinelguard.io/ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开

    2024年02月16日
    浏览(44)
  • 流量控制与熔断利器:Sentinel介绍

    这是《百图解码支付系统设计与实现》专栏系列文章中的第(19)篇,也是流量控制系列的第(6)篇。点击上方关注,深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel,背后的原理,适用的场景及存在的不足。不涉及具体的配置,具体配置请参考官方文档

    2024年01月21日
    浏览(43)
  • springCloudAlibaba集成sentinel实战(超详细)

    Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵: 随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展工作,

    2024年04月15日
    浏览(46)
  • sentinel + nacos 超详细使用步骤

    首先在sentinel-dashboard这个连接中下载对应的jar包。 下载完成后, 使用下面命令进行启动 看到一下日志表示启动成功(这里暂时没有遇到过启动失败的情况,又遇到失败的朋友可以评论沟通一下) 登录页面 sentinel首页,这里因为还没有在sentinel-dashboard接入,所以还看不到我们

    2023年04月08日
    浏览(37)
  • 一份详细 redis sentinel 哨兵架构搭建步骤<写于2023-04-06>

    redis 哨兵架构,其实是在 主从架构 基础上延伸的,sentinel 哨兵模式的 redis 实例,不提供读写操作的。实例相互之间,会感知到。 code: port 26379 daemonize yes # 改为后台启动 pidfile “/var/run/redis‐sentinel‐26379.pid” logfile “26379.log” dir “/usr/local/redis‐5.0.3/data” #sentinel monitor

    2023年04月14日
    浏览(35)
  • 【微服务笔记21】微服务组件之Sentinel服务熔断、服务降级、流量控制介绍

    这篇文章,主要介绍微服务组件之Sentinel服务熔断、服务降级、流量控制。 目录 一、Sentinel组件 1.1、Sentinel介绍 1.2、Sentinel环境搭建 (1)引入依赖 (2)资源和规则 1.3、使用SphU定义资源 (1)定义资源 (2)定义规则 1.4、使用SphO定义资源 (1)定义资源 (2)定义规则 1.5、

    2024年04月17日
    浏览(62)
  • Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用

    本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识,具体内容包括 分布式系统存在的问题 , 分布式系统问题的解决方案 , Sentinel介绍 , Sentinel快速开始 (包括: API实现Sentinel资源保护 , @SentinelResource注解实现资源保护 ), Sentinel控制台 , Spring Cloud Alibaba整合

    2024年01月17日
    浏览(53)
  • 2023最新谷粒商城笔记之Sentinel概述篇(全文总共13万字,超详细)

    什么是 熔断 当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,**进而熔断该节点微服务的调用,快速返回错误的响应信息。**检测到该节点微服务调用响应正常后恢复调用链路。 A服务调用B服务的某个功能,由于网络不稳定问题,或者B服务卡机,导致

    2024年02月16日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包