OpenResty 实现限流

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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")
            }
          
            
        }

 

posted @   锐洋智能  阅读(675)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
· Windows 提权-UAC 绕过
点击右上角即可分享
微信分享提示