必须用jmeter发起真实并发请求验证限流是否生效,仅单元测试或单次请求无法确认;需配置redis驱动、绕过认证、设置10线程1秒内并发,前5次应返回200,后5次触发429并含x-ratelimit-limit:5与x-ratelimit-remaining:0响应头。

要验证Laravel中rate limiting(如throttle中间件)是否按预期生效,必须用JMeter发起真实并发请求并观察HTTP状态码与响应头变化,不能仅靠单元测试或单次请求判断限流阈值是否触发。
准备被测接口与限流配置
在routes/web.php中定义一个带限流的测试路由:Route::get('/api/test-rate', function () { return response('ok', 200); })->middleware('throttle:5,1'); 表示每分钟最多5次请求。
确保该路由未被其他中间件拦截(如auth、cors),否则限流逻辑可能被跳过。若使用Laravel Sanctum或Passport,请先绕过认证——在app/Http/Kernel.php中临时注释掉api中间件组里的auth:sanctum,否则JMeter无法携带有效token,所有请求都会返回401而非429。
【关键前提】 必须将APP_DEBUG=false且启用redis驱动:在.env中设SESSION_DRIVER=redis和CACHE_DRIVER=redis,并确认Redis服务已启动且可连通;否则throttle默认使用file驱动,高并发下文件锁会导致限流失效或误判。
JMeter脚本构建:模拟精准并发
第一步:打开JMeter → 右键“测试计划” → 添加 → 线程(用户)→ 线程组。
第二步:设置线程数=10,Ramp-Up Period=1秒,循环次数=1。这样可在1秒内发起10个请求,超过每分钟5次的限制,必然触发限流。
第三步:右键线程组 → 添加 → 取样器 → HTTP请求,填写Server Name or IP为localhost,Path为/api/test-rate,Method选GET。
第四步:右键HTTP请求 → 添加 → 断言 → 响应断言。在“响应字段”选“响应代码”,“模式匹配规则”选“Equals”,填入429。这一步确保脚本能自动识别限流响应,避免人工翻看结果树。
注意:不要勾选“忽略状态码”,否则即使返回429也会被当作成功请求计入吞吐量统计。
执行与结果验证
点击绿色三角形启动测试,等待执行完成。
右键线程组 → 添加 → 监听器 → 聚合报告,查看“Error %”列——应显示约50%失败率(10个请求中前5个返回200,后5个因超限返回429)。
右键线程组 → 添加 → 监听器 → 查看结果树,展开任意一个失败请求,检查Response Headers中是否存在X-RateLimit-Limit: 5和X-RateLimit-Remaining: 0字段。这两个头由Laravel自动注入,是限流生效的直接证据。
若未看到429响应或缺失RateLimit头,说明Redis未生效或中间件未加载——此时应回到app/Http/Kernel.php检查throttle是否在$middlewareGroups['api']中正确注册,且该路由确实命中api中间件组。











