Sentinel中三种流控模式的使用详解

 更新时间:2023年08月30日 08:59:54   作者:小威要向诸佬学习呀  
这篇文章主要为大家详细介绍了Sentinel中三种流控模式(预热模式,排队等待模式和热点规则)的使用,文中的示例代码讲解详细,感兴趣的可以了解下

预热模式

Sentinel的warm up模式是一种流量控制模式,它可以在系统刚启动的时候,通过预热的方式逐步放开限流的限制,让系统逐步达到稳定状态,避免系统启动时因为限流过于严格而导致的性能问题。

具体来说,Sentinel的warm up模式会在系统启动时,先限制一定的流量,然后逐步放开限制,直到系统达到一个稳定的状态。在逐步放开限制的过程中,Sentinel会根据系统的实际情况,动态调整限制的值,以确保系统的稳定性和性能

在实际应用中,可以通过以下代码来使用Sentinel的warm up模式:

public class WarmUpDemo {
    public static void main(String[] args) {
        // 创建一个规则实例
        FlowRule rule = new FlowRule();
        rule.setResource("test");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
        rule.setWarmUpPeriodSec(10);
        rule.setMaxQueueingTimeMs(500);
        // 加载规则
        List<FlowRule> rules = new ArrayList<>();
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
        // 定义资源
        Entry entry = null;
        try {
            entry = SphU.entry("test");
            // 执行业务逻辑
            // ...
        } catch (BlockException e) {
            // 处理限流
            // ...
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }
}

在上述代码中,我们创建了一个FlowRule实例,将其控制行为设置为CONTROL_BEHAVIOR_WARM_UP,表示使用Sentinel的warm up模式。同时,我们还设置了warmUpPeriodSec参数,表示预热的时间为10秒。在执行业务逻辑时,我们使用SphU.entry方法来获取资源的Entry实例,并在try-catch-finally语句块中处理限流和资源释放的逻辑。

需要注意的是,使用Sentinel的warm up模式需要根据实际情况调整预热时间和限制的值,以确保系统的稳定性和性能

排队等待模式

Sentinel的排队等待模式是一种流量控制模式,它可以在流量超出阈值时,将请求放入队列中进行等待,直到系统处理完之前的请求后再进行处理。这种模式可以避免系统因瞬间流量过大而崩溃的情况。

在Sentinel中,排队等待模式需要配置一个等待队列的大小,当流量超过阈值时,请求就会被放入等待队列中。同时,还需要配置一个等待时间,如果请求在等待队列中等待的时间超过了设定的等待时间,那么请求将会被直接拒绝

下面是一个使用Sentinel的排队等待模式的代码示例:

@SentinelResource(value = "test", blockHandler = "handleBlock")
public String test() {
    // 方法实现
}
public String handleBlock(BlockException ex) {
    // 处理被拒绝的请求
    return "请求被拒绝,请稍后再试";
}

在上面的代码中,@SentinelResource注解用于标识该方法需要进行流量控制。blockHandler参数指定了当请求被拒绝时的处理方法。如果使用排队等待模式,那么可以在@SentinelResource注解中添加waitQueuemaxQueueingTimeMs参数来配置等待队列的大小和等待时间:

@SentinelResource(value = "test", blockHandler = "handleBlock", waitQueue = true, maxQueueingTimeMs = 5000)
public String test() {
    // 方法实现
}

在上面的代码中,waitQueue参数设置为true表示开启排队等待模式,maxQueueingTimeMs参数设置为5000表示等待时间为5秒。这样,当请求被拒绝时,它就会被放入等待队列中等待处理。如果等待时间超过了5秒,请求将会被直接拒绝。

热点规则

Sentinel的热点规则是一种特殊的限流规则,用于对系统中的热点资源进行限流。热点资源是指在系统中访问频率较高或者访问量较大的资源,例如某个接口、某个方法等。如果这些热点资源没有得到有效的限流控制,就容易导致系统崩溃或者性能下降

Sentinel的热点规则可以通过以下几个方面来进行限流控制:

