IMI-gRPC
В рамках фреймворка IMI интегрированы сервисы разработки, клиентские вызовы и пулы соединений gRPC.
Протокол связи — двоичный Protobuf.
Этот проект можно установить с помощью composer, следуя правилам автоматической загрузки psr-4. Добавьте следующее в свой файл composer.json
:
{
"require": {
"imiphp/imi-grpc": "^1.0.0"
}
}
Затем выполните команду composer update
для установки.
Вы можете обратиться к каталогу example
для получения примеров, включая полные серверные и клиентские вызовы.
gRPC и Protobuf — золотые партнёры, где Protobuf используется для сериализации и десериализации сообщений связи.
Сообщения связи gRPC включают запросы (Request) и ответы (Response). Параметры запроса извлекаются из запроса, а ответ возвращается клиенту.
Определение см. в файле example/grpc/grpc.proto
:
syntax = "proto3";
package grpc;
option php_generic_services = true;
service AuthService {
rpc Login (LoginRequest) returns (LoginResponse);
}
message LoginRequest {
string phone = 1; // 手机号
string password = 2; // 密码
}
message LoginResponse {
bool success = 1; // 是否成功
string error = 2; // 错误信息
}
После определения используйте команду для генерации файлов PHP: protoc --php_out=./ grpc.proto
.
Скачать и установить protoc: https://github.com/protocolbuffers/protobuf/releases
Настройте в проекте config/config.php
:
[
'components' => [
// 引入RPC组件以及本组件
'Rpc' => 'Imi\Rpc',
'Grpc' => 'Imi\Grpc',
],
]
Если вы используете основной сервер:
[
// 主服务器配置
'mainServer' => [
'namespace' => 'ImiApp\GrpcServer',
'type' => 'Grpc',
'host' => '127.0.0.1',
'port' => 8080,
],
]
Если вы используете подчинённый сервер:
[
// 子服务器(端口监听)配置
'subServers' => [
// 子服务器名
'XXX' => [
'namespace' => 'ImiApp\GrpcServer',
'type' => 'Grcp',
'host' => '127.0.0.1',
'port' => 8080,
]
],
]
Написание аналогично контроллеру Http Api.
Стандартный формат URL gRPC: http://host:port/{package}.{service}/{method}
/**
* @Controller("/grpc.AuthService/")
*/
class AuthServiceController extends HttpController implements AuthServiceInterface
{
/**
* Method <code>login</code>
*
* @Action
*
* @param \Grpc\LoginRequest $request
* @return \Grpc\LoginResponse
*/
public function login(\Grpc\LoginRequest $request)
{
$response = new LoginResponse;
$success = '12345678901' === $request->getPhone() && '123456' === $request->getPassword();
$response->setSuccess($success);
$response->setError($success ? '' : '登录失败');
return $response;
}
}
[
// 连接池配置
'pools' => [
'grpc' => [
'async' => [
'pool' => [
'class' => \Imi\Rpc\Client\Pool\RpcClientCoroutinePool::class,
'config' => [
// 根据实际情况设置
'maxResources' => 100,
'minResources' => 1,
],
],
'resource' => [
// 这里需要和你的服务端路由一致
'url' => 'http://127.0.0.1:8080/{package}.{service}/{name}',
// 'url' => 'http://127.0.0.1:8080/{package}.{service}/{name|ucfirst}', // 参数支持设定函数处理,比如这个将方法名首字母大写,兼容其它部分语言
'clientClass' => \Imi\Grpc\Client\GrpcClient::class,
'method' => 'POST', // 指定请求方式,默认 GET
'timeout' => 30, // 超时时间,单位:秒
]
],
],
],
'rpc' => [
'defaultPool' => 'grpc',
],
]
Код вызова:
// $service = \Imi\Rpc\Client\Pool\RpcClientPool::getClient('连接池名')->getService('服务名', '生成出来的服务接口类名');
$service =
``` **Перевод текста на русский язык:**
Imi\Rpc\Client\Pool\RpcClientPool::getClient()->getService('AuthService', \Grpc\AuthServiceInterface::class); $request = new \Grpc\LoginRequest; $request->setPhone(''); $service->login($request);
**Вызов с использованием аннотаций:**
```php
use Imi\Rpc\Annotation\RpcClient;
use Imi\Grpc\Client\Annotation\GrpcService;
class Test
{
/**
* @RpcClient()
*
* @var \Imi\Rpc\Client\IRpcClient
*/
protected $rpcClient;
/**
* @GrpcService(serviceName="grpc.AuthService", interface=\Grpc\AuthServiceInterface::class)
*
* @var \Grpc\AuthServiceInterface
*/
protected $authService;
public function aaa()
{
$request = new \Grpc\LoginRequest;
$request->setPhone('');
// Метод один
$this->rpcClient->getService('服务名', '生成出来的服务接口类名')->методИмя($request);
// Метод два
$this->xxxRpc->методИмя($request);
}
}
Атрибут serviceName
аннотации @GrpcService
имеет формат {package}.{service}
. Атрибут interface
представляет собой имя класса интерфейса генерируемого сервиса.
Примечание:
При использовании аннотации
@GrpcService
, если вызываемый метод интерфейсаgrpc
называетсяgetName
,send
,recv
,call
илиgetClient
, рекомендуется использовать методcall
, так как это может привести к конфликту с внутренними методами.
QQ группа: 17916227 , где вы можете получить помощь и решение проблем от других участников.
imi-grpc
распространяется под лицензией MIT и доступен для бесплатного использования.
Открытое программное обеспечение не стремится к прибыли, любая сумма будет принята с благодарностью, жизнь непроста, так что полагаемся на удачу...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )