php(客户端)/golang(客户端) 使用grpc,protobuf调用 golang(服务端)应用可参考此处
1.go get github.com/golang/protobuf/proto
2.go get google.golang.org/grpc(无法使用,用如下命令代替)
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
cd $GOPATH/src/
go install google.golang.org/grpc
2.go get github.com/golang/protobuf/protoc-gen-go (protoc生成关于grpc的go文件的插件)
上面安装好后,会在GOPATH/bin下生成protoc-gen-go.exe
3.但还需要一个protoc.exe,windows平台编译受限,很难自己手动编译,直接去网站下载一个,地址:
https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0(将proto文件生成为对应语言文件的编译器,
根据自己系统下载对应的版本),同样放在GOPATH/bin下
有两种安装grpc扩展的方法。
···1.1通过 pecl安装
···1.2.编译安装
pecl install grpc
或特定版本
pecl install grpc-1.30.0
请确保您的gcc版本满足此处指定的最低要求
在Windows上安装
您可以grpc.dll从PECL网站下载预编译的扩展 。
获取编译安装的地址。
cd /usr/local/src
wget https://pecl.php.net/get/grpc-1.36.0.tgz
tar -zxvf grpc-1.36.0.tgz
cd grpc-1.36.0
phpize
./configure --with-php-config=/usr/bin/php-config (php-config路径)
make
make install
这将编译该grpc扩展并将其安装到标准PHP扩展目录中。您应该能够在安装扩展的情况下运行单元测试grpc
安装grpc扩展程序后,请确保php.ini根据您的PHP安装位置将此行添加到 文件中,以启用 grpc扩展程序。
extension=grpc.so
除grpc扩展程序外,您还需要安装grpc/grpc composer软件包。将此添加到您的项目的composer.json文件。
"require": {
"grpc/grpc": "~1.30.0"
}
或
composer require grpc/grpc
要使用.proto文件中生成的存根代码运行测试,您还需要composer和protoc二进制文件。您可以在下面找到如何获得这些信息
gRPC PHP开箱即用地支持 protocol buffers 。您需要具备以下条件才能开始使用:
···2.1.protoc:protobuf编译器二进制文件,用于为您的消息和服务定义生成PHP类。
···2.2.grpc_php_plugin:用于protoc生成服务存根类的插件。
···3.3.protobuf.so:protobuf扩展运行时库。
如果尚未安装,则需要protoc为当前gRPC版本安装protobuf编译器 3.5.0+版本(越新越好)。如果已经安装,请使protobuf版本与您安装的grpc版本兼容。如果从源创建grpc.so,则可以检查package.xml文件中的grpc版本。
下表列出了grpc和protobuf版本之间的兼容性:
grpc | protobuf | grpc | protobuf | grpc | protobuf |
---|---|---|---|---|---|
v1.0.0 | 3.0.0(GA) | v1.12.0 | 3.5.2 | v1.22.0 | 3.8.0 |
v1.0.1 | 3.0.2 | v1.13.1 | 3.5.2 | v1.23.1 | 3.8.0 |
v1.1.0 | 3.1.0 | v1.14.2 | 3.5.2 | v1.24.0 | 3.8.0 |
v1.2.0 | 3.2.0 | v1.15.1 | 3.6.1 | v1.25.0 | 3.8.0 |
v1.2.0 | 3.2.0 | v1.16.1 | 3.6.1 | v1.26.0 | 3.8.0 |
v1.3.4 | 3.3.0 | v1.17.2 | 3.6.1 | v1.27.3 | 3.11.2 |
v1.3.5 | 3.2.0 | v1.18.0 | 3.6.1 | v1.28.1 | 3.11.2 |
v1.4.0 | 3.3.0 | v1.19.1 | 3.6.1 | v1.29.0 | 3.11.2 |
v1.6.0 | 3.4.0 | v1.20.1 | 3.7.0 | v1.30.0 | 3.12.2 |
v1.8.0 | 3.5.0 | v1.21.3 | 3.7.0 |
如果protoc尚未安装,则可以protoc从协议缓冲区Github存储库下载二进制文件 。然后解压缩该文件并更新环境变量PATH以包含协议二进制文件的路径。
切换至任意一个目录下就可以
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.6/protoc-3.15.6-linux-x86_64.zip
unzip protoc-3.15.6-linux-x86_64.zip
ls //该目录下会增加包和文件夹 bin包 include包 readme.txt
cp bin/protoc /usr/local/bin //将bin包下的protoc复制到/usr/local/bin下
protoc --version //查看版本
插件可能会使用新的protobuf版本的新功能,因此也请确保安装的protobuf版本与您构建此插件的grpc版本兼容
获取编译安装的地址。
cd /usr/local/src
wget https://pecl.php.net/get/protobuf-3.15.6.tgz
tar -zxvf protobuf-3.15.6.tgz
cd protobuf-3.15.6
phpize
./configure --with-php-config=/usr/bin/php-config (php-config路径)
make
make install
extension=protobuf.so
将此添加到您的 composer.json文件:
"require": {
"google/protobuf": "~v3.12.2"
}
或
composer require google/protobuf
您需要grpc_php_plugin生成PHP客户端存根类。该插件与主protoc二进制文件一起使用,以生成可以导入到项目中的类。
您可以grpc_php_plugin使用cmake以下命令进行构建:
RELEASE_TAG_HERE 用相应的版本替代如 v1.36.4 查看版本
# 下载 grpc 的库到本地
git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc
cd grpc
git submodule update --init
当报错fatal,可先输入git init,在输入git submodule update,再执行上面的操作 git submodule update --init
mkdir -p cmake/build
cd cmake/build
cmake ../..
当提示 cmake: command not found可执行 yum install cmake 或apk add cmake 或 apt-get install cmake,再执行上面的操作 cmake ../..
# 这里我们只编译 php 的插件 如果要编译所有的 make && make install
make protoc grpc_php_plugin
最终插件的路径:/usr/local/src/grpc/cmake/build/grpc_php_plugin 可以通过find / -name grpc_php_plugin 查看到路径
完成上述所有操作后,现在您可以在.proto文件中定义消息和服务定义,并生成相应的PHP类,您可以使用类似于以下的命令将其导入到项目中:
protoc -I=. echo.proto --php_out=. --grpc_out=. \
--plugin=protoc-gen-grpc=
不带客户端
protoc --proto_path=./ --php_out=./ Prod.proto
生成带客户端的 (grpc_php_plugin 生成带客户端,grpc_php_plugin路径代表安装路径,以通过find / -name grpc_php_plugin 查看)
protoc --proto_path=./ --plugin=protoc-gen-grpc=/usr/local/src/grpc/cmake/build/grpc_php_plugin --php_out=./ --grpc_out=./ Prod.proto
php语言gRPC和Protobuf有关功能参考此处
在项目里面创建pdfiles目录,在此目录下创建Prod.proto文件,写入下面代码
syntax="proto3"; // 指定proto版本
package services; // 指定默认包名
// 指定golang包名
option go_package = ".;services";
message ProdRequest{
int32 prod_id=1; //传入的商品id
}
message ProdResponse{
int32 prod_stock=1; //商品库存
}
创建services目录(用于生产go文件) 与pdfiles目录同级
在pdfiles目录下执行下面命令(--go_out 输出go格式文件,services:生成的go文件所放在的目录名):
protoc --go_out=plugins=grpc:../services Prod.proto
命令行使用方法
protoc --proto_path=IMPORT_PATH --_out=DST_DIR path/to/file.proto
–proto_path=IMPORT_PATH:可以在 .proto 文件中 import 其他的 .proto 文件,proto_path 即用来指定其他 .proto 文件的查找目录。如果没有引入其他的 .proto 文件,该参数可以省略。
–_out=DST_DIR:指定生成代码的目标文件夹,例如 –go_out=. 即生成 GO 代码在当前文件夹,另外支持 cpp/java/python/ruby/objc/csharp/php 等语言