1. 程式人生 > >dubbo-php-framework的客戶端api解析(三)

dubbo-php-framework的客戶端api解析(三)

這篇我們分析生成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;//返回處理結果資訊
    }