熔断限流----Sentinel

1.功能特点

  1. 丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
  2. 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500
    台以下规模的集群的汇总运行情况。
  3. 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC
    的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  4. 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI
    扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
    在这里插入图片描述
    开源生态
    在这里插入图片描述
    Sentinel 分为两个部分:
  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

2.快速接入

官网地址
根据该步骤建立demo

控制台效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.入门使用

引入pom

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>最新版本</version>
</dependency>

添加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 这里使用的是nacos注册中心,实际配置以自己项目的注册中心为准
    sentinel:
        transport:
            dashboard: 127.0.0.1:8080 # 上面启动的地址

实际中的应用和配置

专业术语说明:
在这里插入图片描述

3.1.阈值类型 QPS 流控模式直接

相关参数和方法说明
Sentinel提供了这样的功能,让我们可以另外定义一个方法来代替被限制或异常服务返回数据,这就是fallbackblockHandler

  • fallback:失败调用,若本接口出现未知异常,则调用fallback指定的接口。
  • blockHandler:sentinel定义的失败调用或限制调用,若本次访问被限流或服务降级,则调blockHandler指定的接口。

1.测试的service层

	/**
     *  阈值类型 QPS  流控模式直接
     */

    String hello(String limit);

2.service实现层

    @SentinelResource(value = "limit",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
    @Override
    public String hello(String limit) {
        return "阈值类型 QPS  流控模式直接";
    }
    
    //自定义简单的 服务限流或者降级回调方法  
    public String defaultFallback(){
        return "太拥挤了 ~ 请稍后重试 ";
    }
    public String handlerException(){
        return "测试超出流量限制的部分是否会进入到blockHandler的方法。";
    }

3.controller层

    @Autowired
    private SentinelService sentinelService;

    @GetMapping("/test1")
    public String testA(){
        return "this is testA -----------";
    }

    @GetMapping("/test2")
    public String testB(){
        return "this is testB -----------";
    }

    @GetMapping("/limit")
    public String limit (){
        return sentinelService.hello("测试QPS限流");
    }

4.依次调用上面的三个测试接口,因为Sentinel服务监控是懒加载的,只有当服务的接口被调用之后,才会被监控中心捕捉到,调用之后,在面板可以看到如下数据
在这里插入图片描述
5.对相关服务的接口进行流控配置 ,流控配置如下(当前接口在1s内次数超过3次,直接触发限流操作,进入失败的回调方法)
在这里插入图片描述
在这里插入图片描述
6.测试,在浏览器获取使用postman快速点击接口http://localhost:8041/limit,当1s内超过三次,进去预先设置的回调方法,返回的参数为
在这里插入图片描述
在这里插入图片描述

3.2.阈值类型 线程数、流控模式 直接

1.service层

String threadTest(String thread);

2.service测试层

    @SentinelResource(value = "thread",defaultFallback = "defaultFallback",blockHandler = "handlerException",blockHandlerClass = {BlockException.class})
    @Override
    public String threadTest(String thread) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "阈值类型 线程数、流控模式 直接";
    }
   

3.controller层

    @GetMapping("/thread")
    public String thread(){
        return sentinelService.threadTest("线程测试");
    }

4.使用Apache jmeter 进行多线程测试
创建5个线程,正常测试. 每个线程结果正常返回, 添加线程限制限流配置
在这里插入图片描述
5.设置线程阈值为4个,创建五个线程去调用接口,从返回结果可以看出,前面四个线程返回结果正常,有一个线程返回的是被限制的结果
在这里插入图片描述

3.3.阈值类型 QPS、流控模式 关联

1.基于上面的test1和test2接口不变,将这两个接口建立关联关系.
2.模拟场景: 支付接口和订单接口,放支付接口进入阈值的时候,会限制订单接口的产生.缓解服务的压力.具体的流程如下
在这里插入图片描述
3.测试接口,单独快速、慢速的测试test1和test2接口,返回结果都是正常
4.使用postman和Jmeter测试两个接口,创建多个线程跑test2的同时使用postman调用test1 ,触发限流,返回异常日志.当test2结束限流之后,test1接口才会正常返回
在这里插入图片描述

3.4.流控效果

在这里插入图片描述
1.快速失败
直接失败,进入异常处理,或者进入指定的回调,不做其它的额外处理.
2.Warm Up 从开始到最大的阈值,会进入一个缓冲阶段,一开始的阈值是最大阈值的1/3,然后缓慢增大,直到最大的阈值,适用于与突然增大的流量转变成缓慢增大,避免突然出现的大流量造成服务器的宕机。

说明: 比如设置阈值为10,最初的请求最大允许阈值为10/3=3个,当再次出现大量的请求,自动会在5s内将阈值自动从3提升至10个

3.排队等待
在这里插入图片描述

设置阈值类型为QPS 单机阈值为2个,流控效果为排队等待。实现的效果为当1s内,当前接口的请求次数超过2个,那么剩下的不会直接进去异常,进入排队,等待前面的接口调用完成之后才会继续调用后面的接口,也可以设置超时时间,如果超过当前时间还没调用完,后面的接口直接会被丢弃进入异常

使用JMeter创建10个线程测试接口,线程间隔时间为0.4s,超时时间设置2000ms,会发现只有一小部分被限流,其它的请求都会缓慢执行.
在这里插入图片描述

3.5.熔断降级

在这里插入图片描述

  • 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx 来配置。

  • 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

  • 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

RT 平均响应时间

1.如果请求的平均响应数超过阈值(ms),则会进入准降级状态。 2、如果接下来1s内持续进入5个请求,他们的RT都持续超过了这个阈值,那么在接下来的时间窗口(s)内,就会对这个服务进行降级。 3、RT默认最大为4900ms,如果需要更大,可以通过 -Dcsp.sentinel.statistic.max.rt=xxx 进行配置。
在这里插入图片描述
异常比例数

每秒的异常总数,占通过量的比值超过配置的值之后,触发熔断降级。 时间窗口和之前一样,属于熔断保护时间。 占的比值数范围为:[0.0,1.0];

异常数
资源 1分钟 内的异常总数超过限定的阈值,触发熔断降级!

设定异常数为3,表示一分钟请求的异常出现了3个及以上,触发熔断降级!

[注意]此处有坑!
由于异常数是按照分钟统计的个数,时间窗口中的设置也必须要大于60s。 不然会出现:结束熔断保护后仍可能继续熔断保护(不会释放!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值