![753a399467425f9fbeb08e00fcf01cdd.gif](https://i-blog.csdnimg.cn/blog_migrate/b99d9265756effcbd06acbc7576254cb.gif)
breaker
- laravel 断路器支持
- 支持apcu与redis两个版本
安装和配置
- 安装
composer require anthony/breaker
- 绑定provider文件
// config/app.php 添加
/*
* Package Service Providers...
*/
AnthonyBreakerProvidersBreakerServiceProvider::class,
// ...
- 发布配置文件
php artisan vendor:publish
使用
- 基本使用
// 设置参数
$option = (new Option())
// 断路器id,不可重复
->setAppId('user_controller:get_user')
// 设置一个周期时长
->setCycleTime(30)
// 断路器打开的持续时间
->setOpenTimeout(8)
// 一个周期触发断路器打开的错误阀值
->setThreshold(10)
// 一个周期触发断路器打开的错误请求占比
->setPercent(0.95)
// 最小请求样本
->setMinSample(5)
// 半开状态下每次重试的时间延长(重试次数 * lengthen)
->setLengthen(0)
// 半开状态下成功次数和失败次数的状态转移
->setHalfOpenStatusMove(2, 1);
/* @var ICircuitBreaker $breaker 断路器对象 */
$breaker = app(ICircuitBreaker::class, ['option' => $option]);
// 执行的业务逻辑
$handler = function () {
return $this->userService->users();
};
// 自定义校验器,$data表示校验的结果,$elapsed表示程序耗时
$checker = function (array $data, float $elapsed) {
// 结果不为空,并且执行时间少于3秒表示成功,其他表示失败
return !empty($data) || $elapsed < 3;
};
// 设置断路器打开时的返回值
$breakerOpenResponse = [];
return $breaker->run($handler, $checker, $breakerOpenResponse);
- 自定义中间件使用
// 创建 app/Http/Middleware/CircuitBreaker.php 中间件文件
// 并在 app/Http/Kernel.php 中注册
protected $routeMiddleware = [
'breaker' => AppHttpMiddlewareCircuitBreaker::class,
// ...
];
// 路由中添加中间件
$router->post('users', 'UserController@getUsers')->middleware('breaker:user.v1.getUsers')->name('user.v1.getUsers');
// 编写CircuitBreaker.php文件
public function handle(Request $request, Closure $next, $name, $select = null)
{
if (null === $select) {
$select = config('breaker.default');
}
$configs = config('breaker.' . $select);
if (empty($configs)) {
return $next($request);
}
$option = (new Option())
->setAppId($name)
->setCycleTime($configs['cycle'])
->setOpenTimeout($configs['open_timeout'])
->setThreshold($configs['threshold'])
->setPercent($configs['percent'])
->setMinSample($configs['min_sample'])
->setLengthen($configs['lengthen'])
->setHalfOpenStatusMove($configs['half_op_success'], $configs['half_op_fail']);
/* @var ICircuitBreaker $breaker */
$breaker = app(ICircuitBreaker::class, ['option' => $option]);
// 执行的业务逻辑
$handler = function () use ($next, $request) {
return $next($request);
};
// 校验执行是否成功
$checker = function (JsonResponse $response, float $elapsed) use ($configs) {
$ret = null !== $response->exception;
$isTimeout = $elapsed >= 3;
return !$ret && !$isTimeout;
};
// 断路器打开时返回的数据
$breakerOpenResponse = response()->json($this->format());
return $breaker->run($handler, $checker, $breakerOpenResponse);
}
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里PHP进阶架构师>>>实战视频、大厂面试文档免费获取