gRPC 服务
推荐阅读 tech| 再探 grpc, 讲解了在 PHP 中实现 gRPC 相关基础知识.
hyperf 对 gRPC 支持做了更进一步的封装, hyperf-skeleton 项目为例, 详细讲解整个步骤:
- .proto 文件以及相关配置实例
- gRPC server 示例
- gRPC client 示例
- 定义好 proto 文件
- 使用 protoc 生成示例代码
# 使用 linux 包管理工具安装 protoc, 下面以 alpine 为例, 也可以参考 hyper-skeleton 下的 Dockerfile
apk add protobuf
# 使用 protoc 自动生成代码
protoc --php_out=grpc/ grpc.proto
# tree grpc
grpc
├── GPBMetadata
└── Grpc
├── HiReply.php
└── HiUser.php
- 配置 composer.json, 使用
grpc/
下代码的自动加载. 如果 proto 文件中使用不同的package
设置, 或者使用了不同的目录, 进行相应调整即可,添加之后执行composer dump-autoload
使自动加载生效
- gRPC server 服务器配置
server.php
文件(参考 ):
'servers' => [
....
'name' => 'grpc',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9503,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
SwooleEvent::ON_REQUEST => [\Hyperf\GrpcServer\Server::class, 'onRequest'],
],
],
],
HiController.php
文件中的 sayHello
方法:
public function sayHello(HiUser $user)
{
$message = new HiReply();
$message->setMessage("Hello World");
$message->setUser($user);
return $message;
.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
中找到:
hyperf 已经封装好了 \Hyperf\GrpcClient\BaseClient
, 只要根据 .proto 文件中的定义, 按需扩展:
class HiClient extends BaseClient
{
public function sayHello(HiUser $argument)
{
return $this->simpleRequest(
'/grpc.hi/sayHello',
$argument,
[HiReply::class, 'decode']
);
}
如果你是 gRPC 的重度使用者, 欢迎关注 hyperf 的后续开发者工具, 可以根据 .proto 文件生成全套 gRPC 代码.