dubbo-php-framework的客戶端api解析(三)
阿新 • • 發佈:2018-12-11
這篇我們分析生成Proxy後的處理流程,接著前面一篇文章,我們可以看到有p2p和register模式,這兩種模式最大的區別是服務地址資訊從哪裡獲取,而proxy的處理流程卻是一直的。
public static function newProxyInstance($serviceInterfaces, $appName, $group) { return new Proxy($serviceInterfaces, $appName, $group);//生成Proxy物件,其中serviceInterfaces為服務資訊,appName為應用名稱,group為分組資訊 } public function __construct($serviceInterfaces, $appName, $group) { $this->logger = \Logger::getLogger(__CLASS__); $this->serviceInterface = $serviceInterfaces; $this->appName = $appName; $this->group = $group; $this->fsofProcessor = new FSOFProcessor();//請求處理物件,之前篇章時已經分析過 }
//php自帶的系統api,用於處理物件的方法不存在時的處理,這個方法是實現客戶端呼叫的核心邏輯,這個方法可以遮蔽掉介面和引數而統一處理邏輯。 public function __call($name, $args) { $result = NULL; $method = null; $providerAddress = NULL; $request = new DubboRequest();//用DubboRequest封裝請求資訊 //取到微秒 $begin_time = microtime(true); $this->logger->debug("in|consumer_app:{$this->appName}|service:{$this->serviceInterface}|timout:{$this->ioTimeOut}|name:{$name}"); try { $request->setSn($this->generatePackageSN());//設定請求編號資訊 $request->setService($this->serviceInterface);//設定請求對應的service資訊 $request->setMethod($args[0]);//設定請求的方法名資訊 array_shift($args);//args[0]為方法名資訊,這裡剔除 $request->setParams($args);//設定方法引數資訊 $request->setTypes($this->generateParamType(count($request->getParams())));//設定引數型別資訊,這裡應該是為了和java互掉而做的處理。 $result = $this->fsofProcessor->executeRequest($request, $this->serviceAddress, $this->ioTimeOut, $providerAddress);//傳送請求並獲得處理結果資訊 }catch (\Exception $e) { $cost_time = (int)((microtime(true) - $begin_time) * 1000000); //記錄consumer介面告警日誌 $this->setAccLog($request, $cost_time, $e->getMessage()); throw $e; } $cost_time = (int)((microtime(true) - $begin_time) * 1000000); //記錄consumer介面告警日誌 $this->setAccLog($request, $cost_time, "ok"); return $result;//返回處理結果資訊 }