robwittman/leaky-bucket-rate-limiter

此包最新版本(v1.0.0)没有可用的许可证信息。

实现漏桶速率限制器的PSR-7中间件

v1.0.0 2016-10-27 14:34 UTC

This package is not auto-updated.

Last update: 2024-09-15 00:41:38 UTC


README

PSR-7 漏桶速率限制器

此中间件通过漏桶算法实现基于API的速率限制。

使用方法

要开始使用,你可以轻松地使用composer

composer require robwittman/leaky-bucket-rate-limiter

安装后,需要加载包、应用一些设置,然后开始限制。

<?php

require_once('vendor/autoload.php');

use LeakyBucketRateLimiter\RateLimiter;

$slim = \Slim\App();

$slim->add(new RateLimiter([
    'callback' => function(RequestInterface $request) {
        return [
            'token' => <token>
        ];
    },
    'throttle' => function(ResponseInterface $response) {
        return $response->withStatus(429)->withJson([
            'error' => "User request limit reached"
        ]);
    }
]))

$slim->run();

使用RateLimiter所需的唯一设置是一个回调和节流。

示例

IP地址
$slim->add(new RateLimiter([
    'callback' => function(RequestInterface $request) {
        return [
            'token' => $_SERVER['REMOTE_ADDR']
        ];
    }
]));
会话ID
$slim->add(new RateLimiter([
    'callback' => function(RequestInterface $request) {
        return [
            'token' => session_id()
        ];
    }
]));
请求属性
$slim->add(new RateLimiter([
    'callback' => function(RequestInterface $request) {
        return [
            'token' => $request->getAttribute('<token_or_uid>')
        ];
    },
]));

当桶中有可操作的令牌时,它会与Redis通信以跟踪流量。如果令牌超过其请求限制,它将触发构造函数中传递的throttle函数。

参数

回调 (必需)

当限制器需要检查键时调用回调参数。它传递请求对象,并可以返回包含(字符串)'token'键的数组,或者可以返回TRUE以跳过速率限制

$slim->add(new RateLimiter([
    'callback' => function(RequestInterface $request) {
        return [
            'token' => session_id()
        ];
    }
]))

节流 (必需)

告诉限制器如何响应节流请求

$slim->add(new RateLimiter([
    'throttle' => function(ResponseInterface $response) {
        return $response->withStatus(429)->withJson([
            'message' => "Dude, you gotta slow down"
        ]);
    };
]));

注意所有进一步设置都假设已经设置了callbackthrottle参数

容量和泄漏

容量是桶可以包含的总滴落(请求)量。泄漏是你希望从桶中移除的每秒滴落量

$slim->add(new RateLimiter([
    'capacity' => 45,
    'leak' => 1
]));

忽略的路由

你可以传递一个不希望进行速率限制的路由数组。这完全绕过速率限制中间件,因此它们也不会有相应的头信息

$slim->add(new RateLimiter([
    'ignore' => [
        'auth/token',
        'users/me',
        'other/ignored/routes'
    ]
]));

前缀 / 后缀

为桶键提供前缀/后缀。键将存储在Redis中为PREFIX.key.SUFFIX

$slim->add(new RateLimiter([
    'prefix' => 'bucket-o-leaks',
    'suffix' => "limiter"
]));

头信息

指定要提供什么头信息,其中包含速率限制信息。设置为false以禁用。

$slim->add(new RateLimiter([
    'header' => "Rate-Limiting-Meta"
]));

// Rate-Limiting-Meta: X / Y
// X = Current drips in bucket, Y = capacity

存储

默认情况下,速率限制器将尝试连接到本地Redis实例http://127.0.0.1:6379,如Predis\Client()所示。这可以通过提供Predis\Client连接的设置数组或提供具有get()和set()方法的对象来覆盖,该对象用于存储和检索数据(mysql、memcached、mongo等)。如果您使用docker-compose开发容器,只需使用redis作为主机名,容器链接将连接它。

$slim->add(new RateLimiter([
    // Rate limiter settings
], [
    'scheme' => 'tcp://',
    'host' => 'redis',
    'port' => 6379
]))

// OR

class ObjectWithGetAndSetMethods {
    public function get($key) {
        return $this->{$key};
    }
    public function set($key, $value) {
        $this->{$key} = $value;
    }
}
$storage = new ObjectWithGetAndSetMethods();
$slim->add(new RateLimiter([
    // Rate limiter settings
], $storage));

开发和测试

此库包含一个用于测试和开发的Docker环境。如果您不使用Docker,您应该使用!

要使用docker-compose启动环境,只需

docker-compose up

这会生成一个包含源代码和包的PHP容器,运行本地开发服务器。它还会提供和链接Redis容器,用作您的存储机制。

如果您不使用docker-compose或想实现不同的存储系统,您可以启动一个单独的容器。

docker build -t <tag-name> .

docker run -v $PWD:/opt -p "8001:8001" <container_name>

服务器可通过:8001访问,其中包含一个迷你应用程序以供玩耍。运行测试同样简单,并且围绕docker进行

docker-compose up
docker-compose exec web bash
vendor/bin/phpunit