Featured image of post php注册consul

php注册consul

了解Consul

Consul 是一种服务网格解决方案,提供具有服务发现、配置和分段功能的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。

如何注册

文档:https://www.consul.io/api-docs/agent/service

引入软件包

Composer

PHP的软件包管理系统,它提供用于管理PHP软件和依赖库关系的标准格式。

搜索软件包

composer软件包地址:https://packagist.org/

根据PHP版本引入扩展包

我的php版本是7.2,所以我选择了v4.2.1版本。 composer require sensiolabs/consul-php-sdk:v4.2.1

注册Consul

php注册代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public function actionConsulRegister()
{
    // 只注册一台到consul
    $redisKey = "SERVICE:CONSULREGISTER";
    $predis = \Yii::$app->predis;
    $result = $predis->client->get($redisKey);
    if ($result) {
        echo "no";
        exit;
    }
    $result = $predis->client->set($redisKey, 1);
    $expireTime = 60;
    $predis->client->expire($redisKey, $expireTime);

    putenv("CONSUL_HTTP_ADDR=CONSUL_URL");
    $kv = new \SensioLabs\Consul\Services\Agent();
    $port = "80";
    $ip = getHostByName(getHostName());
    $array = [
        'id' => "{$ip}:{$port}",
        'name' => 'prometheus',
        'tags' => ['prometheus_v1'],
        'address' => $ip,
        'port' => (int)$port,
        'enabletagoverride' => false,
        'check' => array(
            // 'deregistercriticalserviceafter' => '90m',
            'http' => "http://{$ip}:{$port}/metrics",
            'interval' => "15s",
        )
    ];
    $kv->registerService($array);
    echo "success";
    exit;
}

代码释义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 只注册一台到consul
$redisKey = "HTL:HOTELDETAIL:CONSULREGISTER";
$predis = \Yii::$app->predis;
$result = $predis->client->get($redisKey);
if ($result) {
    echo "no";
    exit;
}
$result = $predis->client->set($redisKey, 1);
$expireTime = 60;
$predis->client->expire($redisKey, $expireTime);

为什么要有redis锁

因php不能像java一样自请求,是通过容器增加启动钩子访问容器内的php服务注册consul,由于php的promethues数据是存在redis中,如果注册两台会造成prometheus获取的打点数据double。

consul注册参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// consul地址
putenv("CONSUL_HTTP_ADDR=CONSUL_URL");
$kv = new \SensioLabs\Consul\Services\Agent();
$port = "80";
// 获取本机ip
$ip = getHostByName(getHostName());
$array = [
    // 服务id
    'id' => "{$ip}:{$port}",
    // 服务名称
    'name' => 'prometheus',
    // 服务tag,数组,自定义,可以根据这个tag来区分同一个服务名的服务
    'tags' => ['prometheus_v1'],
    // 服务注册到consul的IP,服务发现,发现的就是这个IP
    'address' => $ip,
    // 服务IP对应端口号
    'port' => (int)$port,
    'enabletagoverride' => false,
    'check' => array(
        // 如果服务启动失败,多少时间内注销consul上的该服务。单位:minute
        // 'deregistercriticalserviceafter' => '90m',
        // 指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
        'http' => "http://{$ip}:{$port}/metrics",
        // 健康检查间隔时间
        'interval' => "15s",
    )
];
$kv->registerService($array);

deregisterCriticalServiceAfter: 由于consul是安装在虚拟机上无法访问容器服务,所以不设置该参数,避免自动注销注册。

注册结果

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计