openresty 之resty.limit.req模块介绍
一、openresty实现限流说明:
静态拦截和动态拦截介绍:
静态拦截就是限流某一个接口在一定时间单位的请求数。一般就是单位1s内的客户端的请求数。
例如用户可以在系统上给他们的接口配置一个每秒最大调用量,如果超过这个限制,则拒绝服务此接口。
而动态拦截其实也是基于静态拦截进行改进,我们可以依据当前系统的响应时间来动态调整限流的阈值,如果响应较快则可以把阈值调的大一些,
放过更多请求,反之则自动降低限流阈值,只使少量请求通过。
其实这就是一个很简单的限流方式。但是因为这些场景在我们开发的时候经常遇到,然而OpenResty 大概实现一些常见的限流方式。
(此处使用OpenResty1.13.6.1版本自带lua-resty-limit-traffic模块 ,实现起来更为方便)。只要是openresty版本号大于1.13.6.1的,都是默认自带lua-resty-limit-traffic模块的
如果,OpenResty版本低于1.13.6.1 ,则需要下载限流模块,下面是下载地址:
git clone https://github.com/openresty/lua-resty-limit-traffic.git
二、平滑限制请求数
2.1具体配置过程如下:
平滑限制请求数(使用漏桶的方法)
场景:
限制 ip 每分钟只能调用 120 次 /1.html 接口文件(平滑处理请求,即每秒放过2个请求)
共享内存加入到nginx的http标签:
nginx的 虚拟主机配置文件如下:
平滑限制接口请求数的lua脚本内容如下:
2.2详细说明以下lua脚本限流的实现过程:
2.2 limit.req.lua 漏桶方法具体介绍如下:
此模块提供API来帮助OpenResty / ngx_lua用户程序员使用“漏桶”方法限制请求频率,
如果要一次使用此类的多个不同实例或使用此类一个实例与其他类的实例。例如:同时和resty.limit.conn这个模块一块使用的话,必须使用
resty.limit.traffic这个模块把他们结合起来。
这个Lua模块的实现类似于NGINX的标准模块
[ngx_limit_req]( http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
但是这个Lua模块更灵活,因为它可以在几乎任意的上下文中使用。
具体测试可以把上面的请求次数调整的小点,来模拟测试