(3). RPC注册服务并健康检查:
app\Consul\RegisterServiceListener.php:
namespace App\Listener;
use Swoft\Bean\Annotation\Mapping\Inject;
use Swoft\Consul\Agent;
use Swoft\Event\Annotation\Mapping\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
use Swoft\Http\Server\HttpServer;
use Swoft\Log\Helper\CLog;
use Swoft\Server\SwooleEvent;
/**
* @since 2.0
* @Listener(event=SwooleEvent::START)
*/
class RegisterServiceListener implements EventHandlerInterface
{
/**
* @Inject()
* @var Agent
*/
private $agent;
/**
* @Inject()
* @var ConsulConfig
*/
private $config;
public function handle(EventInterface $event): void
{
/** @var HttpServer $httpServer */
$httpServer = $event->getTarget();
$service = [
'ID' => $this->config->getServiceId(),
'Name' => $this->config->getServiceName(),
'Tags' => [
'course_order_rpc',
'gw.NAMESPACE=App.Rpc.Lib'
],
'Address' => $this->config->getServiceAddress(),
'Port' => $this->config->getServicePort(),
'Meta' => [
'version' => '1.0'
],
'EnableTagOverride' => false,
'Weights' => [
'Passing' => 10,
'Warning' => 1
]
];
// Register
$this->agent->registerService($service);
$this->agent->registerCheck([
"name" => $this->config->getServiceId() . "_check",
"tcp" => $this->config->getServiceAddress().":".$this->config->getServicePort(),
"interval" => "10s",
"timeout" => "5s",
"serviceid"=>$this->config->getServiceId()
]);
CLog::info('Swoft http register service success by consul!');
}
}
注:
①. 健康检查如果是tcp(这个服务器IP地址),只要连上这个服务器就表示通过,不需要发送什么GET数据.
②. 健康检查也可以写成http的api.
③. 使用consul-tag进行参数配置:
a. 目标RPC服务,在注册时在tag加入namespace参数,可以替代环境变量注入的namespace.
b. tag是一个数组即可以用来过滤服务,还可以写一些参数或设置.
(3). 修改consul默认地址:
app\bean.php:
return [
'consul' => [
'host' => env("ENV_CONSUL_ADDRESS", "192.168.33.88"), // 这是consul的ip和port
'port' => env("ENV_CONSUL_PORT", 8500), // 注意不能是string类型
],
...
]
注:
①. 如果不修改,默认会注册到本机.
②. 在docker启动的时候,以环境变量的形式参数注入进来.
(4). 启动服务提到consul ui结果:
注:
Address是docker容器的IP地址.