SpringCloud Alibaba 入坑(五)Sentinel高级流控规则

920 阅读5分钟

目录


前言

上一篇 SpringCloud Alibaba 入坑(四)Sentinel基本流控规则

上篇文章介绍了Sentinel的基本流控规则,本章我们将学习流控的更多高级玩法。


流控模式

打开流控的高级选项,可以看到流控模式和流控效果两个选项。

直接

默认的流控模式是直接,流控效果是快速失败。如果看过上篇文章就比较好理解,直接就是直接访问上面的资源,快速失败就是效果是访问失败直接出现限流的文字。
在这里插入图片描述

关联

我们再看看关联是什么,微服务的系统资源一般都有关联关系,比如:
订单接口会调用支付接口,如果支付接口出现流量激增的情况,会导致调用订单接口出现问题,这时我们除了直接对支付接口限流外,也可以对订单接口限流。
在这里插入图片描述
为验证效果,我们编写控制器

@RestController
public class OrderController {

    @GetMapping("/order")
    public String order(){
        return "这是订单接口!";
    }

    @GetMapping("/payment")
    public String payment(){
        return "这是支付接口!";
    }
}

先访问一下/order接口,然后给它添加流控规则,流控模式选择关联,关联资源设置为/payment,也就是:payment接口每秒访问超过1次后,将对order接口进行限流。
在这里插入图片描述
测试还是使用JMeter,配置线程组、HTTP请求。
在这里插入图片描述
这是http配置的是访问payment接口
在这里插入图片描述
启动测试前,order接口访问是正常的。
在这里插入图片描述
启动测试后,order接口被限流了。
在这里插入图片描述
总结一下,关联就是:关联资源超过了阈值,限流当前的资源。

链路

链路是资源的调用可能出现上下级的层次结构,如下图:
在这里插入图片描述
A是根节点,以A为入口,可以访问B和C,B和C又可以访问D和E,那么我们如果对A进行限流,就可以对A下面的所有资源进行限流了。

做下测试:查看簇点链路,选择树状视图,就可以看到上下级的关系了。
在这里插入图片描述
在这里插入图片描述
我们看到上层的资源是/order,下层资源也是/order,给下面的/order添加流控
在这里插入图片描述
测试/order,会出现限流
在这里插入图片描述

流控效果

上面我们了解了流控的几种模式,下面我们在来了解下流控效果:

快速失败

快速失败是默认效果,既当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。

Warm Up

即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
比如:在春节抢热点地区火车票的时候,如果直接把流量放进来,可能会一下直接把12306的服务器打死,那么我们可以设定一个预热时间,给服务器一个缓冲期,慢慢的把流量放进来,直到达到最大的阈值。

修改一下前面的流控规则,这里阈值是10,预热时间是5秒,前面讲过流量是逐步加到阈值上限的,那么就有一个初始的阈值: 初始阈值 = 阈值上限 / coldFactor, coldFactor 是冷加载因子,默认为3,则初始阈值为 10 / 3 = 3
下面配置的效果就是:一开始限流的阈值是3,然后5秒后上升到10.
在这里插入图片描述
测试时,快速点击(1秒3次以上),就会出现限流
在这里插入图片描述
等5秒后,再快速点击,都没有限流,因为阈值上升到10了
在这里插入图片描述

排队等待

排队等待方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。也比较好理解,就是不管流量再多,进来访问资源时都必须排队,一个个的访问。
这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

为方便查看效果,给接口加上日志

@Slf4j
@RestController
public class OrderController {

    @GetMapping("/order")
    public String order(){
        log.info("Thread:{},time:{}",Thread.currentThread().getName(),System.currentTimeMillis());
        return "这是订单接口!";
    }

    @GetMapping("/payment")
    public String payment(){
        return "这是支付接口!";
    }
}

修改下流控
在这里插入图片描述
快速访问/order,发现日志输出的时间间隔都是控制在1秒,也就是排队等待设置的超时时间
在这里插入图片描述

总结

本文介绍了Sentinel的流控模式和流控效果,掌握好它们,能让我们根据不同的业务场景给资源选择最优的流控配置,Sentinel的内容比较多,除了流控外,还有熔断、降级、@SentinelResource注解的使用等知识点,这些都会在后面的文章中介绍。谢谢大家的阅读,如果觉得有用的话,左下角点个赞:)