编码方式向Consul注册我们的Swoole服务

编码方式向Consul注册我们的Swoole服务

前面简单认识了Consul,通过终端命令的方式演示了如何注册service和反注册service。

下面我们使用编码的方式,看看能否往Consul中注册服务?
1、根据Consul官网
https://www.consul.io/api/agent/service.html
提供的Agent HTTP API我们封装一个Consul工具类。

ConsulToolClass.php代码如下:

/**
 * 封装一个Consul工具类
 * Class ConsulToolClass
 */
class ConsulToolClass{

    public $ip = "10.211.55.17";
    public $port = "8500";

    /**
     * 注册服务
     * @param $json
     * @return mixed
     */
    public function registerService($json){
        return $this->curlPUT("/v1/agent/service/register",$json);
    }

    /**
     * 销毁服务
     * @param $service_id
     * @return mixed
     */
    public function deregisterService($service_id){
        return $this->curlPUT("/v1/agent/service/deregister/$service_id",null);
    }

    /**
     * PUT请求
     * @param $request_uri
     * @param $data
     * @return mixed
     */
    public function curlPUT($request_uri,$data){
        $ch = curl_init();
        $header[] = "Content-type:application/json";

        curl_setopt($ch,CURLOPT_URL,"http://".$this->ip.":".$this->port.$request_uri);
        curl_setopt($ch,CURLOPT_CUSTOMREQUEST,"PUT");
        curl_setopt($ch,CURLOPT_HEADER,0);
        curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$data);

        $res = curl_exec($ch);
        curl_close($ch);

        return $res;
    }
}

2、我们的需求是在我们创建swoole服务的时候,把服务注册到Consul(用Consul来管理我们的swoole服务)
思考:在swoole服务哪一个回调函数中,来完成往consul注册呢?
https://wiki.swoole.com/wiki/page/p-event/onStart.html
查看swoole文档得知:onStart是在Server启动在主进程的主线程回调此函数。

所以我们把swoole服务代码(我们还是创建一个HttpServer)修改为如下:



// 引入Consul工具类
require_once("./ConsulToolClass.php");

$http = new swoole_http_server("10.211.55.17", 9501);
$http->set(array('worker_num' => 4));


// 监听start事件
$http->on('start', function () {
      $data = array(
              "ID"=>"sw_service1",
              "Name"=>"sw_service1",
              "Tags"=>array("primary"),
              "Address"=>"10.211.55.17",
              "Port"=>9501,
              "Check"=>array("HTTP"=>"10.211.55.17","Interval"=>"5s")
          );

      $consul = new ConsulToolClass();
      $consul->registerService(json_encode($data)); //往Consul里注册服务
});


// 监听request请求
$http->on('request', function ($request, $response) {
    $response->end('ok');
});


// 开始
$http->start();

注意start事件中的代码,就是调用我们封装好的consul类注册服务方法。

3、如何测试

curl  http://10.211.55.17:8500/v1/agent/services

在开启HttpServer这个swoole服务之前,我们还是在重点执行上面命令来查询consul已经注册了的服务。

然后开启swoole服务:

php httpServer.php

这里写图片描述
这里写图片描述
第一次curl http://10.211.55.17:8500/v1/agent/services查看consul服务里边 是空的{},第二次已经可以看到我们的sw_service1。表示用代码的方式往consul注册我们的swoole服务成功了。

swoole守护进程

https://wiki.swoole.com/wiki/page/278.html

这里写图片描述
前面我们开启一个swoole服务,命令执行之后 会“卡”在那里。
这是因为不是守护进程的方式。
看swoole官网文档,我们知道:守护进程化。设置daemonize => 1时,程序将转入后台作为守护进程运行。长时间运行的服务器端程序必须启用此项

代码设置:

// 配置
$http->set(array('worker_num'=>4,"daemonize"=>1,"log_file"=>"./http_server.log"));

这里写图片描述
最初我们没有使用守护进程的方式来运行swoole服务,要想停掉服务,我们可以在终端里ctrl+c,现在改为守护进程的方式,如何停掉服务呢?

kill 进程id

编码方式向Consul注册我们的Swoole服务_第1张图片

再杀掉httpServer.php这个进程后,Consul去检查发现服务状态已经变为critical。(说明consul检查到我们的服务异常了)

consul如何注销服务

上面我们kill掉httpServer后,我们发现consul中还是可以查看到该服务(只是状态变了),
现在我们需要:httpServer进程结束之后,consul注销掉服务。

我们对consul注销服务的方法熟悉,重点是代码写在哪里?

查看swoole官网文档
https://wiki.swoole.com/wiki/page/19.html
我们可知:服务器关闭后,start函数返回true,并继续向下执行。

所以修改一下我们httpServer.php的代码:

// 开始
$res = $http->start();

if ($res){
     echo "注销服务...".PHP_EOL;
    (new ConsulToolClass())->deregisterService("sw_service1"); // 把consul中相关服务注销
    echo "注销成功".PHP_EOL;
}

你可能感兴趣的:(Swoole)