1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/imiphp-imi-grpc

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

IMI-gRPC

Последняя версия Версия PHP Версия Swoole Лицензия IMI

Введение

В рамках фреймворка IMI интегрированы сервисы разработки, клиентские вызовы и пулы соединений gRPC.

Протокол связи — двоичный Protobuf.

Composer

Этот проект можно установить с помощью 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 нажмите, чтобы присоединиться, где вы можете получить помощь и решение проблем от других участников.

Среда выполнения

  • PHP >= 7.1
  • Composer
  • Swoole >= 4.4.0

Информация о лицензии

imi-grpc распространяется под лицензией MIT и доступен для бесплатного использования.

Пожертвования

Открытое программное обеспечение не стремится к прибыли, любая сумма будет принята с благодарностью, жизнь непроста, так что полагаемся на удачу...

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/imiphp-imi-grpc.git
git@api.gitlife.ru:oschina-mirror/imiphp-imi-grpc.git
oschina-mirror
imiphp-imi-grpc
imiphp-imi-grpc
master