robwittman / leaky-bucket-rate-limiter
实现漏桶速率限制器的PSR-7中间件
Requires
- php: ^5.5 || ^7.0
- predis/predis: ^1.1
- zendframework/zend-diactoros: ^1.3
Requires (Dev)
- phpunit/phpunit: ^5.6
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" ]); }; ]));
注意所有进一步设置都假设已经设置了callback
和throttle
参数
容量和泄漏
容量是桶可以包含的总滴落(请求)量。泄漏是你希望从桶中移除的每秒滴落量
$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