• OpenResty 实现限流


    OpenResty 官方提供了封装好的 lua函数,方便我们开箱即用。支持一下几个场景:

    • 根据ip限制并发连接数
    • 限制时间窗口的请求数,如:限制 ip 每分钟只能调用 100 次 /order 接口,(允许在时间段开始的时候一次性放过100个请求)
    • 平滑限制接口请求数,如:限制 ip 每分钟只能调用 120 次 /order 接口(平滑处理请求,即每秒放过2个请求)
    • 漏桶算法限流,如:限制 ip 每分钟只能调用 120 次 /order 接口(平滑处理请求,即每秒放过2个请求),超过的部分进入桶中等待,(桶容量为60),如果桶也满了,则进行限流

    流控设置规则,每分钟限制访问3次 Lua脚本

    server {
            listen       80;
            server_name  localhost;
            charset utf-8;
            #access_log  logs/host.access.log  main;
     
            # 限流示例
            location /order/limit {
    
                default_type 'text/html';
                access_by_lua_block {
    
                    -- 导入模块
                    local limit_count = require "resty.limit.count"
             
                    -- 限流规则: 每分钟3次
                    local lim, err = limit_count.new("my_limit_count_store", 3, 60)
                    if not lim then
                        ngx.log(ngx.ERR, "failed to instantiate a resty.limit.count object: ", err)
                        return ngx.exit(500)
                    end
             
                    local key = ngx.var.binary_remote_addr
                    local delay, err = lim:incoming(key, true)
                    -- 如果请求数在限制范围内,则当前请求被处理的延迟(这种场景下始终为0,因为要么被处理要么被拒绝)和将被处理的请求的剩余数
                     ngx.log(ngx.ERR,"delay: ",delay," err: ",err)
                    if not delay then
                        if err == "rejected" then
                            ngx.say("访问太频繁了..","delay: ",delay," , err: ",err)
                            -- return ngx.exit(503)
                        end
             
                        ngx.log(ngx.ERR, "被限流啦...... ", err)
                        return ngx.exit(500)
                    end
    
                    ngx.say("success")
                }
             
               
            }
    
  • 相关阅读:
    第四次作业
    软工第三次作业
    第三次作业
    第二次作业
    团队第三次作业:Alpha版本发布
    软件工程团队作业--Alpha版本第二周小结
    软件工程团队作业--Alpha版本第一周小结
    团队第二次作业
    C++多态性总结
    第四次作业:结对编程
  • 原文地址:https://www.cnblogs.com/interdrp/p/15853148.html
Copyright © 2020-2023  润新知