1. 增加consul示意图:
网关从consul中获取健康的列表进行调用服务.
(1). 修改bean.php:
app\bean.php:
'EnvConfig' => [
'class' => \App\Lib\EnvConfig::class,
'namespace' => env("ENV_NAMESPACE", ""),
'host' => env("ENV_HOST", ""),
// 增加
'service_prefix' => env("ENV_SERVICE_PREFIX", "localhost"),
],
(2). 增加EnvConfig类:
namespace App\Lib;
class EnvConfig {
...
// 增加以下代码
protected $service_prefix;
public function getServicePrefix()
{
return $this->service_prefix;
}
}
(3). 增加ServiceHelper类(用来根据服务名获取服务地址列表):
app\Lib\ServiceHelper.php:
namespace App\Lib;
use Swoft\Bean\Annotation\Mapping\Bean;
use Swoft\Bean\Annotation\Mapping\Inject;
use Swoft\Consul\Agent;
use Swoft\Consul\Health;
/**
* @Bean()
*/
class ServiceHelper{
/**
* @Inject()
* @var Agent
*/
private $agent;
/**
* @Inject()
* @var Health
*/
private $health;
public function getService(string $serviceName):array{
$services = $this->agent->services()->getResult();
$checks = $this->health->checks($serviceName, ["filter"=>"Status==passing"])->getResult();
$passingNode=[];
foreach($checks as $check){
$passingNode[]=$check["ServiceID"];
}
if(count($passingNode)==0) return [];
return array_intersect_key($services,array_flip($passingNode));
}
// 解析tags
public function parseTags(array $service): array
{
if (empty($service) || !is_array($service) || empty($service['Tags'])) {
return [];
}
$result = [];
foreach ($service['Tags'] as $v) {
if (preg_match("/^gw\.(\w+)=(.*)/i", $v, $matches)) {
$result[$matches[1]] = str_replace('.', '\\', $matches[2]);
}
}
return $result;
}
}