当前位置: 首页 > 软件库 > 管理和监控 > 性能优化 >

lua-limit

OpenRestry Lua 流控工具
授权协议 MIT
开发语言 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;
            }
        }
    }
  • Redis提供了Lua脚本功能来让用户实现自己的原子命令,但也存在着风险,编写不当的脚本可能阻塞线程导致整个Redis服务不可用。 本文将介绍Redis中Lua脚本的基本用法,以及脚本超时导致的问题和处理方式。 EVAL命令简介 eval格式 Redis 提供了命令EVAL来执行Lua脚本,格式如下 EVAL script numkeys key [key …] arg [arg …] 其中 s

  • openresty lua-resty-mysql使用            官网:https://github.com/openresty/lua-resty-mysql                                                                                   lua-resty-mysql 说明             

  • git 地址:https://github.com/pintsized/lua-resty-http 有个项目,需要用到openresty做代理。代码如下: local reader = res_c.body_reader repeat local chunk, err = reader(65536) --1m if err then ngx.log(ngx.ERR

  • 转载 :https://www.jianshu.com/p/687e63118d84 限制接口总并发数 场景: 1 按照 ip 限制其并发连接数 lua_shared_dict my_limit_conn_store 100m; ... location /hello { access_by_lua_block { local limit_conn = require "r

  • Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本,如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢? eval 'while(true) do end' 0 为了防止某个脚本执行时间过长导致Redis 无法提供服务, Redis 提供了lua-time-limit 参数限制脚本的最长运行时间,默认为5 秒钟。 lua-time-limit 500

  • 前言 虽然nginx中自带了限流的模块,只能直接限定超出的数量,但对于允许范围内的流量如何进行限流是个问题。nginx的限流方式! limit_conn perserver 100; limit_conn perip 15; limit_rate 512k; 但是比如这100的允许的值,0-30个请求去mysql读数据,31-70去redis读数据,71-100去文件直接读数据,nginx不

 相关资料
  • 主要内容:实例Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。 以下是典型的流程控制流程图: 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。 要注意的是Lua中 0 为 true: 实例 --[ 0 为 true ] if ( 0 ) then     print

  • Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。 以下是典型的流程控制流程图: 控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。 要注意的是Lua中 0 为 true: --[ 0 为 true ] if(0) then print("0 为

  • 本文向大家介绍Lua中的变量和流控制入门学习,包括了Lua中的变量和流控制入门学习的使用技巧和注意事项,需要的朋友参考一下  通常,范围表达式为begin, end[, step].

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 9个月前关闭。 改善这个问题 我需要一个用于在Java中生成控制流的工具,而不是可视化绘制的工具,我可以使用它来处理类似路径条件之类的东西。任何人 ? 问题答案: 为了将来记录,我发现最适合我的需求的是Soot。 http://www.sable.mcgi

  • 节奏工作流版本控制: 工作流执行具有以下代码: 工作流1: o/p的开始--版本1:1 工作流实施中的更改: 工作流2: o/p的开始--版本1:2 工作流实施中的更改: 工作流3: o/p的开始--版本1:3 工作流2的重放:o/p版本1: -1 工作流重播 1 : o/p --version1: -1 我期待低于o / p 重播工作流程2: o/p--版本1:2 工作流重播 1 : o/p -

  • 这是一个具备完整结构的标准流程工作台,如果你希望隐藏一些功能模板,可以进行如下操作,Excel服务器系统管理—〉其它设置,如图所示: E立方管理软件Excel服务器在你不需要显示的模块前面打勾选择即可,另外对于管理员来说他们总是可以看见一个完整的流程工作台。      如果你不想改变整个流程工作台的结构,而只是不想在“已处理-未完成”显示某个工作流模板的未完成工作流,那么只需要在该模板的流程图属性

  • 我有一个关于kafka流应用程序中的控制流的基本问题。如果有两个源主题 我做了一个非常初步的测试,当记录被消费时,我偷看了一下,然后用一个简单的速溶软件打印了它们被处理的瞬间。现在 这些是主题中记录的开始和结束时间戳 主题B记录在主题A之前提取。Sysout显示主题B中的所有记录。有人能帮助理解这一点吗?我希望在编写具有多个输入源的流式应用程序时使用这种理解。 提前感谢

  • 截止到现在,在我们所看过的程序中,总是有一系列语句从上到下精确排列,并交由 Python 忠实地执行。如果你想改变这一工作流程,应该怎么做?就像这样的情况:你需要程序作出一些决定,并依据不同的情况去完成不同的事情,例如依据每天时间的不同打印出 ‘早上好’ ‘Good Morning’ 或 ‘晚上好’ ‘Good Evening’? 正如你可能已经猜测到的那番,这是通过控制流语句来实现的。在 Pyt