Hyperf 完整项目-2-服务限流
一切可从官方文档学习到
https://hyperf.wiki/#/zh/rate-limit
1. 安装服务限流组件
composer require hyperf/rate-limit
2. 使用限流器
<?php
namespace 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"];
}
}
3.自定义异常返回
config/autoload/exceptions.php添加
App\Exception\Handler\RateLimitExceptionHandler::class
app/Exception/Handler/ 新建异常处理
<?php
namespace App\Exception\Handler;
use Hyperf\Di\Annotation\Inject;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Psr\Http\Message\ResponseInterface;
use Hyperf\RateLimit\Exception\RateLimitException;
use Throwable;
class RateLimitExceptionHandler extends ExceptionHandler
{
/**
* @Inject
*
* @var \Hyperf\HttpServer\Contract\ResponseInterface as httpResponse
*/
protected $httpResponse;
public function handle(Throwable $throwable, ResponseInterface $response)
{
// 判断被捕获到的异常是希望被捕获的异常
if ($throwable instanceof RateLimitException) {
// 格式化输出
$data = json_encode([
'code' => $throwable->getCode(),
'msg' => $throwable->getMessage(),
], JSON_UNESCAPED_UNICODE);
// 阻止异常冒泡
$this->stopPropagation();
// return $response->withStatus(500)->withBody(new SwooleStream($data));
return $this->httpResponse->json(['msg' => '触发访问频率限制', 'code' => 503, 'data' => $data]);
}
// 交给下一个异常处理器
return $response;
// 或者不做处理直接屏蔽异常
}
/**
* 判断该异常处理器是否要对该异常进行处理
*/
public function isValid(Throwable $throwable): bool
{
return true;
}
}
- 自定义异常请看官方异常处理章节
https://hyperf.wiki/#/zh/exception-handler
4. 效果如下
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
推荐文章: