版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/82751456
我们接着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);
}