- 前言
- 版本管理
- 快速入门
- 核心架构
- 基础功能
- 数据库模型
- 微服务
- 网络服务
- 消息队列
- 客户端
- 其它组件
- 应用部署
- Awesome Hyperf
- 组件开发指南
- 版本升级指南
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
服务熔断及降级
安装
composer require hyperf/circuit-breaker
为什么要熔断?
分布式系统中经常会出现由于某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是服务降级。而 hyperf/circuit-breaker 组件,就是为了来解决这个问题的。
使用熔断器
熔断器的使用十分简单,只需要加入 Hyperf\CircuitBreaker\Annotation\CircuitBreaker
注解,就可以根据规定策略,进行熔断。 比如我们需要到另外服务中查询用户列表,用户列表需要关联很多的表,查询效率较低,但平常并发量不高的时候,响应速度还说得过去。一旦并发量激增,就会导致响应速度变慢,并会使对方服务出现慢查。这个时候,我们只需要配置一下熔断超时时间 timeout
为 0.05 秒,失败计数 failCounter
超过 1 次后熔断,相应 fallback
为 App\Service\UserService
类的 searchFallback
方法。这样当响应超时并触发熔断后,就不会再请求对端的服务了,而是直接将服务降级从当前项目中返回数据,即根据 fallback
指定的方法来进行返回。
<?php
declare(strict_types=1);
namespace App\Service;
use App\Service\UserServiceClient;
use Hyperf\CircuitBreaker\Annotation\CircuitBreaker;
use Hyperf\Di\Annotation\Inject;
class UserService
{
/**
* @Inject
* @var UserServiceClient
*/
private $client;
/**
* @CircuitBreaker(timeout=0.05, failCounter=1, successCounter=1, fallback="App\Service\UserService::searchFallback")
*/
public function search($offset, $limit)
{
return $this->client->users($offset, $limit);
}
public function searchFallback($offset, $limit)
{
return [];
}
}
默认熔断策略为 超时策略
,如果您想要自己实现熔断策略,只需要自己实现 Handler
继承于 Hyperf\CircuitBreaker\Handler\AbstractHandler
即可。
<?php
declare(strict_types=1);
namespace Hyperf\CircuitBreaker\Handler;
use Hyperf\CircuitBreaker\Annotation\CircuitBreaker as Annotation;
use Hyperf\CircuitBreaker\CircuitBreaker;
use Hyperf\CircuitBreaker\Exception\TimeoutException;
use Hyperf\Di\Aop\ProceedingJoinPoint;
class DemoHandler extends AbstractHandler
{
const DEFAULT_TIMEOUT = 5;
protected function process(ProceedingJoinPoint $proceedingJoinPoint, CircuitBreaker $breaker, Annotation $annotation)
{
$result = $proceedingJoinPoint->process();
if (is_break()) {
throw new TimeoutException('timeout, use ' . $use . 's', $result);
}
return $result;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论