前面简单认识了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服务成功了。
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
再杀掉httpServer.php这个进程后,Consul去检查发现服务状态已经变为critical
。(说明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;
}