?? 基于 Lua 腳本簡單限流插件

簡介
為防止濫用,你應(yīng)該考慮對您的 API 限流。 例如,您可以限制每個用戶 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時間內(nèi)接收了一個用戶大量的請求,將返回響應(yīng)狀態(tài)代碼
429
(這意味著過多的請求)。
安裝
composer require tinywan/limit-traffic
使用
應(yīng)用中間件
在
config/middleware.php
中添加全局中間件如下:
return [
// 全局中間件
'' => [
// ... 這里省略其它中間件
Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
],
// api應(yīng)用中間件
'api' => [
Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
]
];
路由中間件
注意:需要
workerman/webman-framework
版本>= 1.0.12
我們可以給某個一個或某一組路由設(shè)置中間件。例如在 config/route.php
中添加如下配置:
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]);
?? 返回允許的請求的最大數(shù)目及時間
返回允許的請求的最大數(shù)目及時間,例如:
[100, 600]
表示在600
秒內(nèi)最多100
次的 API 調(diào)
Tinywan\LimitTraffic\RateLimiter::getRateLimit(); // 返回 [100, 600]
修改默認(rèn)請求配置
config/plugin/tinywan/limit-traffic/app.php
?? 請求限制參考
當(dāng)速率限制被激活,默認(rèn)情況下每個響應(yīng)將包含以下 HTTP 頭發(fā)送目前的速率限制信息
響應(yīng)HTTP狀態(tài)碼
- Http Status
429
響應(yīng)
header
返回內(nèi)容
X-Rate-Limit-Limit
同一個時間段所允許的請求的最大數(shù)目X-Rate-Limit-Remaining
在當(dāng)前時間段內(nèi)剩余的請求的數(shù)量X-Rate-Limit-Reset
為了得到最大請求數(shù)所等待的秒數(shù)
自定義自己的 Response
使用場景
- 每個項目有標(biāo)準(zhǔn)的統(tǒng)一輸出,自定義返回內(nèi)容
- 前后端分離:前端要求返回的
HTTP狀態(tài)碼
并不是429
,而是200
或者其他- 響應(yīng)的
body
不是{"code":0,"msg":"Too Many Requests"}
,而是{"error_code":200,"message":"Too Many Requests"}
等其他內(nèi)容
自定義HTTP狀態(tài)碼
編輯 config/plugin/tinywan/limit-traffic/app.php
文件的 status
HTTP 狀態(tài)碼(默認(rèn)值是 429
)
自定義body
返回內(nèi)容
編輯 config/plugin/tinywan/limit-traffic/app.php
文件的 body
的字段
默認(rèn)選項是
{
"code": 0,
"msg": "Too Many Requests",
"data": null
}
自定義選項參考一
1、假設(shè)status
HTTP 狀態(tài)碼設(shè)置為 200
2、假設(shè)body
的數(shù)組設(shè)為為
'body' => [
'error_code' => 200,
'message' => '請求太多請稍后重試'
]
則響應(yīng)內(nèi)容為
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code": 200,
"message": "請求太多請稍后重試"
}
其他的可以根據(jù)自身業(yè)務(wù)自定義即可