# 实例化 ratelimit 对象 # 第一个参数是 redis 的 key 前缀 # 第二个参数是的限流配置 # 第三个参数是突发流量的最大值 # 第四个参数是恢复正常状态的时间,这里我理解的应该是被限流后,多久后恢复正常 local lim, err = ratelimit.new("hongfs", "800r/s", 200, 0) if not lim then ngx.log(ngx.ERR, "failed to instantiate a resty.redis.ratelimit object: ", err) return ngx.exit(500) end
# redis 的配置 local red = { host = "10.0.16.15", port = 6379, timeout = 1 }
# 获取客户端 ip 作为 key local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, red) if not delay then if err == "rejected" then return ngx.exit(503) end ngx.log(ngx.ERR, "failed to limit req: ", err) return ngx.exit(500) end
# 如果 delay 大于 0,说明被限流了,需要延迟 delay 秒后再处理 if delay >= 0.001 then local excess = err