diff --git a/composer.json b/composer.json index fb7e4db54..ebe1cebdd 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "swoft/framework": "^1.0" }, "require-dev": { - "eaglewu/swoole-ide-helper": "dev-master", + "swoft/swoole-ide-helper": "dev-master", "phpunit/phpunit": "^5.7" }, "autoload": { diff --git a/src/Circuit/CircuitBreaker.php b/src/Circuit/CircuitBreaker.php index 257fd1061..eb2375486 100644 --- a/src/Circuit/CircuitBreaker.php +++ b/src/Circuit/CircuitBreaker.php @@ -1,5 +1,12 @@ serviceName . "服务,当前[" . $this->getCurrentState() . "],熔断器状态切换,切换到[关闭]状态"); + App::debug($this->serviceName . '服务,当前[' . $this->getCurrentState() . '],熔断器状态切换,切换到[关闭]状态'); $this->circuitState = new CloseState($this); } @@ -169,7 +175,7 @@ public function switchToCloseState() */ public function switchToOpenState() { - App::debug($this->serviceName . "服务,当前[" . $this->getCurrentState() . "],熔断器状态切换,切换到[开启]状态"); + App::debug($this->serviceName . '服务,当前[' . $this->getCurrentState() . '],熔断器状态切换,切换到[开启]状态'); $this->circuitState = new OpenState($this); } @@ -178,7 +184,7 @@ public function switchToOpenState() */ public function switchToHalfState() { - App::debug($this->serviceName . "服务,当前[" . $this->getCurrentState() . "],熔断器状态切换,切换到[半开]状态"); + App::debug($this->serviceName . '服务,当前[' . $this->getCurrentState() . '],熔断器状态切换,切换到[半开]状态'); $this->circuitState = new HalfOpenState($this); } @@ -194,15 +200,15 @@ public function switchToHalfState() public function fallback($fallback = null, array $params = []) { if ($fallback == null) { - App::debug($this->serviceName . "服务,当前[" . $this->getCurrentState() . "],服务降级处理,fallback未定义"); + App::debug($this->serviceName . '服务,当前[' . $this->getCurrentState() . '],服务降级处理,fallback未定义'); return null; } if (is_array($fallback) && count($fallback) == 2) { - list($className, $method) = $fallback; - App::debug($this->serviceName . "服务,服务降级处理,执行fallback, class=" . $className . " method=" . $method); + list($fallbackObj, $method) = $fallback; + App::debug($this->serviceName . '服务,服务降级处理,执行fallback, class=' . get_class($fallbackObj) . ' method=' . $method); - return $className->$method(...$params); + return $fallbackObj->$method(...$params); } return null; diff --git a/src/Circuit/CloseState.php b/src/Circuit/CloseState.php index 4368c3e69..379fee0f4 100644 --- a/src/Circuit/CloseState.php +++ b/src/Circuit/CloseState.php @@ -1,9 +1,17 @@ circuitBreaker->serviceName . "服务,连接建立失败(null)"); + throw new \Exception($this->circuitBreaker->serviceName . '服务,连接建立失败(null)'); } - if ($class instanceof Client && $class->isConnected() == false) { - throw new \Exception($this->circuitBreaker->serviceName . "服务,当前连接已断开"); + if ( + ($class instanceof Client && $class->isConnected() == false) || + ($class instanceof ConnectionInterface && $class->check() == false) + ) { + throw new \Exception($this->circuitBreaker->serviceName . '服务,当前连接已断开'); } $data = $class->$method(...$params); } catch (\Exception $e) { @@ -41,18 +52,18 @@ public function doCall($callback, $params = [], $fallback = null) $this->circuitBreaker->incFailCount(); } - App::error($this->circuitBreaker->serviceName . "服务,当前[关闭状态],服务端调用失败,开始服务降级容错处理,error=" . $e->getMessage()); + App::error($this->circuitBreaker->serviceName . '服务,当前[关闭状态],服务端调用失败,开始服务降级容错处理,error=' . $e->getMessage()); $data = $this->circuitBreaker->fallback($fallback); } $failCount = $this->circuitBreaker->getFailCounter(); $switchToFailCount = $this->circuitBreaker->getSwitchToFailCount(); if ($failCount >= $switchToFailCount && $this->circuitBreaker->isClose()) { - App::trace($this->circuitBreaker->serviceName . "服务,当前[关闭状态],服务失败次数达到上限,开始切换为开启状态,failCount=" . $failCount); + App::trace($this->circuitBreaker->serviceName . '服务,当前[关闭状态],服务失败次数达到上限,开始切换为开启状态,failCount=' . $failCount); $this->circuitBreaker->switchToOpenState(); } - App::trace($this->circuitBreaker->serviceName . "服务,当前[关闭状态],failCount=" . $this->circuitBreaker->getFailCounter()); + App::trace($this->circuitBreaker->serviceName . '服务,当前[关闭状态],failCount=' . $this->circuitBreaker->getFailCounter()); return $data; } } diff --git a/src/Circuit/HalfOpenState.php b/src/Circuit/HalfOpenState.php index 79e97cc3b..bcf6d6780 100644 --- a/src/Circuit/HalfOpenState.php +++ b/src/Circuit/HalfOpenState.php @@ -1,9 +1,17 @@ getServiceName() . "服务, 建立连接失败(null)"); + throw new \Exception($this->getServiceName() . '服务, 建立连接失败(null)'); } - if ($class instanceof Client && $class->isConnected() == false) { - throw new \Exception($this->circuitBreaker->serviceName . "服务,当前连接已断开"); + if ( + ($class instanceof Client && $class->isConnected() == false) || + ($class instanceof ConnectionInterface && $class->check() == false) + ) { + throw new \Exception($this->circuitBreaker->serviceName . '服务,当前连接已断开'); } $data = $class->$method(...$params); $this->circuitBreaker->incSuccessCount(); - App::trace($this->getServiceName() . "服务,当前[半开状态],尝试执行成"); + App::trace($this->getServiceName() . '服务,当前[半开状态],尝试执行成'); } catch (\Exception $e) { $this->circuitBreaker->incFailCount(); $data = $this->circuitBreaker->fallback($fallback); - App::error($this->getServiceName() . "服务,当前[半开状态],尝试执行失败, error=" . $e->getMessage()); + App::error($this->getServiceName() . '服务,当前[半开状态],尝试执行失败, error=' . $e->getMessage()); } $failCount = $this->circuitBreaker->getFailCounter(); @@ -59,18 +70,18 @@ public function doCall($callback, $params = [], $fallback = null) if ($failCount >= $switchToFailCount && $this->circuitBreaker->isHalfOpen()) { $this->circuitBreaker->switchToOpenState(); - App::trace($this->getServiceName() . "服务,当前[半开状态],失败次数达到上限,开始切换到开启状态"); + App::trace($this->getServiceName() . '服务,当前[半开状态],失败次数达到上限,开始切换到开启状态'); } if ($successCount >= $switchToSuccessCount) { $this->circuitBreaker->switchToCloseState(); - App::trace($this->getServiceName() . "服务,当前[半开状态],成功次数达到上限,服务以及恢复,开始切换到关闭状态"); + App::trace($this->getServiceName() . '服务,当前[半开状态],成功次数达到上限,服务以及恢复,开始切换到关闭状态'); } // 释放锁 $lock->unlock(); - App::trace($this->getServiceName() . "服务,当前[半开状态], failCount=" . $failCount . " successCount=" . $successCount); + App::trace($this->getServiceName() . '服务,当前[半开状态], failCount=' . $failCount . ' successCount=' . $successCount); return $data; }