栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloudAlibaba Sentinel(四)—客户端@SentinelResource注解全解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloudAlibaba Sentinel(四)—客户端@SentinelResource注解全解析

文章目录
  • 一、@SentinelResource全属性解析
        • value
        • entryType
        • blockHandler
        • blockHandlerClass
        • fallback
        • fallbackClass
        • defaultFallback(since 1.6.0)
        • exceptionsToIgnore(since 1.6.0)
  • 二、流控实践
    • 1.基于资源名称限流
      • 写测试代码
      • 控制面板配置
      • 测试异常发生
      • 出现问题
    • 2.基于URL资源名称限流
      • 写测试代码
      • 控制面板配置
      • 测试异常发生
      • 出现问题
    • 3.用户自定义限流处理
      • 1.概述
      • 2.实践
      • 3.测试
  • 三、熔断降级实践
    • 1.概述
    • 2.实践
      • java代码如下
      • 控制台配置如下
      • 测试

上面提到该注解可以监控一个方法,不管是Controller还是service中的都可以。

一、@SentinelResource全属性解析
value
  • 资源名称,必需项,因为需要通过resource name找到对应的规则,这个是必须配置的。
entryType
  • entry 类型,可选项。有IN和OUT两个选项,默认为 EntryType.OUT。
blockHandler
  • blockHandler 对应处理 BlockException 的函数名称,可选项。
    blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,
    参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。
blockHandlerClass
  • blockHandler 函数默认需要和原方法在同一个类中,如果希望使用其他类的函数,则需要指定blockHandlerClass 为对应的类的 Class 对象。注意对应的函数必需为** static 函数**,否则无法解析。
fallback
  • fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。
    fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。
fallbackClass
  • fallbackClass的应用和blockHandlerClass类似,fallback 函数默认需要和原方法在同一个类中。
    若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
defaultFallback(since 1.6.0)
  • 如果没有配置defaultFallback方法,默认都会走到这里来。
    默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑。
    默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
exceptionsToIgnore(since 1.6.0)
  • 用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

看了一大片文字,头是不是要zha掉了,现在要想把知识变少,就要分类处理。

之前说过,sentinel的主要作用用于流量控制,熔断降级。上面的属性就是为了实现这两个功能才有的。

  • 流量控制:blockHandlerClass+blockHandler,指定流量达到阈值后触发哪个类(blockHandlerClass)的哪个方法(blockHandler)

  • 熔断降级:fallbackClass+fallback,指java代码出现异常时触发哪个失败类(fallbackClass指定)的哪个方法(fallback指定)。其中defaultFallback指定默认的方法,exceptionsToIgnore忽略哪个异常不处理。

注意上面指定的方法需要是static静态方法。下面我们开始实战,等实践完,相信你会更透彻。

二、流控实践

概述:下面的基于资源名称限流和基于URL名称限流,只是铺垫,让大家明白有这两种配置。用户自定义限流处理才是重点,项目中主要用它实现流量控制

1.基于资源名称限流 写测试代码
@RestController
public class SentinelTestController {

    @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public String byResource(){
        return "按照资源名称限流测试ok";
    }

    //达到阈值走该方法
    public String handleException(BlockException e){
        return e.getClass().getCanonicalName()+"服务不可用";
    }

}

控制面板配置

点击簇点链路,资源名称流控。注意控制面板的资源名和代码哪块部分对应,这个一定要理解,如下图

配置QPS为1

测试异常发生

com.alibaba.csp.sentinel.slots.block.flow.FlowException服务不可用

出现问题

如果服务宕掉,流控规则也会消失

2.基于URL资源名称限流 写测试代码
@GetMapping("/byResource")
@SentinelResource(value = "byResource")
public String byUrl(){
    return "按照url名称限流测试ok";
}
控制面板配置

测试异常发生

Blocked by Sentinel (flow limiting),即使配了blockHandler也不会走异常方法

出现问题

上面两者不具有灵活性,下面开始讲用户自定义配置

3.用户自定义限流处理 1.概述

前面是铺垫,下面是重点。因为上面两种方式都不能和业务系统很好的整合。于是使用用户自定义的限流处理,大致分为两个步骤。

1.自定义限流处理类,处理类返回值进行统一。一般前后端分离架构中都有一个统一返回的类型

2.使用@SentinelResource注解中blockHandlerClass和blockHandler属性标识哪个类中的哪个方法处理流控逻辑

  • blockHandlerClass:指定哪个自定义类
  • blockHandler:哪个类的哪个方法处理流控逻辑
2.实践

下面将代码和sentinel控制台的簇点链路做一下对应。其中CustomerBlockHandler类中可以定义多个方法。

流控规则就是QPS阈值是1

3.测试

浏览器输入地址http://localhost:8090/self/test ,一直请求触发handleException方法返回com.alibaba.csp.sentinel.slots.block.flow.FlowException服务不可用


三、熔断降级实践 1.概述

从代码的角度再来说下限流和熔断降级的区别

  • 限流:当对资源的请求数超过阈值时,会触发限流效果。触发限流后会走blockHandlerClass+blockHandler共同指定的方法逻辑。
  • 熔断降级:当一个微服务发生异常,注意是java代码的异常,会触发熔断效果。触发熔断后会走fallbackClass+fallback共同指定的方法逻辑。
2.实践

单个的熔断的实验就不做了,模仿着限流的步骤就可以做出来。现在将限流和熔断整合到一起

java代码如下

控制台配置如下

测试
1.测试限流,不触发熔断
url:http://localhost:8090/self/test/1
结果:com.alibaba.csp.sentinel.slots.block.flow.FlowException服务已被限流

2.测试熔断,不触发限流
url:http://localhost:8090/self/test/0
结果:java.lang.RuntimeException服务已被熔断

3.既触发熔断,又触发限流
url:url:http://localhost:8090/self/test/0
结果:com.alibaba.csp.sentinel.slots.block.flow.FlowException服务已被限流

证明熔断和限流同时存在时,只会被限流降级,进行blockHandler指定的方法处理逻辑

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/282061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号