blob: b86fc89f1a0fe26ba167a2544e2011f2d228bfdd [file] [log] [blame]
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace com\fenqile\fsof\registry\automatic;
use com\fenqile\fsof\common\url\FSOFUrl;
use com\fenqile\fsof\common\file\FSOFRedis;
use com\fenqile\fsof\common\config\FSOFConstants;
class ConsumerProxy
{
private static $_instance;
private $logger;
private $config = [];
public static function instance($config)
{
if (!isset(ConsumerProxy::$_instance))
{
ConsumerProxy::$_instance = new ConsumerProxy($config);
}
return ConsumerProxy::$_instance;
}
public function __construct($config)
{
$this->logger = \Logger::getLogger(__CLASS__);
$this->config = $config;
}
/**
* consumer根据查找条件组合,获取相应provider URL信息。ConsumerProxy内部实现共享内存和文件缓存两级缓存,先读共享内存,找不到再度文件缓存
*/
public function getProviders($service, $version=FSOFConstants::FSOF_SERVICE_VERSION_DEFAULT, $group=FSOFConstants::FSOF_SERVICE_GROUP_ANY)
{
try
{
//获取路由信息
$providerInfo = FSOFRedis::instance($this->config)->getProviderInfo($service);
return $this->filterProviderUrls($providerInfo, $version, $group, $service);
}
catch (\Exception $e)
{
//数据异常关闭连接
FSOFRedis::instance()->close();
$this->logger->error('get Provider Info from redis exception:'.$e->getMessage(),$e);
return NULL;
}
}
private function filterProviderUrls($providerInfo, $version, $group, $service)
{
$urls = array();
if (is_array($providerInfo))
{
foreach ($providerInfo as $index => $url)
{
try
{
$urlObj = new FSOFUrl($url);
if (!empty($urlObj))
{
//服务校验
if (0 == strncmp($urlObj->getService(), $service, strlen($service)))
{
//服务Version强校验
if ($version == $urlObj->getVersion(FSOFConstants::FSOF_SERVICE_VERSION_DEFAULT))
{
if ($group == FSOFConstants::FSOF_SERVICE_GROUP_ANY || $group == $urlObj->getGroup(FSOFConstants::FSOF_SERVICE_GROUP_DEFAULT))
{
$urls[] = $urlObj;
if($this->logger->isDebugEnabled()){
$this->logger->debug("find provider form redis for [$service:$version:$group],url:".json_encode($url,true));
}
}
}
}
else
{
//数据出现乱序关闭连接
FSOFRedis::instance()->close();
$this->logger->error('get redis data exception, service:'.$service.'; redis data list:'.json_encode($providerInfo,true));
break;
}
}
}
catch (\Exception $e)
{
$this->logger->error('error of url:' . $url, $e);
}
}
}
if (empty($urls))
{
$this->logger->warn('version:' .$version. ' group:' .$group. ' service:' .$service. ' get Provider Info from redis is empty.');
}
return $urls;
}
}