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

栏目: Go · 发布时间: 5年前

内容简介:紧接上一篇,下面用 PHP 作为客户端调用 golang 的服务端。如果要和世界上最好的语言

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

安装 grpc_go_plugin 插件

grpc_php_plugin 插件可以帮助我们自动生成 client stub 类库(相当于 API 文件),方便我们直接引入调用,否则只生成服务/请求/响应的实体类,用起来不太方便。

# 下载 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 结合使用的话( PHP 只能做 C 端)只需要安装 grpcprotobuf 扩展,生成 PHP 版的库即可。

###生成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 扩展和依赖库后,我们就可以编写代码了。

<?php

require_once __DIR__ . '/vendor/autoload.php';

use User\UserClient;
use User\UserEntity;
use User\UserIndexRequest;
use User\UserIndexResponse;
use User\UserViewRequest;
use User\UserViewResponse;
use User\UserPostRequest;
use User\UserPostResponse;
use User\UserDeleteRequest;
use User\UserDeleteResponse;

// 创建客户端实例
$userClient = new UserClient('10.10.31.211:50051', [
    'credentials' => Grpc\ChannelCredentials::createInsecure()
]);


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

// 发送请求 返回的是一个数组 [服务接口对应的响应对象, 请求状态对象]
list($userIndexResponse, $statusObj) = $userClient->UserIndex($userIndexRequest)->wait();

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

echo printf("index request end: err %d msg %s" . PHP_EOL, $userIndexResponse->getErr(), $userIndexResponse->getMsg());
/* @var [UserEntity, UserEntity] */
$data = $userIndexResponse->getData();
foreach ($data as $row) {
    echo $row->getName(), $row->getAge() . PHP_EOL;
}

// 剩余的就不写了 都很简单的
// $userClient->UserView();
// $userClient->UserPost();
// $userClient->UserDelete();

Go 服务端和客户端版


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Netty实战

Netty实战

诺曼·毛瑞尔(Norman Maurer)、马文·艾伦·沃尔夫泰尔(Marvin Allen Wolfthal) / 何品 / 人民邮电出版社 / 2017-5-1 / 69.00

编辑推荐 - Netty之父”Trustin Lee作序推荐 - 阿里巴巴中间件高级技术专家为本书中文版作序推荐 - 系统而详细地介绍了Netty的各个方面并附带了即用型的优质示例 - 附带行业一线公司的案例研究 - 极实用的Netty技术书 无论是构建高性能的Web、游戏服务器、推送系统、RPC框架、消息中间件还是分布式大数据处理引擎,都离不开Nett......一起来看看 《Netty实战》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具