首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Webman实战教程:基于 Lua 脚本简单限流插件

Webman实战教程:基于 Lua 脚本简单限流插件

作者头像
Tinywan
发布2023-10-31 15:55:31
发布2023-10-31 15:55:31
47600
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

简介

为防止滥用,你应该考虑对您的 API 限流。例如,您可以限制每个用户 10 分钟内最多调用 API 100 次。如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码 429 (这意味着过多的请求)。

安装

代码语言:javascript
代码运行次数:0
运行
复制
composer require tinywan/limit-traffic

使用

应用中间件

config/middleware.php 中添加全局中间件如下:

代码语言:javascript
代码运行次数:0
运行
复制
return [
    // 全局中间件
    '' => [
        // ... 这里省略其它中间件
        Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
    ],
    // api应用中间件
    'api' => [
        Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
    ]
];

路由中间件

注意:需要 workerman/webman-framework 版本 >= 1.0.12

我们可以给某个一个或某一组路由设置中间件。例如在 config/route.php 中添加如下配置:

代码语言:javascript
代码运行次数:0
运行
复制
Route::any('/admin', [app\admin\controller\Index::class, 'index'])
->middleware([Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class]);

// 分组路由
Route::group('/blog', function () {
   Route::any('/create', function () {return response('create');});
})->middleware([Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class]);

🔏 返回允许的请求的最大数目及时间

返回允许的请求的最大数目及时间,例如:[100, 600] 表示在 600 秒内最多 100 次的 API 调

代码语言:javascript
代码运行次数:0
运行
复制
Tinywan\LimitTraffic\RateLimiter::getRateLimit(); // 返回 [100, 600]

修改默认请求配置 config/plugin/tinywan/limit-traffic/app.php

🔰 请求限制参考

当速率限制被激活,默认情况下每个响应将包含以下 HTTP 头发送目前的速率限制信息

响应HTTP状态码

  • Http Status 429

响应header返回内容

  • X-Rate-Limit-Limit 同一个时间段所允许的请求的最大数目
  • X-Rate-Limit-Remaining 在当前时间段内剩余的请求的数量
  • X-Rate-Limit-Reset 为了得到最大请求数所等待的秒数

自定义自己的 Response

使用场景

  • 每个项目有标准的统一输出,自定义返回内容
  • 前后端分离:前端要求返回的 HTTP状态码并不是 429,而是 200 或者其他
  • 响应的body不是 {"code":0,"msg":"Too Many Requests"},而是 {"error_code":200,"message":"Too Many Requests"}等其他内容

自定义HTTP状态码

编辑 config/plugin/tinywan/limit-traffic/app.php 文件的 status HTTP 状态码(默认值是 429

自定义body返回内容

编辑 config/plugin/tinywan/limit-traffic/app.php 文件的 body 的字段

默认选项是

代码语言:javascript
代码运行次数:0
运行
复制
{
 "code": 0,
 "msg": "Too Many Requests",
 "data": null
}

自定义选项参考一

1、假设status HTTP 状态码设置为 200

2、假设body的数组设为为

代码语言:javascript
代码运行次数:0
运行
复制
'body' => [
 'error_code' => 200,
 'message' => '请求太多请稍后重试'
]

则响应内容为

代码语言:javascript
代码运行次数:0
运行
复制
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8

{
 "error_code": 200,
 "message": "请求太多请稍后重试"
}

其他的可以根据自身业务自定义即可

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 安装
  • 使用
    • 应用中间件
    • 路由中间件
    • 🔏 返回允许的请求的最大数目及时间
    • 🔰 请求限制参考
  • 自定义自己的 Response
  • 自定义HTTP状态码
    • 自定义body返回内容
    • 自定义选项参考一
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档