gRPC 服务

    推荐阅读 tech| 再探 grpc, 讲解了在 PHP 中实现 gRPC 相关基础知识.

    • .proto 文件以及相关配置实例
    • gRPC server 示例
    • gRPC client 示例
    • 定义好 proto 文件
    • 使用 protoc 生成示例代码
    1. # 使用 linux 包管理工具安装 protoc, 下面以 alpine 为例, 也可以参考 hyper-skeleton 下的 Dockerfile
    2. apk add protobuf
    3. # 使用 protoc 自动生成代码
    4. protoc --php_out=grpc/ grpc.proto
    5. # tree grpc
    6. grpc
    7. ├── GPBMetadata
    8. └── Grpc.php
    9. ├── HiReply.php
    10. └── HiUser.php
    • 配置 composer.json, 使用 grpc/ 下代码的自动加载. 如果 proto 文件中使用不同的 package 设置, 或者使用了不同的目录, 进行相应调整即可
    • gRPC server 服务器配置 server.php 文件(参考 ):
    1. 'servers' => [
    2. ....
    3. [
    4. 'type' => Server::SERVER_HTTP,
    5. 'host' => '0.0.0.0',
    6. 'port' => 9503,
    7. 'sock_type' => SWOOLE_SOCK_TCP,
    8. 'callbacks' => [
    9. SwooleEvent::ON_REQUEST => [\Hyperf\GrpcServer\Server::class, 'onRequest'],
    10. ],
    11. ],
    12. ],
    • gRPC server 路由配置 routes.php 文件(参考 路由):

    .proto 文件中的定义和 gRPC server 路由的对应关系: /{package}.{service}/{rpc}

    • 如果想更深入一点 gRPC server 如何对 gRPC 请求进行处理的: \Hyperf\GrpcServer\CoreMiddleware::process() (vendor/hyperf/grpc-server/src/CoreMiddleware.php:46, 复制后直接使用 phpstorm 打开), 解析出 request_uri, 即得到 /{package}.{service}/{rpc} 信息, 然后调用好封装好的 gRPC 编解码类 \Hyperf\Grpc\Parser::deserializeMessage(vendor/hyperf/grpc-server/src/CoreMiddleware.php:137), 就可以获取到请求的明文信息

    示例代码可以在 GrpcController 中找到:

    1. $client = new \App\Grpc\HiClient('127.0.0.1:9503', [
    2. 'credentials' => null,
    3. ]);
    4. $request = new \Grpc\HiUser();
    5. $request->setName('hyperf');
    6. $request->setSex(1);
    7. /**
    8. * @var \Grpc\HiReply $reply
    9. */
    10. list($reply, $status) = $client->sayHello($request);
    11. $message = $reply->getMessage();
    12. $user = $reply->getUser();
    13. $client->close();
    14. var_dump(memory_get_usage(true));

    如果你是 gRPC 的重度使用者, 欢迎关注 hyperf 的后续开发者工具, 可以根据 .proto 文件生成全套 gRCP 代码.