MacOS搭建Laravel grpc client客户端
官方链接
官网:grpc
官网php客户端:php-clent-grpc
PHP环境
安装grpc扩展,通过pecl或自行编译安装
pecl install grpc
Grpc环境
安装protobuf protoc3
brew 安装
brew install protobuf
grpc源码编译安装
需要 cmake
brew install cmake
git clone https://github.com/grpc/grpc
# 克隆源码后进入目录
cd grpc
# 下载子模块
git submodule update --init --recursive
mkdir -p cmake/build
cd cmake/build
# 编译 protoc 与 grpc_php_olugin makefile 文件
cmake ../..
# 编译 makefile文件 生成可执行文件
make
sudo make install
在git submodule update --init --recursive下载子模块的时候,有会出现超时失败等原因 解决办法: git submodule update失败解决办法
接上一步操作,此时还在 cmake/build 文件夹下,此时可以一起安装grpc_php_plugin插件。
make protoc grpc_php_plugin
安装grpc_php_plugin插件
grpc源码编译安装已经可以同时安装grpc_php_plugin
如通过brew安装protobuf,会附带protoc执行文件,还需另外安装grpc_php_plugin插件,安装方法同上grpc源码编译安装
只需要make grpc_php_plugin就可以了
make grpc_php_plugin
到此grpc环境已经搭好
安装grpc 相关php扩展
进入Laravel项目目录
composer require google/protobuf
composer require grpc/grpc
生成grpc php 代码
在Laravel项目根目录创建protobuf目录结构
protobuf
protobuf/compile
protobuf/protos
在protobuf/protos目录创建proto文件
GrpcDemo.proto
文件内容:
syntax = "proto3";
package GrpcDemo;
service hi {
rpc sayHello (HiUser) returns (HiReply) {}
}
message HiUser {
string name = 1;
int32 sex = 2;
}
message HiReply {
string message = 1;
HiUser user = 2;
}
使用protoc 与 grpc_php_plugin 生成客户端代码
# 在Laravel框架根目录下执行
# --php_out php代码输出路径,里面包含request,response,client代码
# --grpc_out GPBMetadata输出路径,用于保存.proto的二进制元数据
# --plugin 生成代码插件的类型与插件的绝对路径路径
protoc --php_out=protobuf/compile --grpc_out=generate_server:protobuf/compile --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin protobuf/protos/GrpcDemo.proto
注意: --grpc_out=generate_server:protobuf/compile 亲试必须加入generate_server:才会生成Client类。
可以把grpc_php_plugin复制到项目目录便于使用
cp /usr/local/bin/grpc_php_plugin 项目目录/protobuf/
对应生成代码命令
protoc --php_out=protobuf/compile --grpc_out=generate_server:protobuf/compile --plugin=protoc-gen-grpc=protobuf/grpc_php_plugin protobuf/protos/GrpcDemo.proto
生成后文件目录
配置自动加载
composer.json autoload 模块
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/",
"GPBMetadata\\Protobuf\\Protos\\": "protobuf/compile/GPBMetadata/Protobuf/Protos",
"": "protobuf/compile"
}
}
根目录执行自动加载
composer dump-autoload
测试调用方法
<?php
namespace App\Http\Controllers;
use GrpcDemo\hiClient;
use GrpcDemo\HiUser;
class AppController extends Controller
{
public function testGrpc(){
$grpcClient = new hiClient("127.0.0.1:9503",[
'credentials' => null,
]);
$request = new HiUser();
$request->setName('hyperf');
$request->setSex(1);
list($reply,$status) = $grpcClient->sayHello($request)->wait();
$message = $reply->getMessage();
$user = $reply->getUser();
var_dump($message);
var_dump($status);
var_dump(memory_get_usage(true));
return $message;
}
}
配置路由测试,grpc服务自行搭建,可参考hyperf
代码示例
Laravel grpc client demo
Grpc客户端
GitHub:laravel-grpc-client-demo
Gitee:laravel-grpc-client-demo
Hyper grpc server demo
Grpc服务端
GitHub:hyperf-grpc-server-demo
Gitee:hyperf-grpc-server-demo