flix-tech/guzzle-circuit-breaker-middleware

此包已被废弃,不再维护。没有建议的替代包。

一个用于集成 `ejsmont-artur/php-circuit-breaker` 的 Guzzle 6 中间件

1.0.1 2017-07-14 16:00 UTC

This package is auto-updated.

Last update: 2022-05-26 15:26:04 UTC


README

Build Status

这是一个集成 https://github.com/ejsmont-artur/php-circuit-breaker 的 Guzzle 6 中间件。

内容

要求

依赖

依赖 版本 原因
php ~7.0 低于此版本(几乎)已达到 EOL
guzzlephp/promises ~6.2 中间件传递承诺
psr/http-message ~1.0 标准化,doh
ejsmont-artur/php-circuit-breaker ~0.1 PHP 的简单且健壮的断路器实现

安装

此库通过 composer 安装。

composer require "flix-tech/guzzle-circuit-breaker-middleware=~1.0"

用法

注意 建议将此中间件放在栈顶,以便如果服务不可用,可以立即拒绝,而无需继续向下链。

默认配置下,此中间件将检查 PSR-7 请求,查找通过请求选项数组中的 "circuit_breaker.requested_service_name"(通过 Middleware::CB_TRANSFER_OPTION_KEY 在请求选项中公开)或请求头 "X-CB-Service-Name"(通过 Middleware::CB_SERVICE_NAME_HEADER 公开)公开的传输选项键。您可以通过传递一个自定义服务名提取器可调用者来传递自己的服务名,该可调用者的形式为 f(RequestInterface $request, array $requestOptions): string

将使用服务名在断路器中查找可用性。如果不可用,则将立即使用 CircuitBreakerIsClosedException 拒绝。

如果请求成功,中间件将向断路器报告给定服务的成功。否则,它将报告失败并将拒绝传递到链的下一级。

您可以将自定义异常映射传递到中间件中,以控制哪些异常类型和值应实际触发失败报告。例如,404 可能是配置错误并可能不会触发失败报告。异常映射回调的形式为 f($rejectedValue): bool

示例

<?php

use Ejsmont\CircuitBreaker\Factory;
use FlixTech\CircuitBreakerMiddleware\Middleware;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;
use Psr\Http\Message\RequestInterface;

$circuitBreaker = Factory::getSingleApcInstance();

$serviceNameExtractor = function (RequestInterface $request, array $options) {
    if (\array_key_exists('my_custom_option_key', $options)) {
        return $options['my_custom_option_key'];
    }
    
    return null;
};

$exceptionMap = function ($rejectedValue) {
    if ($rejectedValue instanceof RequestException && $rejectedValue->getResponse()) {
        return 404 !== $rejectedValue->getResponse()->getStatusCode();
    }
    
    return true;
};

$middleware = new Middleware(
    $circuitBreaker,
    $serviceNameExtractor,
    $exceptionMap
);

$handlerStack = HandlerStack::create(new CurlHandler());
$handlerStack->push($middleware);

$client = new Client(['handler' => $handlerStack]);

测试

要运行测试,只需在安装开发需求后从项目的根目录运行 ./vendor/bin/phpunit

贡献

为了贡献这个库,请遵循以下工作流程

  • 复制仓库
  • 创建一个功能分支
  • 在功能上工作
  • 运行测试以验证测试是否通过
  • 向上游 master 分支提交一个PR
  • 查看在您的PR上出现的任何Travis CI消息
  • 为为开源做出贡献而感到高兴!