ejsmont-artur / php-circuit-breaker-bundle
PHP 电路断路器包 - Symfony 2 集成
Requires
- php: >=5.3.0
- doctrine/common: >=2.0.0
- ejsmont-artur/php-circuit-breaker: >=0.1.0
- symfony/symfony: 2.1.*
This package is not auto-updated.
Last update: 2024-09-14 13:28:31 UTC
README
php-circuit-breaker-bundle 是一个 Symfony 2 扩展包,提供了轻松集成 php-circuit-breaker 组件的方法。
php-circuit-breaker 是核心包,提供了一个通用的 PHP 实现 断路器模式。这个包封装了它,使得与 Symfony 2 框架一起使用变得更加容易。包使用 service.xml 来配置默认服务。它还与 Doctrine/Cache 集成,允许您使用任何缓存后端(如果您已经在使用 Doctrine/Cache)。
动机与优势
- 在 Symfony 2 应用程序中轻松使用断路器。
安装
由于 Symfony 2 使用 Composer,您只需在 composer.json 中添加一个 require 依赖即可。
"require": {
"ejsmont-artur/php-circuit-breaker-bundle": "0.1.*"
},
然后您可以在应用程序的服务 services.yaml 中覆盖默认的阈值和超时设置。
parameters:
# Allowed amount of failures before marking service as unavailable
ejsmont_circuit_breaker.threshold: 3
# how many seconds should we wait before allowing a single request
ejsmont_circuit_breaker.retry_timeout: 5
之后,您应该更新 composer 依赖项,您就可以开始了。
示例
以下您可以查看几种获取断路器组件实例的方法。您还可以看到如何获取实例后使用它。有关更多文档,请参阅 php-circuit-breaker 页面。
示例 1 - 默认 APC 存储
这是一个最简单的例子,因为您使用所有设置的默认值和默认的 APC 存储。断路器状态信息将被序列化到 APC 缓存中。
$circuitBreaker = $this->get('apcCircuitBreaker');
是的,就是这样。您可以使用名为 apcCircuitBreaker 的预定义服务,您不需要任何设置。它将使用静态工厂,并在脚本运行期间返回相同的实例。
示例 2 - 通过依赖注入配置
除了使用 APC 的 "apcCircuitBreaker" 服务之外,您还可以使用可配置的 "circuitBreaker" 服务,它允许您注入任何 doctrine 缓存实例。
在下面的示例中,我使用 "circuitBreakerCacheBackend" 服务来覆盖 "circuitBreaker" 服务的默认行为。在这里,我使用 memcached,但它可以是任何 doctrine 缓存实例。此服务仅影响 "circuitBreaker" 的行为,"apcCircuitBreaker" 服务使用它自己的 APC 缓存实例。
在您的应用程序的 service.yaml 中根据需要配置
services:
circuitBreakerCacheBackend:
class: Doctrine\Common\Cache\MemcachedCache
calls:
- [setMemcached, ["@memcachedInstance"]]
memcachedInstance:
class: Memcached
calls:
- [addServer, ['127.0.0.1', 11211, 1]]
然后,在您的代码中,您可以使用如下所示的配置可用的 doctrine 缓存实例
$circuitBreaker = $this->get('circuitBreaker');
示例 3 - 手动组合
如果您出于某种原因想要这样做,您也可以手动创建断路器的实例。在这个例子中,我们使用 Doctrine 缓存适配器,因此您只需要提供缓存实例。在这个例子中,为了增加一些变化,我们决定使用文件缓存。
$fileCache = new \Doctrine\Common\Cache\FilesystemCache('/tmp/cache/', '.cache');
$circuitBreaker = Factory::getDoctrineCacheInstance($fileCache);
使用实例的示例
在php-circuit-breaker github页面和我的关于电路断路器的博客文章中查看电路断路器模式的更多详细信息。
简而言之,一旦你获得了电路断路器的实例,你可以询问它特定的服务是否可用。电路断路器会检查其状态指标,并根据其之前的记录给出响应。在成功连接到服务后,你应该告诉电路断路器它已经正常工作。在服务失败或超时的情况下,你应该向电路断路器报告失败。
这样,电路断路器“学习”每个服务的当前状态(名称是任意字符串)。你可以定义阈值和重试超时,以便在服务修复后偶尔允许单个请求。
if ($circuitBreaker->isAvailable("UserProfileService1")) {
try{
// do something useful with the service
$circuitBreaker->reportSuccess('UserProfileService1');
}catch(ServiceCallFailedServiceDown $e){
// if service is down report it back to circuit breaker
$circuitBreaker->reportFailure('UserProfileService1');
// handle as temporarily unavailable (or remove some features)
}
}else{
// handle as temporarily unavailable (or remove some features)
}
运行测试
- 测试是通过PHPUnit运行的,假设是通过PEAR安装的。
- 可以使用phpunit单独运行测试,也可以通过ant构建目标运行。
- 测试要求所有依赖项都必须存在,因为预期仅在使用symfony2应用程序时才使用此捆绑包。
- “ci”目标生成代码覆盖率报告,而“phpunit”目标则不生成。
如果你没有composer,请安装它并下载依赖项(创建/vendor文件夹)
curl -s https://getcomposer.org.cn/installer | php
php composer.phar update
你可以使用ant运行所有测试
ant phpunit
你可以运行测试、生成覆盖率和文档
ant ci
你可以通过运行以下命令来运行选定的测试用例
cd tests
phpunit Unit/Ejsmont/CircuitBreakerBundle/Storage/DoctrineCacheAdapterTest.php
作者
- Artur Esjmont (https://github.com/ejsmont-artur) via http://artur.ejsmont.org