laravel redis_laravel 断路器支持 支持apcu与redis两个版本

753a399467425f9fbeb08e00fcf01cdd.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进阶架构师>>>实战视频、大厂面试文档免费获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值