开启配置
-
打开rate_limter开关,并配置redis地址
这里使用单机redis模式即可 -
配置rate_limiter插件的选择器和路由
这里我们只针对一个具体的url进行限流,其中令牌桶的容量设置成100,速率设置成1
测试
测试前,启动soul-examples-http,我们针对该客户端进行测试,使用工具为jmeter
- 先进行单个请求的发送,观察redis的变化
可以看到rate_limiter插件会往redis中存入两个key,一个是时间戳,一个是令牌桶的总容量,由于访问了一个,所以目前是99,如果当前没有访问请求,过一段时间后,这两个key会自动过期删除, - 使用jmeter进行压测,选取1s中并发执行100次,这是观察jmeter的结果
可以发现此时没有报异常,redis中令牌桶的值为1(在1s内又补充了1个令牌):
基本上将令牌桶使用完毕
我们将jmeter设置1s中并发执行101次,将生成的那1个token也消耗掉,那么此时压测结果应该不报错,并且redis中的令牌桶数量应该为0,测试结果如下:
与猜想的结果一致
我们再次将jmeter设置1s中并发执行102次,那么根据之前的推断,此时jmeter压测结果应该有一次报错,redis中额令牌数量应该为0,测试结果如下:
后端的输出日志如下:
与猜想的结果一致,由此可知限流插件起了作用
总结
本小节简单对rate_limiter插件进行简单了配置与压测,配置中的两个重要参数容量和填充速率, 容量用来应对突发的大量请求,填充速率用来限制并发请求数,下一小节将会具体看看rate_limiter插件的具体算法