令牌桶限流器

安装

  1. composer require hyperf/rate-limit

配置

发布配置

  1. php bin/hyperf.php vendor:publish hyperf/rate-limit

配置说明

配置 默认值 备注
create 1 每秒生成令牌数
consume 1 每次请求消耗令牌数
capacity 2 令牌桶最大容量
limitCallback [] 触发限流时回调方法
waitTimeout 1 排队超时时间

使用限流器

组件提供 Hyperf\RateLimit\Annotation\RateLimit 注解,作用于类、类方法,可以覆盖配置文件。 例如,

  1. <?php
  2. namespace App\Controller;
  3. use Hyperf\HttpServer\Annotation\Controller;
  4. use Hyperf\HttpServer\Annotation\RequestMapping;
  5. use Hyperf\RateLimit\Annotation\RateLimit;
  6. #[Controller(prefix: "rate-limit")]
  7. class RateLimitController
  8. {
  9. #[RequestMapping(path: "test")]
  10. #[RateLimit(create: 1, capacity: 3)]
  11. public function test()
  12. {
  13. return ["QPS 1, 峰值3"];
  14. }
  15. #[RequestMapping(path: "test2")]
  16. #[RateLimit(create: 2, consume: 2, capacity: 4)]
  17. public function test2()
  18. {
  19. return ["QPS 2, 峰值2"];
  20. }
  21. }

配置优先级 方法注解 > 类注解 > 配置文件 > 默认配置

触发限流

当限流被触发时, 默认会抛出 Hyperf\RateLimit\Exception\RateLimitException 异常

可以通过异常处理或者配置 limitCallback 限流回调处理。

例如:

  1. <?php
  2. namespace App\Controller;
  3. use Hyperf\Di\Aop\ProceedingJoinPoint;
  4. use Hyperf\HttpServer\Annotation\Controller;
  5. use Hyperf\HttpServer\Annotation\RequestMapping;
  6. use Hyperf\RateLimit\Annotation\RateLimit;
  7. #[Controller(prefix: "rate-limit")]
  8. #[RateLimit(limitCallback: [RateLimitController::class, "limitCallback"])]
  9. class RateLimitController
  10. {
  11. #[RequestMapping(path: "test")]
  12. #[RateLimit(create: 1, capacity: 3)]
  13. public function test()
  14. {
  15. return ["QPS 1, 峰值3"];
  16. }
  17. public static function limitCallback(float $seconds, ProceedingJoinPoint $proceedingJoinPoint)
  18. {
  19. // $seconds 下次生成Token 的间隔, 单位为秒
  20. // $proceedingJoinPoint 此次请求执行的切入点
  21. // 可以通过调用 `$proceedingJoinPoint->process()` 继续完成执行,或者自行处理
  22. return $proceedingJoinPoint->process();
  23. }
  24. }