持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
前言
本篇文章主要介绍 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
次请求进行了限流