# 令牌桶限流器 ## 安装 ```bash composer require hyperf/rate-limit ``` ## 配置 ### 发布配置 ```bash php bin/hyperf.php vendor:publish hyperf/rate-limit ``` ### 配置说明 | 配置 | 默认值 | 类型 | 备注 | |:--------------:|:------:|:--------------:|:-------------------:| | create | 1 |int| 每秒生成令牌数 | | consume | 1 |int| 每次请求消耗令牌数 | | capacity | 2 |int| 令牌桶最大容量 | | limitCallback | `[]` |null\|callable| 触发限流时回调方法 | | waitTimeout | 1 |int| 排队超时时间 | | key | 当前请求 url 地址 |callable\|string| 限流的 key | ## 使用限流器 组件提供 `Hyperf\RateLimit\Annotation\RateLimit` 注解,作用于类、类方法,可以覆盖配置文件。 例如, ```php 类注解 > 配置文件 > 默认配置` ## 触发限流 当限流被触发时, 默认会抛出 `Hyperf\RateLimit\Exception\RateLimitException` 异常 可以通过[异常处理](zh-cn/exception-handler.md)或者配置 `limitCallback` 限流回调处理。 例如: ```php process()` 继续完成执行,或者自行处理 return $proceedingJoinPoint->process(); } } ``` ## 自定义令牌桶限流 key 默认的 key 是根据当前请求的 `url` ,当一个用户触发限流时,其他用户也被限流请求此`url`; 若需要不同颗粒度的限流, 如用户纬度的限流,可以针对用户 `ID` 进行限流,达到 A 用户被限流,B 用户正常请求: ```php get(RequestInterface::class); // 同理可以根据手机号、IP地址等不同纬度进行限流 return $request->input('user_id'); } } ```