  • 参数限流:根据指定的参数进行限流,例如根据某个接口的请求参数进行限流。
  • URL限流:根据URL进行限流,例如对某个接口的请求URL进行限流。
  • IP限流:根据IP地址进行限流,例如对某个IP地址的请求进行限流。
  • 关联流控:根据某个关联的资源进行限流,例如对某个接口的关联接口进行限流。

Sentinel的热点规则可以通过以下几个参数进行配置:

  • resource:热点资源的名称,可以是接口名称、方法名称、URL等。
  • count:限流阈值,表示在一个时间窗口内允许通过的请求次数。
  • paramIndex:参数索引,表示要进行参数限流的参数在请求中的索引位置。
  • grade:限流模式,可以是QPS模式或线程数模式。
  • durationSeconds:时间窗口大小,表示限流的时间窗口大小,单位为秒。
  • controlBehavior:流控模式,可以是快速失败模式、排队等待模式等。
  • burstCount:预热时的突发流量,表示在预热阶段允许通过的最大请求次数。

总的来说,Sentinel的热点规则可以根据业务需求进行灵活配置,有效地对系统中的热点资源进行限流控制,保证系统的稳定性和性能。

到此这篇关于Sentinel中三种流控模式的使用详解的文章就介绍到这了,更多相关Sentinel流控模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring StopWatch使用实例详解

    Spring StopWatch使用实例详解

    这篇文章主要介绍了Spring StopWatch使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java中线程用法总结

    Java中线程用法总结

    这篇文章主要介绍了Java中线程用法,实例总结了java中线程的常见使用技巧,需要的朋友可以参考下
    2015-06-06
  • java虚拟机钩子关闭函数addShutdownHook的操作

    java虚拟机钩子关闭函数addShutdownHook的操作

    这篇文章主要介绍了java虚拟机钩子关闭函数addShutdownHook的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 一篇文章带你搞定JAVA内存泄漏

    一篇文章带你搞定JAVA内存泄漏

    今天小编就为大家分享一篇关于Java内存泄漏问题处理方法经验总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-07-07
  • spring boot 利用注解实现权限验证的实现代码

    spring boot 利用注解实现权限验证的实现代码

    这篇文章主要介绍了spring boot 利用注解实现权限验证的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Spring Boot 3.3 实现职责链模式轻松应对电商订单流程分析

    Spring Boot 3.3 实现职责链模式轻松应对电商订单流程分析

    在电商系统中,订单处理流程包括库存校验、优惠券验证、运费计算等多个步骤,这些步骤具有顺序依赖性,为了管理这些业务逻辑,职责链模式提供了解决方案,通过链式关系将处理逻辑模块化,实现解耦和灵活扩展,本文将探讨如何结合SpringBoot实现职责链模式,优化电商订单处理流程
    2024-10-10
  • Java针对封装数组的简单复杂度分析方法

    Java针对封装数组的简单复杂度分析方法

    这篇文章主要介绍了Java针对封装数组的简单复杂度分析方法,简单讲述了java封装数组时间复杂度分析的原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-03-03
  • SpringBoot3中token拦截器链的设计与实现步骤

    SpringBoot3中token拦截器链的设计与实现步骤

    本文介绍了spring boot后端服务开发中有关如何设计拦截器的思路,文中通过代码示例和图文讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • java 与web服务器链接的实例

    java 与web服务器链接的实例

    这篇文章主要介绍了java 与web服务器链接的实例的相关资料,使用net.Socket类sock.getInetAddress()方法获得与Web服务器连接,需要的朋友可以参考下
    2017-07-07
  • 深入浅出讲解Spring框架中依赖注入与控制反转及应用

    深入浅出讲解Spring框架中依赖注入与控制反转及应用

    依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例
    2022-03-03

最新评论