前言
本篇文章主要介绍 Sentinel
的热点限流规则,希望观众老爷们多多支持,并在评论区批评指正!
热点规则
我们通过 Sentinel
的流控规则,可以对请求或者具体的方法进行流控。如果要对请求的的参数进行流控,那么可以使用 Sentinel
提供的热点规则。
下面进行演示:
比如某一时刻,请求携带不同参数的访问频率是不一样的:
-
http://localhost:8301/test1?a=10 请求100次 -
http://localhost:8301/test1?b=10 请求0次 -
http://localhost:8301/test1?c=10 请求3次
由于携带参数 a
的请求比较多,我们就可以对携带参数 a
的请求进行限流。
注意:对热点参数的限流,只能是 QPS
模式,且为直接的、快速失败模式。
-
首先我们需要创建一个测试请求映射:

-
先发送一次请求,然后进行对 /test1
进行热点参数限流,对 a 参数进行限流。

参数索引,表示请求参数的索引,从 0 开始。
那么我们对 a
参数进行限流并设置单击阈值为 1,统计窗口时长为 1s 。也就是 1s 内的请求不能超过一次。

-
然后进行发送携带参数 a
的请求进行测试:

我们发现热点参数限流规则并没有生效,这是为什么呢?我们必须为相应的请求方法上标注 @SentinelResource
注解才可以生效,可能是因为热点参数限流是更细粒度的限流,需要耗费更多的资源,需要标注 @SentinelResource
注解,让 Sentinel
去主动解析请求方法的参数而不是所有请求都进行解析。

然后重启我们的服务并重新进行热点限流规则的设置,然后进行测试:
「注意」:此时的热点规则应设置在 test1
上而不是 /test1
,否则不会生效。


可以发现设置热点限流之后,进行测试返回的是错误信息,抛出异常 ParamFlexException


-
测试不携带参数 a
进行请求

我们发现不携带任何参数和不携带 a
参数携带其他参数,仍然会报错,这是怎么回事呢?
原来我们在定义请求方法的时候,设置了参数的默认值,那么不管我们发送请求时,携不携带这些参数,都会有 a
这个参数,这是 SpringMVC
的机制。这也说明了 sentinel
热点限流监控的是具体的方法,而不是请求,所以需要标注 @SentinelResource
注解。

那么我们将 a b c
请求参数,设置为非必须,再进行测试:(注意对 test1
重新设置限流规则)

我们发现只要携带了参数 a
就会启用我们的限流规则,而无关参数的顺序,这也证明了 sentinel
热点参数限流针对的是标注 @SentinelResource
注解的方法。
我们注意到在我们设置好热点限流规则后,点击编辑该热点规则的时候,会出现高级选项,这提供了一种扩展,我们可以对参数的指定值单独设定阈值进行限流,而不是对参数的任何值都进行限流,提供精准打击。
比如我们现在不仅希望对参数a
限流,而且还希望当参数a
的值为10
时,QPS
达到5
再进行限流,那么就可以设定参数例外项:

点击添加后,这里我们使用 apifox
进行测试,因为连续 5
次点击出现异常难以捕捉。

我们可以发现在连续请求 6
次时,第 6
次请求进行了限流
原文始发于微信公众号(yanghi):SpringCloud Alibaba微服务之Sentinel热点限流规则的使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/226537.html