## 熔断与降级 - **服务熔断**:作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。 - **服务降级**:是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的 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)