资讯专栏INFORMATION COLUMN

grpc - 使用 golang 带你从头撸一套 RPC 服务(二)

raise_yang / 1450人阅读

摘要:紧接上一篇,下面用作为客户端调用的服务端。安装插件插件可以帮助我们自动生成客户端封装了的服务接口,方便我们直接引入调用,否则只生成服务请求响应的实体类,用起来不太方便。打包解包客户端发送至服务端服务端接收数据后使用对应的实体解包服务端

紧接上一篇,下面用PHP作为客户端调用Go的服务端。

安装 grpc_php_plugin 插件

grpc_php_plugin插件可以帮助我们自动生成client stub客户端(封装了grpc的服务接口),方便我们直接引入调用,否则只生成服务/请求/响应的实体类,用起来不太方便。

# 下载 grpc 的库到本地
cd ~ && git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
# 更新子模块依赖
cd grpc && git submodule update --init
# 这里我们只编译 php 的插件 如果要编译所有的 make && make install
make grpc_php_plugin
# 插件路径
ll ./bins/opt/grpc_php_plugin
生成PHP客户端

PHP只能做C端,且需要安装grpcprotobuf扩展和库。

###生成php客户端库

#不会有 client stub 类
protoc -I. --php_out=plugins=grpc:./user user.proto

# 会有 client stub 类
protoc -I. 
--php_out=./user 
--grpc_out=./user 
--plugin=protoc-gen-grpc=/root/grpc/bins/opt/grpc_php_plugin 
user.proto

# 查看生成的服务类库
[root@localhost grpc]# tree user
user
├── GPBMetadata
│   └── User.php
├── User
│   ├── UserClient.php
│   ├── UserDeleteRequest.php
│   ├── UserDeleteResponse.php
│   ├── UserEntity.php
│   ├── UserIndexRequest.php
│   ├── UserIndexResponse.php
│   ├── UserPostRequest.php
│   ├── UserPostResponse.php
│   ├── UserViewRequest.php
│   └── UserViewResponse.php
└── user.pb.go
PHP GRPC 扩展及依赖安装
#安装扩展
pecl install grpc
pecl install protobuf

使用 composer 管理依赖加载。

mkdir grpc-php-client && cd grpc-php-client
# 使用 composer 管理项目
composer init

# 安装 grpc/protobuf 的客户端库文件
composer require grpc/grpc
composer require google/protobuf

# 新建 grpc 服务库目录 将生成的PHP客户端文件移动至此
mkdir grpc && mv $GOPATH/src/grpc/user/* ./grpc
# 注册 psr4 自动加载服务的客户端文件
vi composer.json
{
    "name": "root/php-client",
    "require": {
        "grpc/grpc": "^1.19",
        "google/protobuf": "^3.7"
    },
    "autoload": {
        "psr-4": {
            "User": "./grpc/User/",
            "GPBMetadata": "./grpc/GPBMetadata/"
        }
    }

}
# 更新 composer 加载器
composer dump-autoload
PHP客户端代码实例

在安装完phpgrpc扩展和依赖库后,我们就可以编写代码了。

 GrpcChannelCredentials::createInsecure()
]);


$userIndexRequest = new UserIndexRequest();
$userIndexRequest->setPage(1);
$userIndexRequest->setPageSize(12);

/* @var $userIndexResponse UserIndexResponse */
/* @var $statusObj stdClass */
list($userIndexResponse, $statusObj) = $userClient->UserIndex($userIndexRequest)->wait();

if (0 != $statusObj->code) {
    throw new Exception($statusObj->details, $statusObj->code);
}

printf("index request end: err %d msg %s" . PHP_EOL, $userIndexResponse->getErr(), $userIndexResponse->getMsg());

/* @var $data UserEntity[] */
$data = $userIndexResponse->getData();
foreach ($data as $row) {
    echo $row->getName() . " " . $row->getAge() . PHP_EOL;
}

// 剩余的就不写了 都很简单的
// $userClient->UserView();
// $userClient->UserPost();
// $userClient->UserDelete();
# 结果
[root@localhost php-client]# php index.php 
index request end: err 0 msg success 
big_cat 28
sqrt_cat 29

Go 服务端和客户端版

Protobuf 的原生使用

grpc使用protobuf作为IDL,声明服务接口,请求实体,响应实体,后续我们将自己业务填充进去,客户端发送请求实体,服务端服务接口处理业务,然后返回响应实体,请求/响应实体的数据传输也使用protobuf进行了打包/解包。

# 打包
//GoogleProtobufInternalMessage::serializeToString
# 解包
//GoogleProtobufInternalMessage::mergeFromString

// 客户端
$message = new Message();
$message->setId(1);
$message->setName("sqrt_cat");
$message->setAddress("shanghai");

$package = $message->serializeToString();

// 发送 $package 至服务端
// 服务端接收数据后使用对应的实体解包

// 服务端
$message = new Message();
$message->mergeFromString($package);

var_dump($message->getId(), $message->getName(), $message->getAddress());

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31518.html

相关文章

  • 从实践到原理,带你参透 gRPC

    摘要:原文地址从实践到原理,带你参透在语言中大放异彩,越来越多的小伙伴在使用,最近也在公司安利了一波,希望能通过这篇文章能带你一览的爱与恨。帧的主要作用是装填主体信息,是数据帧。 showImg(https://segmentfault.com/img/remote/1460000019552245); 原文地址:从实践到原理,带你参透 gRPC gRPC 在 Go 语言中大放异彩,越来越多...

    geekidentity 评论0 收藏0
  • 带入gRPC:对 RPC 方法做自定义认证

    摘要:带入对方法做自定义认证原文地址带入对方法做自定义认证项目地址前言在前面的章节中,我们介绍了两种证书算一种可全局认证的方法证书认证基于的证书认证而在实际需求中,常常会对某些模块的方法做特殊认证或校验。 带入gRPC:对 RPC 方法做自定义认证 原文地址:带入gRPC:对 RPC 方法做自定义认证项目地址:https://github.com/EDDYCJY/go... 前言 在前面的章...

    wh469012917 评论0 收藏0
  • Golang服务教程(

    摘要:定义微服务作为客户端调用的函数实现中的接口,使作为的服务端检查是否有适合的货轮货物被承运解析命令行参数作为的客户端增加货物并运行更新中的货物,塞入三个集装箱,重量和容量都变大。 译文链接:wuYin/blog原文链接:ewanvalentine.io,翻译已获作者 Ewan Valentine 授权。 本节未细致介绍 Docker,更多可参考:《第一本Docker书 修订版》 前言 在...

    sevi_stuo 评论0 收藏0

发表评论

0条评论

raise_yang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<