lua-limitOpenRestry Lua 流控工具
lua-limit 是一个 OpenRestry Lua 限流工具,支持令牌桶限流、cookie 限流、日期范围限流、概率限流。
1. 思路
限流脚本的设计思路源于规则链,用户请求进入 nginx 后,请求会进入限流脚本配置的限流链,在链中的规则中逐个匹配处理,如果某条限流规则匹配此请求,那么将跳出规则链执行循环,返回被限流信息,除非此规则明确说明需要参考链中下一条规则。
2. 流控工具使用
需要编写限流脚本,脚本可以参考如下(some_business_limit.lua):
local conf = {
redis = {...}
some_limit_rule_1 = {...}
some_limit_rule_2 = {...}
}
-- 如果不传 conf 那么会在 package.path 中寻找
-- limit_conf.lua 文件
local limit = require "limit":new(conf)
funciton some_who_1(limit)
return true, "some_limit_rule_1"
end
function some_who_2(limit)
local redis = limit:get_redis()
-- some_redis_operation
-- target find
if is_target then
return true, "some_limit_rule_2"
else
return false
end
end
function some_message(limit, data)
-- 返回页面
limit.send_redirect("limit.html")
-- 返回json
limit.send_redirect("xxx.html", data)
end
limit:who({some_who_1, some_who_2}):execute()
在 nginx 的 http 块中配置 package.path 是的 lua 解释器可以找到脚本文件,在需要限流的 location 部分增加 access_by_lua_file指定 lua 脚本(当然也可以使用content_by_lua),如:
http {
lua_package_path "/some_place/limit/limit-common/?.lua;;";
server {
location /some_url {
access_by_lua_file /some_place/some_business_limit.lua;
}
}
} 评论
