Sentinel流控规则实现限流保护详解

 更新时间:2023年05月20日 10:29:34   作者:小白的救赎  
这篇文章主要介绍了Sentinel流控规则实现限流保护,Sentinel是一个分布式系统的流量控制组件,它可以实现限流,流控,降级等功能,提高系统的稳定性和可靠性,感兴趣想要详细了解可以参考下文

具体启动Sentinel的步骤可以参考我的上一篇文章。

概念

资源名:唯一名称,默认请求路径

针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源)

阅值类型单机阅值:
        QPS(每秒钟的请求数量):当调用该api的QPS达到值的时候,进行限流
        线程数:当调用该api的线程数达到阔值的时候,进行限流

是否集群:不需要集群

流控模式:
        直接:api达到限流条件时,直接限流
        关联:当关联的资源达到闻值时,就限流自己
        链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阔值,就进行限流)[api级别的针对来源]
流控效果:
        快速失败:直接失败,抛异常
        Warm Up(预热):根据codeFactor (冷加载因子,默认3) 的值,从闻值/codeFactor,经过预热时长,才达到设置的QPS闽值
        排队等待:匀速排队,让请求以匀速的速度通过,阔值类型必须设置为QPS,否则无效

流控规则

直接(默认)

控制层方法如下:

@RestController
public class SentinelController {
    @GetMapping("/testA")
    public String testA(){
        return "Sentinel testA run";
    }
    @GetMapping("/testB")
    public String testB(){
        return "Sentinel testB run";
    }
}

QPS+快速失败

通过地址栏输入:localhost:8401/testA

测试发现当每秒刷新页面的次数大于1则会弹出以下页面(表示限流),否则正常

线程数+直接控制

而直接控制的线程数设置为1表示如果超过一个页面访问此连接那就会限流否则正常。这里就不再对线程数做测试了

QPS+Warming up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统流量长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

举例:当预热时长=8,QPS单机阈值=3

  • 当并发请求到达的时候,实际的单机阈值是:QPS单机阈值配置 / coldFactoer= 3 / 3 =1,也就是每秒钟只能一个请求访问成功。
  • 预热时长为8秒,实际的单机阈值在8秒钟内逐步由1 -> 2 -> 3,最终等于QPS单机阈值配置。
  • 这里有一个注意点是QPS单机阈值一定要大于或等于3否则会一直请求不成功

QPS+排队等待

排队等待方式会严格的控制请求通过的间隔时间,就是让请求匀速的通过,对应的是漏桶算法。

言简意赅:QPS对应每秒处理的线程为1,超时时间表示超过10s则不接受其他线程的请求。也就是说将超时时间(ms) / 单机阈值(s/个) = 线程通过数。

关联

使用了testA关联testB那么当二者其一越界了即二者其一或者触犯了阈值规则,那么规则的时长内即QPS内testA是无法访问的,换句通俗易懂的就是:其中一个犯错,testA就得扛锅。但要注意的是不是永久失效,只是阈值内失效。

链路

与关联相反。两者之一犯错,那么就是入口资源背锅。

关联与链路的区别

关联:

配置: “查询订单” 关联 “下单” 接口, 当"下单"到达阈值, 限流"查询订单"接口

链路:

配置: “查询订单”为入口时, 当"查询订单"到达阈值时, 限流"查询订单"

到此这篇关于Sentinel流控规则实现限流保护流程详解的文章就介绍到这了,更多相关Sentinel流控规则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java日常练习题,每天进步一点点(19)

    Java日常练习题,每天进步一点点(19)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java多线程之定时器Timer的实现

    Java多线程之定时器Timer的实现

    这篇文章主要为大家详细介绍了Java多线程中定时器Timer类的使用以及模拟实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Java线程创建静态代理模式代码实例

    Java线程创建静态代理模式代码实例

    这篇文章主要介绍了Java线程创建静态代理模式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • java排序算法之冒泡排序

    java排序算法之冒泡排序

    这篇文章主要为大家详细介绍了java排序算法之冒泡排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Spring实现自定义注解处理器解析和处理注解

    Spring实现自定义注解处理器解析和处理注解

    这篇文章主要介绍了Spring实现自定义注解处理器解析和处理注解,注解在现代Java编程中扮演了至关重要的角色,无论是简化代码、增强可读性,还是将元数据与业务逻辑分离,注解都让我们的代码更加优雅和灵活,需要的朋友可以参考下
    2024-10-10
  • 使用ResponseEntity处理API返回问题

    使用ResponseEntity处理API返回问题

    这篇文章主要介绍了使用ResponseEntity处理API返回问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 浅谈java+内存分配及变量存储位置的区别

    浅谈java+内存分配及变量存储位置的区别

    下面小编就为大家带来一篇浅谈java+内存分配及变量存储位置的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • IDEA 2022.1.4用前注意事项

    IDEA 2022.1.4用前注意事项

    这篇文章主要介绍了IDEA 2022.1.4用前注意事项,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • java多线程中的生产者和消费者队列详解

    java多线程中的生产者和消费者队列详解

    这篇文章主要介绍了java多线程中的生产者和消费者队列详解,队列,是一种数据结构,除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的,需要的朋友可以参考下
    2024-01-01
  • 获取Java的MyBatis框架项目中的SqlSession的方法

    获取Java的MyBatis框架项目中的SqlSession的方法

    SqlSession中包括已经映射好的SQL语句,这样对象实例就可以直接拿过来用了,那么这里就来讲解获取Java的MyBatis框架项目中的SqlSession的方法
    2016-06-06

最新评论