在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:lua-limit开源软件地址:https://gitee.com/mahaixing/lua-limit开源软件介绍:Lua 流控工具说明如发现缺陷,或者有改进意见请联系我,[email protected] 文件说明
1. 思路限流脚本的设计思路源于规则链,用户请求进入 nginx 后,请求会进入限流脚本配置的限流链,在链中的规则中逐个匹配处理,如果某条限流规则匹配此请求,那么将跳出规则链执行循环,返回被限流信息,除非此规则明确说明需要参考链中下一条规则。 2. 流控工具使用需要编写限流脚本,脚本可以参考如下( 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 块中配置 http { lua_package_path "/some_place/limit/limit-common/?.lua;;"; server { location /some_url { access_by_lua_file /some_place/some_business_limit.lua; } } } 3.配置文件配置文件用来配置 redis 和限流规则链,参考
3.1 bucket文件
3.2 cookie文件
3.3 date_range文件
3.4 limiter文件 default_rule = { limiter = {} } 3.5 probablity文件
4. 关键函数4.1 限流目标,who 函数在 nginx 的 location 块配置中,限流是针对 URL 配置的。但是具体限流的目标由于应用的不同各不相同,需要针对参数确定限流对象,比如:
因此,在限流脚本中,需要具体业务实现 who 函数,who 函数用来确定当前请求是否是限流的目标请求。
function some_who_func(limit) 返回值最多 2 个,返回 true 时至少返回两个返回值,返回 false 时则无需返回另一个返回值,返回值说明:
who 函数可以有多个,作为 table 传给 limit ,比如: limit:who({who_func1, who_func2, who_func3}) 也可以只有一个,比如: limit:who(who_func_single) who 函数匹配到目标后,脚本会停止调用后续 who 函数。匹配到目标的 who 函数必须返回 true 以及 目标适用的限流链、适用的 message 函数、额外需要传递的数据,如果 who 函数返回 false ,那么限流脚本会调用下一个 who 函数寻找。 如果不配置 who 函数,那么 limit 会使用默认的 who 函数,返回默认的 4.2 message 函数message 函数用于在请求限流后,返回响应数据给浏览器,message 函数的原型是: function some_message(limit, data) 其中:
在 message 函数中可以根据业务需要输出 mime 头以及其他 http 控制头。 可以根据需要返回 json 数据、xml 数据或者其他形式的数据 可以仅仅跳转到指定页面。 可以针对每个限流目标,指定一个 message 函数,参考 5. 扩展如果有新的限流规则,可以扩展此脚本,在 local assert = assert local utils = require "utils" local _M = require("limiters.limiter"):new() function _M:process_config() end function _M:execute() -- 如果不需要限流当前请求 return false -- 如果限流当前请求,不需要参考下一条规则 return true, false -- 如果限流当前请求,需要参考下一条规则 return true, true end return _M |
请发表评论