## 熔断与降级
- **服务熔断**:作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
- **服务降级**:是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。
## Mix Micro Hystrix
该组件是参考 Spring Hystrix 设计。
使用 [composer](https://www.phpcomposer.com/) 安装:
```
composer require mix/micro-hystrix
```
## 依赖注入配置
- [manifest/beans/hystrix.php](https://github.com/mix-php/mix-micro-skeleton/blob/master/manifest/beans/hystrix.php)
## 使用熔断器调用 gRPC
`do` 方法中第一参数为微服务客户端调用的匿名函数,第二个参数为 fallback,当触发熔断时会直接执行 fallback 返回。
~~~
$breaker = new \Mix\Micro\Hystrix\CircuitBreaker([
[
// 名称
'name' => 'php.micro',
// 超时时间, 单位: 秒
'timeout' => 5,
// 最大并发数,超过并发返回错误
'maxConcurrentRequests' => 5,
// 请求数量的阀值,用这些数量的请求来计算阀值
'requestVolumeThreshold' => 4,
// 错误百分比阀值,达到阀值,启动熔断
'errorPercentThreshold' => 25,
// 熔断尝试恢复时间, 单位: 秒
'sleepWindow' => 10,
],
]);
$result = $breaker->do('php.micro', function () use ($request, $name) {
// 调用rpc
$tracer = Tracing::extract($request->getContext());
$middleware = new TracingClientMiddleware($tracer);
$client = new SayClient($this->dialer->dialFromService('php.micro.grpc.greeter', $middleware));
$rpcRequest = new Request();
$rpcRequest->setName($name);
$rpcResponse = $client->Hello(Context::new(), $rpcRequest);
return $rpcResponse->getMsg();
}, function () use ($name) {
// 返回本地数据或抛出异常
return sprintf('hello, %s', $name);
});
~~~
- 查看调用实例: [SayController.php#L52](https://github.com/mix-php/mix-micro-skeleton/blob/master/app/Api/Controllers/Greeter/SayController.php#L52)
- 欢迎使用 MixPHP
- 安装说明
- 全栈开发
- 微服务开发
- Phar 开发
- 如何部署
- 独立部署
- Nginx
- Supervisord
- 新手教程
- 命令行常识
- 进程管理
- 热更新
- 全局变量
- 调试程序
- 入门须知
- 命名空间
- 自动加载
- 入口文件
- 增改应用
- 自动补全 IDE
- 核心功能
- 配置 (manifest.php)
- 依赖注入
- 事件调度
- 验证器
- 验证器定义
- 验证规则
- 静态调用
- 日志 Monolog
- 缓存
- 协程
- 什么是协程
- 开启协程
- Runtime
- 简介
- 创建协程 xgo + Channel
- 创建协程 xgo + WaitGroup
- xgo
- xdefer
- Channel
- WaitGroup
- Timer + Ticker
- Signal
- Select
- Context
- WorkerPool
- 数据库
- Database
- Database
- Connection
- QueryBuilder
- ExecutedEvent
- Redis
- Redis
- Connection
- CalledEvent
- 命令行
- 简介
- Application
- 创建命令
- 命令参数
- 打印与颜色
- 守护进程
- 后台运行
- Web/API 应用
- 简介
- 编写一个接口
- 服务器
- 路由 FastRoute
- 中间件
- 请求
- 响应
- 文件上传
- 控制器
- 视图
- Auth
- Session
- Guzzle
- HTTP 404/500
- 安全建议
- WebSocket 应用
- 简介
- 服务器
- 客户端
- Client
- JavaScript
- Swoole
- nginx代理
- 60s无消息断线
- Micro 微服务
- 简介
- 编写一个微服务
- Mix Micro
- Go Micro
- gRPC
- JSON-RPC
- 服务注册
- 配置中心
- 熔断与降级
- 调用链追踪
- 服务限流
- Sync Invoke 同步调用
- 简介
- 服务器
- 客户端
- TCP 应用
- 简介
- 服务器
- 客户端
- Telnet
- PHP
- Swoole
- UDP 应用
- 简介
- 服务器
- 客户端
- NC
- Swoole
- 第三方接入
- EasyWeChat
- Sentry
- Doctrine Cache
- 常见问题
- 如何利用 CPU 多核
- 连接多个数据库
- 如何设置跨域
- form-data 上传文件失败
- 输出大于 2M 的文件失败