SpringCloud Alibaba微服务之Sentinel热点限流规则的使用

81 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

前言

本篇文章主要介绍 Sentinel 的热点限流规则,希望观众老爷们多多支持,并在评论区批评指正!

热点规则

我们通过 Sentinel 的流控规则,可以对请求或者具体的方法进行流控。如果要对请求的的参数进行流控,那么可以使用 Sentinel 提供的热点规则。

下面进行演示:


比如某一时刻,请求携带不同参数的访问频率是不一样的:

由于携带参数 a 的请求比较多,我们就可以对携带参数 a 的请求进行限流。

注意:对热点参数的限流,只能是 QPS 模式,且为直接的、快速失败模式。

  1. 首先我们需要创建一个测试请求映射:

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

参数索引,表示请求参数的索引,从 0 开始。

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

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

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

然后重启我们的服务并重新进行热点限流规则的设置,然后进行测试:

注意:此时的热点规则应设置在 test1 上而不是 /test1 ,否则不会生效。

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

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

我们发现不携带任何参数和不携带 a 参数携带其他参数,仍然会报错,这是怎么回事呢?

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

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

我们发现只要携带了参数 a 就会启用我们的限流规则,而无关参数的顺序,这也证明了 sentinel 热点参数限流针对的是标注 @SentinelResource 注解的方法。

我们注意到在我们设置好热点限流规则后,点击编辑该热点规则的时候,会出现高级选项,这提供了一种扩展,我们可以对参数的指定值单独设定阈值进行限流,而不是对参数的任何值都进行限流,提供精准打击。

比如我们现在不仅希望对参数a限流,而且还希望当参数a的值为10时,QPS达到5再进行限流,那么就可以设定参数例外项:

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

我们可以发现在连续请求 6 次时,第 6 次请求进行了限流