微服务 springcloudAlibab之Sentinel 熔断,热点规则

熔断

基本介绍

依赖服务不稳定,造成响应的时间变长,让线程堆积,最终可能导致服务雪奔,熔断就是解决这个问题,

熔断策略

  • 慢调用比例 (SLOW_REQUEST_RATIO):

  • 异常比例 (ERROR_RATIO):

  • 异常数 (ERROR_COUNT)

熔断状态

Sentinel在1.8.0版本对熔断降级做了大的调整,可以定义任意时长的熔断时间,引入了半开启恢复支持。下面梳理下相关特性。

状态 说明
OPEN 表示熔断开启,拒绝所有请求
HALF_OPEN 探测恢复状态,如果接下来的一个请求顺利通过则表示结束熔断,否则继续熔断
CLOSE 表示熔断关闭,请求顺利通过

熔断降级规则包含下面几个重要的属性:

Field 说明 默认值
resource 资源名,即规则的作用对象
grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow 熔断时长,单位为 s
minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5
statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms
slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

官方文档网址: https://sentinelguard.io/zh-cn/docs/circuit-breaking.html

1. 慢调用比例

选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

自己理解:在单位时间内的请求,响应的时间大于最大响应时间的比例大于阈值,并且最小请求书大于设置次数,就会触发熔断策略,在熔断时间内属于半开启状态,如果再次请求过来小于最大响应时间,则恢复,如果还是大于最大响应时间则继续熔断
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第1张图片
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第2张图片

案例演示

  1. 首先新建一个测试类testC
//FlowLimitController.java
@GetMapping("/testC")
public String testC(){
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "----testC";
}
  1. 设置熔断策略,1QPS>5 并且这些请求的RT>300 并且大于比例阈值触发熔断
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第3张图片
    测试
    通过JMeter测试,1秒钟发起10个线程请求/testC,此时就会触发熔断效果,停止测试以后,10秒钟以后恢复正常
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第4张图片
    测试结果:
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第5张图片
    停掉jmeter测试之后,10秒之后恢复正常

2. 异常比例

当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

自己理解:1QPS的请求数>5,并且异常比例大于阈值,就会触发

微服务 springcloudAlibab之Sentinel 熔断,热点规则_第6张图片

案例演示

  1. 新建一个测试类
  @GetMapping("/testD")
  public String testD(Integer id){
      if(id != null && id > 1){
          throw new RuntimeException("异常比例测试");
      }
      return "------------testD";
  }
  1. 新建异常比例熔断策略
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第7张图片
  2. 用jemter测试
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第8张图片
  3. 测试结果
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第9张图片

3. 异常数

:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第10张图片

案例

  1. 增加异常数熔断规则
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第11张图片
  2. jmeter测试
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第12张图片
  3. 测试结果
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第13张图片

热点规则

热点参数限流

会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效

官网:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第14张图片

使用热点限流必须搭配sentinelResource注解

Sentinel 提供了 @SentinelResource 注解用于定义资源,它有很多的参数,我们这里主要关注两个参数:

  1. value:代表资源名称,必需项,因为需要通过resource name找到对应的规则,这个是必须配置的
  2. blockHandler:blockHandler 对应处理 BlockException 的方法名称,可选项,访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。

案例讲解

  1. 编写代码
 @GetMapping("/testHotKey")
  @SentinelResource("testHotKey")
  public String testHotKey(
          @RequestParam(value = "hot1",required = false) String hot1,
          @RequestParam(value = "hot2",required = false) String hot2,
          @RequestParam(value = "hot3",required = false) String hot3
                           ){
      return "-----testHotKey";

  }
  1. 配置热点规则
    微服务 springcloudAlibab之Sentinel 熔断,热点规则_第15张图片
    参数索引:0表示第一个参数 1表示第二个参数以此类推

微服务 springcloudAlibab之Sentinel 熔断,热点规则_第16张图片
测试,此时如果我们传入参数hot1,并且超过阈值,就会出现限流,但是此时的限流效果为报错,显示不友好
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第17张图片

更改友好显示

@SentinelResource(value=“xxx”,blockHandler=“xxx”)

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "block_hotKey")
    public String testHotKey(
            @RequestParam(value = "hot1",required = false) String hot1,
            @RequestParam(value = "hot2",required = false) String hot2,
            @RequestParam(value = "hot3",required = false) String hot3
                             ){
        return "-----testHotKey";
    }
    //处理异常方法,方法签名要和对应的接口方法保持一致
    public String block_hotKey(String hot1, String hot2, String hot3, BlockException blockException){
        return "系统繁忙请稍后再试";
    }

显示结果

热点规则之参数列外项

表示对参数进行更加细粒度话的配置,会根据参数的值,定义不同的限流规则

案例

定义热点规则,当hot1值为5的时候,将阈值设置为200,注意:参数类型必须与热点参数的类型一致


2. 测试结果
当参数值为1的时候,阈值为1 当参数值为5的时候,阈值为200,因此参数为1的时候,会报异常,参数为5的时候不会
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第18张图片
微服务 springcloudAlibab之Sentinel 熔断,热点规则_第19张图片

你可能感兴趣的:(微服务,sentinel,java)