前言:

本篇博客介绍了有关于Sentinel的几种常用的流控规则。



文章目录

  • 一。概述
  • 二。QPS-直接-快速失败
  • 三。线程-直接-快速失败
  • 四。QPS-关联-快速失败
  • 五。QPS-链路-快速失败
  • 六。QPS-直接-预热
  • 七。QPS-直接-匀速排队



一。概述

流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlotClusterBuilderSlotStatisticSlot 统计出来的实时信息进行流量控制。

限流的直接表现是在执行Entry nodeA = SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowExceptionBlockException的子类,您可以捕捉 BlockException来自定义被限流之后的处理逻辑。

同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型(QPS 或并发线程数)
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

二。QPS-直接-快速失败

1.说明

当一秒内 QPS 超过某个阈值的时候,则采取措施进行流量控制。

spring sentry限流 springcloud sentinel限流_spring cloud alibaba

2.示例demo

控制器代码:

spring sentry限流 springcloud sentinel限流_流量控制_02

3.sentinel控制台操作

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_03

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_04

4.访问测试

一秒点击一次还是可以正常访问:

spring sentry限流 springcloud sentinel限流_spring sentry限流_05

若快速点击多次,超过了QPS阈值,则被限流:

spring sentry限流 springcloud sentinel限流_spring sentry限流_06

三。线程-直接-快速失败

1.说明

当一秒内 访问线程数超过某个阈值的时候,则采取措施进行流量控制。

spring sentry限流 springcloud sentinel限流_限流_07

2.示例demo

控制器代码:

spring sentry限流 springcloud sentinel限流_流量控制_08

3.sentinel控制台操作

spring sentry限流 springcloud sentinel限流_spring sentry限流_09

4.访问测试

快速点击多次依然可以访问:

spring sentry限流 springcloud sentinel限流_流量控制_10

若打开两个浏览器窗口,快速切换并快速刷新页面,超过了访问线程数阈值,则被限流:

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_11

四。QPS-关联-快速失败

1.说明:

当接口A关联了接口B时,在访问B接口超过了规定流量阈值的情况下,接口A也将会被限流

spring sentry限流 springcloud sentinel限流_sentinel_12

2.示例demo

控制器代码:

spring sentry限流 springcloud sentinel限流_sentinel_13

3.sentinel控制台操作

先给testB建立流控规则:

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_14


在建立/testA流控规则,关联/testB:

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_15

4.访问测试

使用postman建立新的访问接口集合集中访问

spring sentry限流 springcloud sentinel限流_spring sentry限流_16


spring sentry限流 springcloud sentinel限流_spring cloud alibaba_17

spring sentry限流 springcloud sentinel限流_sentinel_18


spring sentry限流 springcloud sentinel限流_限流_19


spring sentry限流 springcloud sentinel限流_spring cloud alibaba_20


spring sentry限流 springcloud sentinel限流_流量控制_21


spring sentry限流 springcloud sentinel限流_spring sentry限流_22


spring sentry限流 springcloud sentinel限流_流量控制_23

在postman访问testB接口的同时,去访问testA,发现testA被限流:

spring sentry限流 springcloud sentinel限流_限流_24

五。QPS-链路-快速失败

1.说明

当两个接口A和接口B访问同一个资源时,若对接口A进行了资源的链路控制,超过了规定的阈值后,再次访问接口A去请求资源时会出现报错

spring sentry限流 springcloud sentinel限流_限流_25

2.实例demo

控制器代码:

spring sentry限流 springcloud sentinel限流_限流_26

service:

spring sentry限流 springcloud sentinel限流_限流_27


spring sentry限流 springcloud sentinel限流_spring cloud alibaba_28

配置文件:

spring sentry限流 springcloud sentinel限流_流量控制_29

3.sentinel控制台操作

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_30

4.访问测试

多次访问/testA接口,超过阈值再次访问接口A去请求资源时会出现报错:

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_31

六。QPS-直接-预热

1.说明

warm up就是为了防止突然进入的大流量大系统冲垮,在一定时间内将访问流量慢慢增加

spring sentry限流 springcloud sentinel限流_sentinel_32


spring sentry限流 springcloud sentinel限流_sentinel_33


spring sentry限流 springcloud sentinel限流_spring sentry限流_34

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值。

2.实例demo

spring sentry限流 springcloud sentinel限流_sentinel_35

3.sentinel控制台操作

spring sentry限流 springcloud sentinel限流_spring sentry限流_36

4.访问测试

当前五秒阈值为10/3=3,快速点击时,触发限流:

spring sentry限流 springcloud sentinel限流_spring cloud alibaba_37

当五秒钟过预热后,阈值到达10,再次快速点击,访问正常:

spring sentry限流 springcloud sentinel限流_sentinel_38

七。QPS-直接-匀速排队

1.说明

排队等待,匀速通过

spring sentry限流 springcloud sentinel限流_流量控制_39


spring sentry限流 springcloud sentinel限流_流量控制_40

2.实例demo

spring sentry限流 springcloud sentinel限流_流量控制_41

3.sentinel控制台操作

spring sentry限流 springcloud sentinel限流_spring sentry限流_42

4.访问测试

再次使用postman接口集合对testB接口进行访问:

spring sentry限流 springcloud sentinel限流_sentinel_43


spring sentry限流 springcloud sentinel限流_流量控制_44


后台线程数每隔相应的延迟时间对接口进行访问,实现匀速接口限流:

spring sentry限流 springcloud sentinel限流_sentinel_45