google protobuf_Protobuf 小试牛刀

本文以PHP为例。

环境:

  • CentOS 6.8
  • proto 3.8
  • PHP 7.1.12
  • PHP protobuf扩展 3.8.0
  • go1.12.5 linux/amd64

本文示例仓库地址: https://github.com/52fhy/protobuf-sample

是什么

Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。

官方文档:https://github.com/protocolbuffers/protobuf

作为数据交换协议,常见的还有JSON、XML。相比JSON,Protobuf有更高的转化效率。一般JSON用于HTTP接口,Protobuf用于RPC比较多。以gRPC为例,默认就是使用Protobuf。

我们可以使用Protobuf:

  • 作为RPC的序列化数据结构的协议。类似于JSON
  • 定义proto文件,一键生成多语言代码。

安装

安装清单一览:

  • protoc
  • 各编程语言对应的protobuf库

安装protoc

为了将proto文件转成编程语言代码,需要安装编译工具。

地址:https://github.com/protocolbuffers/protobuf/releases/

Copywget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protoc-3.8.0-linux-x86_64.zipunzip protoc-3.8.0-linux-x86_64.zipcp bin/protoc /usr/bin/cp -r include/google /usr/include/

注:最后一行是为了将proto的一些库复制到系统,例如google/protobuf/any.proto,如果不复制,编译如果用了里面的库例如Any,会提示:protobuf google.protobuf.Any not found 。

然后命令行输入 protoc可以查看帮助。

假设有一个 .proto格式的文件,需要编译成其它语言代码,以PHP为例则是:

Copymkdir phpprotoc --php_out=php *.proto

其中--php_out=php表示编译成PHP代码,放在php目录。protof还支持:

Copy$ protoc | grep "=OUT_DIR" --cpp_out=OUT_DIR Generate C++ header and source. --csharp_out=OUT_DIR Generate C# source file. --java_out=OUT_DIR Generate Java source file. --js_out=OUT_DIR Generate JavaScript source. --objc_out=OUT_DIR Generate Objective C header and source. --php_out=OUT_DIR Generate PHP source file. --python_out=OUT_DIR Generate Python source file. --ruby_out=OUT_DIR Generate Ruby source file.

后面有示例说明。

golang 代码编译支持

protoc --help 并没有--go_out参数说明, 如需编译golang目标代码,请执行以下步骤:

1、安装golang环境:yum install golang,其它系统查看 https://studygolang.com/dl (已安装请跳过)

2、go get github.com/golang/protobuf/protoc-gen-go;

3、复制扩展工具到/usr/bin:

Copycp `go env|grep 'GOPATH'|sed -e 's/GOPATH="//' -e 's/"//'`/bin/protoc-gen-go /usr/bin/

4、编译go目标代码: protoc --go_out=./go *.proto。

PHP扩展安装

php可以安装c扩展版本或者纯php代码版本。

C扩展版本

1、下载扩展源码:

Copywget https://pecl.php.net/get/protobuf-3.8.0.tgztar zxf protobuf-3.8.0.tgzcd protobuf-3.8.0phpize./configuremakesudo make install

或者直接使用 pecl 安装:

Copypecl install protobuf-3.8.0

2、 输入 php -i|grep php.ini 查看php.ini的路,修改php.ini, 增加:

Copyextension=protobuf.so

3、检查是否安装成功:php --ri protobuf,安装成功会显示版本号。

纯PHP版本

使用 composer 安装即可:

Copycomposer require google/protobuf

下面说一下区别和注意事项:

1、截止到3.8.0版本,如果安装的是纯PHP版本,protobuf 里提供的序列化方法serializeToJsonString()不支持参数,c扩展版本支持,表示保留proto里定义的属性,不进行转大写;

2、c扩展版本无法使用var_dump等函数打印出protobuf对象里的对象的结构和内容,但是如果protobuf对象里的标量类型是可以打印出来的。

Go扩展库安装

golang如果使用protobuf,需要引入google.golang.org/grpc库。使用 go mod管理,可以编写规则做个映射:

Copyreplace google.golang.org/grpc => github.com/grpc/grpc-go v1.21.1

应用:protobuf创建Model

有时候我们需要根据数据库表结构生成一个Model,常规办法是手写,比较麻烦。有了protobuf,我们可以先编写一个proto 文件,然后编译成目标语言的代码。

定义proto

我们先定义一个 proto 文件:

Copy// proto/User.protosyntax = "proto3";package Sample.Model; //namesapcemessage User { int64 id = 1; //主键id string name = 2; //用户名 string avatar = 3; //头像 string address = 4; //地址 string mobile = 5; //手机号 map ext = 6; //扩展信息}message UserList { repeated User list = 1; //用户列表 int32 page = 2; //分页 int32 limit = 3; //分页条数}

以上分别创建了user和UserList两个Model。

编译proto

现在使用proto工具编译出来:

Copymkdir phpprotoc --php_out=php proto/User.proto

会生成:

Copy├── php│ ├── GPBMetadata│ │ └── User.php│ └── Sample│ └── Model│ ├── UserList.php│ └── User.php├── proto│ └── User.proto

UserList.php 代码部分示例:

b738d45b40e7699eabe3e048b05184fd.png

测试编译生成的代码

接下来,我们写个例子看看如何使用生成的Model。在使用之前需要处理下GPBMetadata相关的命名空间问题,这里我们定义的命名空间是SampleModel,但是 GPBMetadata/User.php以及Sample/Model/User.php的命名空间我们希望调整下,都以SampleModel开头,而不是GPBMetadata。下面我们使用命令行处理:

Copycd protobuf-sample#修改GPBMetadata命名空间cd phpmv -f GPBMetadata Sample/Model/find . -name '*.php' ! -name example.php -exec sed -i -e 's#GPBMetadata#SampleModelGPBMetadata#g' -e 's#SampleModelGPBMetadataGoogle#GPBMetadataGoogle#g' {} ;cd -

接下来我们写个测试文件:

user.php

Copy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值