java/php + protobuf 使用总结

匿名 (未验证) 提交于 2019-12-02 22:11:45

在对接tron的项目时使用到了protobuf,在阅读官方文档的时候,发现有些地方文档写得并不清楚,于是记录如下的笔记作为补充备查。


关于Protobuf的使用[php]

  1. 查看protobuf官方文档,安装php扩展grpc.so和protobuf.so。前者在文档里有讲清楚,后者需要单独去搜索下载扩展安装包安装。
  2. 需要按文档编译安装 protoc和grpc_php_plugin,后续需要使用到;
  3. .proto文件在tron的github库的单独项目里,名为protocal。使用protobuf php版的官方指引里的方法,生成对应的php文件。一共有两个目录,一个是core,一个是apicore目录可以顺利生成api需要下载安装官方的东西,在install-googleapis.sh这个文件里有写,其中go的部分暂时没用到,直接执行下面获取jar包的部分就可以
  4. 还有一个名为install-protobuf.sh的文件,这里是安装一些依赖的proto文件。因为有些proto文件会引用一些标准的proto文件Make install之后,需要把安装位置的protobuf目录复制到protocol项目目录的google目录下,然后按下面的命令生成php文件。不能直接引用前面make install的位置,会因为命名空间的问题在导致项目中无法使用。
  5. 使用

protoc --proto_path=./ --php_out=./ --grpc_out=./ --plugin=protoc-gen-grpc=./../../bins/opt/grpc_php_plugin PATH/xxx.proto

这样的命令来将.proto文件生成对应的类。会生成两个目录,一个是Protocal,一个是GPBMetadata,这两个文件都需要引入rpc请求客户端项目中

注意需要检查一下protocol项目中.proto文件里有import标准.proto文件的句子,比如引用google的标准库里的proto。对于这些proto,需要单独再执行一次protoc,生成相应的类。不然在运行时,会出现类找不到的问题。

protoc--proto_path=./ --php_out=./ --grpc_out=./--plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugingoogle/api/annotations.proto

protoc--proto_path=./ --php_out=./ --grpc_out=./--plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin google/api/http.proto

protoc --proto_path=./ --php_out=./ --grpc_out=./--plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin google/protobuf/any.proto

  1. 在引用的时候,可能要根据自己的项目,需要单独写一个load规则,来加载通过上面步骤生成的文件。
  1. 注意在生成Protocol与GPBMetadata目录里的php文件之外,在使用google的内建proto时,会在google目录里对应的目录里也生成一些php文件,需要把这些php文件,使用相应的命名空间,引用到项目中。比如,在生成http.php文件时,就会在google/api目录下也生成一个http.php。这两个文件是不同的,需要分别引用。

如果是使用java

如果是使用java,按官方文档描述,说不需要指定--plugin这个参数,只要指定--java_out就可以在目录里生成相应的类文件。其它跟php类似实际上这里是没写清楚。

protoc-I=./ --java_out=./java/ google/protobuf/any.proto

实际使用的时候发现缺少客户端类,查博客发现需要单独编译一个plugin出来

https://github.com/grpc/grpc-java/blob/master/COMPILING.md

会在compiler/build/exe/java_plugin目录下生成protoc-gen-grpc-java

protoc--plugin=protoc-gen-grpc-java=/YOUR_PATH/grpc-java/compiler/build/exe/java_plugin/pi.proto

执行上面的命令,会在java的对应目录下生成一些xxxGrpc.java文件

使用的时候,生成的xxxGrpc.java文件依赖io.grpc包,从Maven里可以找到。旧版本不可以,这里对3.5.1的protoc,使用io.grpc的1.12.0版本是可以的

有些文档说可以在IDE里通过配置maven的配置文件plugin来自动生成所需的java类。实测了一下并不成功,可能是有些步骤没考虑到,实际使用的时候不建议使用这个方法

运行时有可能会报MethodNotFoundException,这个是由于默认加载的guava版本太低(13.0),修改maven显式引入更高的版本(25-jre)ok了






易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!