Laravel 节流阀、RateLimiter 与 ThrottleRequests,何时使用哪个?

问题描述 投票:0回答:2

我需要限制我的 REST API 的速率。目前我只需要基于 URL 前缀的速率限制,例如带有 tps/xxx 的 url 需要 1 分钟内 10 次的速率限制。稍后我可能需要添加更多规则。

我看到laravel文档解释

RateLimiter
但我也看到它提及
ThrottleRequests
中间件。进一步检查源代码后,我看到ThrottleRequests构造函数注入RateLimiter

    /**
     * Create a new request throttler.
     *
     * @param  \Illuminate\Cache\RateLimiter  $limiter
     * @return void
     */
    public function __construct(RateLimiter $limiter)
    {
        $this->limiter = $limiter;
    }

但是我仍然不清楚这两个类的用例以及何时使用哪个?

对于我基于 url 前缀的用例,我应该使用哪一个?

laravel dependency-injection throttling
2个回答
0
投票

使用 Laravel 时,了解throttle、

RateLimiter
ThrottleRequests
之间的区别对于应用程序中有效的速率限制至关重要。

油门

节流中间件是一种通用中间件,可用于节流应用程序的各个方面。 它允许您设置在给定时间段内可以发出的最大请求数。 您可以在路由或控制器中使用它来限制用户访问某些资源的速率。

Route::middleware('throttle:60,1')->group(function () {
    // Your routes
});

在此示例中,每分钟允许 60 个请求。

速率限制器

速率限制对于保护应用程序或网站资源免遭过度或不当使用至关重要。无论是恶意人为干预、基于机器人的攻击还是被忽视的漏洞,资源滥用都会干扰对应用程序的合法访问并引入严重的漏洞。 Laravel 的

RateLimiter
是一个更底层的工具,允许您以编程方式管理速率限制。 它提供了一组管理和检查速率限制的方法。 示例:

$key = 'user:' . $user->id;
$limiter = app(RateLimiter::class);

if ($limiter->tooManyAttempts($key, $maxAttempts, $decayMinutes)) {
    // Handle rate limit exceeded
} else {
    $limiter->hit($key, $decayMinutes);
    // Continue with the action
}

这使您可以对速率限制逻辑进行细粒度控制。 节流请求: ThrottleRequests 是一种特征,您可以在控制器中使用它来对特定控制器操作应用速率限制。 它提供了一种简单的方法来对控制器中的特定方法应用速率限制。

当您只想对特定操作应用速率限制时,这非常有用。

当您想要一种快速、简单的方法来对路由应用速率限制时,请使用节流中间件。 当您需要对速率限制进行更多控制并希望以编程方式进行管理时,请使用

RateLimiter
。 当您想要专门对控制器中的某些方法应用速率限制时,请使用
ThrottleRequests


0
投票

速率限制器:

RateLimiter 用于需要自定义逻辑来计算限制和处理响应的复杂场景。例如,如果您需要限制新用户每天 10 个请求,而普通用户每天 50 个请求。您甚至可以根据可疑活动进行限制,例如短时间内下载过多。您可以使用复杂的自定义规则完成所有操作,也可以使用 RateLimiter 创建自己的自定义逻辑。它很灵活,但需要时间和精力。

节流请求:

Throttle 更易于与预构建的中间件和路由注释一起使用,用于常见的速率限制场景。对于 url 限制,您应该使用throttle。它快速简单地处理基本的网站流量。

// Define routes with the specific prefix
Route::prefix('tps')
->group(function () {
    Route::get('/xxx', function () {
        // ...
    })->middleware('throttle:10,1'); // 10 requests per minute for routes under /tps/xxx
    // Other routes within the prefix
});
© www.soinside.com 2019 - 2024. All rights reserved.