SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流

Sentinel是什么:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第1张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第2张图片

其实就是代替Hystrix的功能,解决:
  • 服务熔断
  • 服务降级
  • 服务限流
  • 服务雪崩

分为两部分:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第3张图片

下载安装:

  1. 官网github下载jar包;
  2. 在下载目录下启动jar包:java -jar jar包名称;
    SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第4张图片
  3. localhost:8080登录,用户名密码都是sentinel

初始化演示工程:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第5张图片

注意:Sentinel采用懒加载说明:

启动后发现sentinel客户端空空如也,这是因为Sentinel采用的懒加载,这时候我们只需要调用下API即可。
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第6张图片

流控规则:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第7张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第8张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第9张图片

三种流控模式:

1.直接(默认):

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第10张图片
超过一秒一次(或者设置线程数阙值,访问该api的线程数超过1秒一个),就会被限流,报错系统默认的错误信息:
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第11张图片

2.关联:

当关联的资源达到阈值时,就限流自己。
当于A关联的资源B达到阈值后,就限流A自己。
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第12张图片
设置postman频繁访问testB:
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第13张图片
测试A可以看到A又挂了:
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第14张图片
等线程B访问结束后,A恢复正常。

3.链路:

多个请求调用了同一个微服务。

三种流控效果:

1. 快速失败(默认):

直接失败,抛出异常,即上面的流控模式的测试的处理方式。

2.预热:

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值。
解释下:阈值设置为10,预热时长设置为10s,那么在前10秒钟,阈值其实时10/3,每秒限制3个qps,当达到10s后,qps才会提升到10个。
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第15张图片
作用:秒杀系统在开启的瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,把流量慢慢的放进来,慢慢的把阙值增长到设置的阙值

排队等待:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第16张图片SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第17张图片
作用:用于处理间隔性突发的流量,例如消息队列。例如这样的场景:在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是第一秒直接拒绝多余的请求

降级规则:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第18张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第19张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第20张图片

注意sentinel断路器是没有半开状态的:

半开状态:半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,由异常则继续打开断路器不可用。

三种降级规则:

平均响应时间:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第21张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第22张图片
这个200ms是平均响应时间,而不是某一次的响应时间。
后续亭子jmeter了,1s后,访问恢复正常。

异常比例:

在这里插入图片描述
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第23张图片
上述配置意思是:每秒内的请求中百分之20都失败了,那么久进入服务降级。
请求恢复后,3秒钟之后,服务降级解决。

异常数:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第24张图片
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第25张图片

热点key限流:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第26张图片
解释:比如某个商品被经常访问:localhost:80/get?pid=2;那么会对这条访问进行限流,但是不会对localhost:80/get?pid=3进行限流。

复习兜底方法:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第27张图片

限流配置:

方法:

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false)String p1,
                         @RequestParam(value = "p2",required = false)String p2) {
    return "----testHotKey";
}

// 兜底方法
public String deal_testHotKey(String p1, String p2, BlockException exception) {
    return "----deal_testHotKey, o(╥﹏╥)o"; // sentinel的默认提示都是: Blocked by Sentinel (flow limiting)
}

配置:testHotKey这个方法的第一个参数,限制同一个值每秒访问一次,超过九进行限流,调用兜底方法
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第28张图片

如果不设置blockHandler兜底方法,会报出错误页面:
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第29张图片
注意:如果程序中有运行异常,并不会进入兜底方法,@SentinelResource+blockHandler注解管的只是热点key的配置(fallback会处理业务异常)

参数例外项:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第30张图片
意思就是:比如当我们的第一个参数,比如上面的p1=10时,我们希望它的阈值是一个特殊值,比如可以达到200
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第31张图片
注意点:参数必须是基本类型或者String

注意点:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第32张图片

系统规则

SentnielResource:

上述演示的时候,我们可能会面临的问题:

  1. 如果没有写兜底方法,则是系统默认的,没有体现的我们自己的业务要求
  2. 如果写了兜底方法,我们自定义的处理方法又和业务代码耦合在一块,不直观
  3. 每个业务方法都添加一个兜底的,那代码膨胀家具
  4. 全局统一的处理方法没有体现

自定义限流处理逻辑并解耦:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第33张图片

更多注解说明:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第34张图片

Sentinel熔断处理:

新建服务提供者9003和9004;
新建消费者84。
添加pom依赖,yml文件,启动类,api等。不多说。
测试默认的轮询是否成功。

只配置fallback:

测试调用时,添加fallback注解,在程序中添加业务异常:

@RequestMapping("/consumer/fallback/{id}")
//@SentinelResource(value = "fallback")
@SentinelResource(value = "fallback",fallback ="handlerFallback")
public CommonResult<Payment> fallback(@PathVariable Long id) {
    CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/" + id,CommonResult.class,id);

    if(id == 4){
        throw new IllegalArgumentException("IllegalArgument ,非法参数异常...");
    }else if(result.getData() == null) {
        throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
    }

    return  result;
}


public CommonResult handlerFallback(@PathVariable Long id,Throwable e) {
    Payment payment = new Payment(id,"null");
    return new CommonResult(444,"异常handlerFallback,exception内容: " + e.getMessage(), payment);
}

经过测试,fallback属性可以处理业务异常(不包括运行时异常),blockHandler只能处理配置违规

只配置blockHandler:

@RequestMapping("/consumer/fallback/{id}")
@SentinelResource(value = "fallback",blockHandler = "blockHandler")
public CommonResult<Payment> fallback(@PathVariable Long id) {
   。。。
}

public CommonResult blockHandler(@PathVariable Long id,BlockException e) {
    Payment payment = new Payment(id,"null");
    return new CommonResult(444,"blockHandler-sentinel 限流,BlockException: " + e.getMessage(), payment);
}

经过测试,会抛出程序异常,可以验证上节结论。

同时配置:

@SentinelResource(value = "fallback",fallback ="handlerFallback",blockHandler = "blockHandler")

经过测试,如果在符合blockHandler的情况时,会进入兜底方法,如果不符合blockHandler的情况时,会进入blockHandler方法,也就是说:blockHandler优先级高于fallback

异常忽略:

如果出现指定异常,不会进入兜底方法,会直接报出异常。
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第35张图片

规则持久化:

一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化。

解决:

将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上sentinel上的流控规则持续有效。
SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第36张图片
pom添加:

<!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

yml添加datasource配置:

sentinel:
   transport:
     #配置Sentin dashboard地址
     dashboard: localhost:8080
     # 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
     port: 8719
   datasource:
     ds1:
       nacos:
         server-addr: localhost:8848
         dataId: cloudalibaba-sentinel-service
         groupId: DEFAULT_GROUP
         data-type: json
         rule-type: flow

熔断框架比较:

SpringCloud框架学习笔记(十二)-- Sentinel实现熔断和限流_第37张图片

你可能感兴趣的:(SpringCloud)