安裝consul服務
hyperf文檔中并沒有說明如何安裝 Consul 服務减江,以下對 Consul 做一個簡單的安裝
docker pull consul
docker run --name consul1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect=1 -ui -bind=0.0.0.0 -client=0.0.0.0
訪問頁面:http://127.0.0.1:8500/ui/dc1/services
hyperf-rpc-service-user項目和hyperf-rpc-client項目都加載依賴
composer require hyperf/service-governance-consul
修改代碼hyperf-rpc-service-user 項目
config/autoload/services.php
<?php
return [
'enable' => [
// 開啟服務發(fā)現(xiàn)
'discovery' => true,
// 開啟服務注冊
'register' => true,
],
// 服務消費者相關配置
'consumers' => [],
// 服務提供者相關配置
'providers' => [],
// 服務驅(qū)動相關配置
'drivers' => [
'consul' => [
'uri' => 'http://172.17.0.3:8500',
'token' => '',
'check' => [
'deregister_critical_service_after' => '90m',
'interval' => '1s',
],
],
],
];
config/autoload/consul.php
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
return [
'uri' => 'http://172.17.0.3:8500',
'token' => '',
];
app/JsonRpc/UserService.php
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
use Hyperf\Contract\ConfigInterface;
/**
* 注意染突,如希望通過服務中心來管理服務,需在注解內(nèi)增加 publishTo 屬性
* @RpcService(name="UserService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul")
*/
class UserService implements UserServiceInterface
{
// 獲取用戶信息
public function getUserInfo(int $id)
{
return ['id' => $id, 'name' => '黃翠剛'];
}
}
啟動服務: php bin/hyperf.php start
可以發(fā)現(xiàn)consul中已經(jīng)多了一個服務了
修改代碼hyperf-rpc-client 項目
config/autoload/services.php
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
return [
// 此處省略了其它同層級的配置
'consumers' => value(function () {
$consumers = [];
// 這里自動創(chuàng)建代理消費者類的配置形式辈灼,顧存在 name 和 service 兩個配置項份企,這里的做法不是唯一的,僅說明可以通過 PHP 代碼來生成配置
$services = [
'UserService' => \App\JsonRpc\UserServiceInterface::class,
];
foreach ($services as $name => $interface) {
$consumers[] = [
// 服務名
'name' => $name,
// 服務接口名巡莹,可選司志,默認值等于 name 配置的值,如果 name 直接定義為接口類則可忽略此行配置降宅,如 name 為字符串則需要配置 service 對應到接口類
'service' => $interface,
// 服務提供者的服務協(xié)議骂远,可選,默認值為 jsonrpc-http
'protocol' => 'jsonrpc-http',
// 這個消費者要從哪個服務中心獲取節(jié)點信息腰根,如不配置則不會從服務中心獲取節(jié)點信息
'registry' => [
'protocol' => 'consul',
'address' => 'http://172.17.0.3:8500',
],
];
}
return $consumers;
}),
];