1. 程式人生 > >dubbo-php-framework的服務註冊zookeeper過程解析(二)

dubbo-php-framework的服務註冊zookeeper過程解析(二)

我們接著dubbo-php-framework的服務註冊zookeeper過程解析(一)繼續分析剩下的介面。

//建立zk service,這裡的zk service也是封裝過的,不是原生zk的service,我們後續分析。
protected function createZookeeperService()
	{
		$ret = false;
		if(isset($this->config['fsof_setting']['zk_url_list']))//zk地址資訊,按之前配置檔案的解析,這裡配置的是zk地址資訊,類似http://127.0.0.1:2181
		{
			try
			{
				$zkUrlList = $this->config['fsof_setting']['zk_url_list'];
				$zkUrlArr = explode(',', $this->config['fsof_setting']['zk_url_list']);
				$registryUrl = array();
				foreach ($zkUrlArr as $zkUrl)//正式環境會配置多個zk,防止單點,這裡解析zk地址資訊,生成FSOFUrl物件形式的registryUrl。
				{
					$url = new FSOFUrl($zkUrl);
					$registryUrl[] = $url;
				}

				//建立與zookeeper連線用來上報和登出service資訊
				$this->zkService = RegistryServiceFactory::getRegistry($registryUrl);
				//動態通過回撥進行註冊
				$this->zkService->registerCallFunc(array($this,'watcherCallFunc'));
				//連線zookeeper
				$ret = $this->zkService->connectZk($this->ephemeral);
				if($ret == false)
				{
					//重新連線一次
					$ret = $this->zkService->connectZk($this->ephemeral);
				}
				if($ret == false)
				{
                    $this->logger->error('connect zookeeper failed|app:' . $this->appName . '|zkurl:' . $zkUrlList);
				}
			}
			catch (\Exception $e)
			{
                $this->logger->error('connect zookeeper failed|app:'.$e->getMessage(),$e);
			}
		}
		return $ret;
	}
//設定zk日誌資訊,註冊相關的日誌和業務日誌是分開的,這裡設定zk的日誌路徑和日誌級別等,而這些引數也是在全域性的fsof.ini檔案中配置,這裡也是讀取配置檔案的屬性進行設定。
protected function setZkLog()
	{
		//設定zookeeper日誌
		$zkLog_level = isset($this->config['fsof_setting']['zklog_level'])?$this->config['fsof_setting']['zklog_level']:self::ZOOKEEPER_LOG_NO;
		if ($zkLog_level > self::ZOOKEEPER_LOG_NO)
		{
			//開啟zookeeper日誌輸出開關
			if ($zkLog_level > self::ZOOKEEPER_LOG_DEBUG)
			{
				$zkLog_level = self::ZOOKEEPER_LOG_DEBUG;
			}

			//設定zookeeper的日誌檔案及日誌級別(1.error; 2.warn; 3.info; 4.debug)
            if(isset($this->config['fsof_setting']['zklog_path']) && !empty($this->config['fsof_setting']['zklog_path'])){
                $this->zkService->setLogFile($this->config['fsof_setting']['zklog_path'], $zkLog_level);
            }else{
                $this->zkService->setLogFile("/var/fsof/provider/zookeeper.log", $zkLog_level);
            }
		}
	}
protected function registerServiceToZk()
	{
		$ret = false;
		
		if(!empty($this->fsofUrlList))//服務對外dubbo協議地址不為空
		{
			foreach($this->fsofUrlList as $fsofUrl)//存在多個dubbo協議地址
			{
				try
				{
                    //註冊zk
					$ret = $this->zkService->register($fsofUrl);
				}
				catch(\Exception $e)
				{
					$ret = false;
					$errMsg = $e->getMessage();
                    $this->logger->error('register|app:'.$this->appName.'|url:'.$fsofUrl->getOriginUrl().'|path:'.$fsofUrl->getZookeeperPath().'|errMsg:'.$errMsg);
				}
			}
		}
		
		return $ret;
	}
//釋放zk物件
protected function inventZkService()
{
    unset($this->zkService);
}