令牌桶限流器
安装
composer require hyperf/rate-limit
配置
发布配置
php bin/hyperf.php vendor:publish hyperf/rate-limit
配置说明
| 配置 | 默认值 | 备注 |
|---|---|---|
| create | 1 | 每秒生成令牌数 |
| consume | 1 | 每次请求消耗令牌数 |
| capacity | 2 | 令牌桶最大容量 |
| limitCallback | [] |
触发限流时回调方法 |
| waitTimeout | 1 | 排队超时时间 |
使用限流器
组件提供 Hyperf\RateLimit\Annotation\RateLimit 注解,作用于类、类方法,可以覆盖配置文件。 例如,
<?phpnamespace App\Controller;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\RequestMapping;use Hyperf\RateLimit\Annotation\RateLimit;/*** @Controller(prefix="rate-limit")*/class RateLimitController{/*** @RequestMapping(path="test")* @RateLimit(create=1, capacity=3)*/public function test(){return ["QPS 1, 峰值3"];}/*** @RequestMapping(path="test2")* @RateLimit(create=2, consume=2, capacity=4)*/public function test2(){return ["QPS 2, 峰值2"];}}
配置优先级 方法注解 > 类注解 > 配置文件 > 默认配置
触发限流
当限流被触发时, 默认会抛出 Hyperf\RateLimit\Exception\RateLimitException 异常
可以通过异常处理或者配置 limitCallback 限流回调处理。
例如:
<?phpnamespace App\Controller;use Hyperf\Di\Aop\ProceedingJoinPoint;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\RequestMapping;use Hyperf\RateLimit\Annotation\RateLimit;/*** @Controller(prefix="rate-limit")* @RateLimit(limitCallback={RateLimitController::class, "limitCallback"})*/class RateLimitController{/*** @RequestMapping(path="test")* @RateLimit(create=1, capacity=3)*/public function test(){return ["QPS 1, 峰值3"];}public static function limitCallback(float $seconds, ProceedingJoinPoint $proceedingJoinPoint){// $seconds 下次生成Token 的间隔, 单位为秒// $proceedingJoinPoint 此次请求执行的切入点// 可以通过调用 `$proceedingJoinPoint->process()` 继续完成执行,或者自行处理return $proceedingJoinPoint->process();}}
