Laravel 开发的 API 项目如何做限流?

请尝试在评论区里写下答案(如不能清楚表述,那么你可能没真正理解)。欢迎参与,为下一次求职做准备。

需求如下:

全局设置,针对所有 api/* 的请求,如果用户是

  • 登录情况下,每分钟最多 60 个请求;
  • 未登录情况下,针对每个 IP 最多 30 个请求。
摈弃世俗浮躁,追求技术精湛
Summer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
  1. RouteServiceProvider中定义限流器:
    RateLimiter::for('api', function (Request $request) {
     return $request->user() ? Limit::perMinute(60) : Limit::perMinute(30)->by($request->ip());
    });
  2. 在前缀为api的路由组中使用throttle中间件(api 路由组默认):
    Route::prefix('api')->middleware(['throttle:api'])->group(function () {
     //
    });
2年前 评论
  1. RouteServiceProvider中定义限流器:
    RateLimiter::for('api', function (Request $request) {
     return $request->user() ? Limit::perMinute(60) : Limit::perMinute(30)->by($request->ip());
    });
  2. 在前缀为api的路由组中使用throttle中间件(api 路由组默认):
    Route::prefix('api')->middleware(['throttle:api'])->group(function () {
     //
    });
2年前 评论

:joy:IP限流不能满足业务需求,我们业务改成了针对API URI来限流,修改ThrottleRequests

if ($user = $request->user()) {
            if($route = $request->route()){
                return sha1($route->uri().'-'.$user->getAuthIdentifier());
            }
            return sha1($user->getAuthIdentifier());
        } else {
            if($route = $request->route()){
                return sha1($route->uri().'-'.$request->ip());
            }
            return sha1($request->ip());
        }
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!