美文网首页PHP经验分享程序员
lumen接口访问频率throttle

lumen接口访问频率throttle

作者: weylau | 来源:发表于2019-03-08 10:18 被阅读5次

    由于公司项目对外提供开放平台接口,所以为了防止第三方调用接口太频繁给服务器带来过大的压力,需要对接口调用次数限制,我使用的限制规则是每个ip每个接口一分钟之内最多访问30次,目前项目是使用的lumen框架开发的接口,这里主要说一下如何在Lumen框架中使用throttle中间件来限制客户端接口请求次数

    新建中间件

    在app\Http\Middleware中新建ThrottleRequests.php文件,文件下载地址:https://github.com/illuminate/routing/blob/master/Middleware/ThrottleRequests.php
    修改ThrottleRequests.php中的resolveRequestSignature方法用来定义我们自己的限制规则

    protected function resolveRequestSignature($request){
            return sha1(
                $request->method() .
                '|' . $request->path() .
                $request->getClientIp()
            );
    }
    

    异常处理

    在app/Exceptions中新建ThrottleException.php,当访问次数超过限制时抛出异常

    <?php
    namespace App\Exceptions;
    
    use Exception;
    
    class ThrottleException extends Exception
    {
        protected $isReport = false;
    
        public function isReport()
        {
            return $this->isReport;
        }
    }
    

    在app/Exceptions/Handler.php捕获该抛出异常,在render方法增加以下判断:

    if ($e instanceof ThrottleException) {
                return response(['code' => $e->getCode(), 'msg' => $e->getMessage()], 432);
     }
    

    修改ThrottleRequests.php文件中的buildException方法

    protected function buildException($key, $maxAttempts)
        {
            $retryAfter = $this->getTimeUntilNextRetry($key);
    
            $headers = $this->getHeaders(
                $maxAttempts,
                $this->calculateRemainingAttempts($key, $maxAttempts, $retryAfter),
                $retryAfter
            );
    
            return new ThrottleException('Too Many Attempts.', 432);
        }
    

    注册中间件

    在bootstrap/app.php中注册

    $app->routeMiddleware([
         'throttle' => App\Http\Middleware\ThrottleRequests::class,
    ]);
    

    使用

    $router->group(['middleware' => ['throttle:30']],function() use ($router){
        $router->post('test','TestController@test');
    });
    

    throttle:30 表示1分钟之内访问30次
    throttle:30,2 表示2分钟之内访问30次

    相关文章

      网友评论

        本文标题:lumen接口访问频率throttle

        本文链接:https://www.haomeiwen.com/subject/krmlpqtx.html