dubbo-php-framework的服務註冊zookeeper過程解析(二)
阿新 • • 發佈:2018-12-10
我們接著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);
}