You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中RateLimiter与ThrottleRequests的区别及适用场景

Laravel REST API 限流方案解析

RateLimiter与ThrottleRequests的区别及适用场景

  • ThrottleRequests:是Laravel封装的限流中间件,属于限流功能的上层应用层,直接作用于路由或路由组。它基于RateLimiter实现核心计数逻辑,提供开箱即用的路由限流能力,适合快速给整组/单个路由添加基础限流规则,无需手动操作底层类。
  • RateLimiter:是限流功能的核心底层类,负责处理请求计数、规则判断等核心逻辑。适合需要自定义复杂限流逻辑的场景——比如基于用户角色动态调整限流阈值、根据请求参数(如设备ID)区分限流维度,或者在控制器/业务代码中手动触发限流判断。

针对URL前缀限流的选型

针对你当前基于URL前缀设置差异化限流的需求,优先选择ThrottleRequests中间件结合configureRateLimiting方法。这种方式既能批量给同前缀路由组设置统一规则,又能方便后续新增其他路径的限流规则,规则集中管理,维护成本低。

configureRateLimiting方法详解

这个方法是Laravel 8及以上版本新增的限流规则集中配置入口,默认在app/Providers/RouteServiceProvider类中(若项目中没有可手动添加),用于定义全局限流规则的"别名",后续路由可直接引用别名应用规则,无需重复编写限流逻辑。

配置示例

在RouteServiceProvider中实现该方法:

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

protected function configureRateLimiting()
{
    // tps前缀接口规则:1分钟10次,按IP区分请求
    RateLimiter::for('tps', function (Request $request) {
        return Limit::perMinute(10)->by($request->ip());
    });

    // 后续新增user前缀接口规则:1分钟30次,登录用户按ID区分,未登录按IP区分
    RateLimiter::for('user-api', function (Request $request) {
        return Limit::perMinute(30)->by($request->user()?->id ?: $request->ip());
    });
}

路由中应用规则

给对应前缀的路由组绑定限流中间件:

// tps前缀路由组应用tps规则
Route::prefix('tps')->middleware(['throttle:tps'])->group(function () {
    Route::get('xxx', [TpsController::class, 'xxx']);
    // 其他tps前缀接口
});

// user前缀路由组应用user-api规则
Route::prefix('user')->middleware(['throttle:user-api'])->group(function () {
    Route::get('profile', [UserController::class, 'profile']);
    // 其他用户相关接口
});

核心优势

  • 规则集中管理:所有限流规则都在configureRateLimiting中定义,后续修改阈值、维度只需调整此处,无需修改路由。
  • 扩展性强:新增路径规则只需添加新的RateLimiter::for定义,路由组绑定对应别名即可,完全满足后续差异化限流需求。

内容的提问来源于stack exchange,提问作者Qiulang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:35:13