gRPC和protobuff
protobuf是google的语言、平台中立,可扩展的结构数据序列化机制。你可以定义数据结构一次,然后用专门生成的代码来方便地读写结构数据,支持多种语言。
proto3版本支持go语言。
下面以一个简单的例子来演示如何使用proto3来生成Go代码。
大致分为三步
- 定义数据结构
- 使用Protobuf编译器
- 使用Go协议buffer接口读写数据
相对于其它序列化方式,protobuf可以根据.proto
格式的模板文件来生成自带高效的二进制格式的codec
方法的类,同时类利用getter和setter管理数据读写的细节,
另外重要的数据可以扩展,方便以后的更新而不影响旧有功能。
使用.proto格式来定义数据结构
在proto文件中,使用message{}来定义一个需要序列化的结构,在花括号中加上需要的数据名称和类型。
如
还有许多常见的数据类型bool, int32, float, double,bytes
如上所示,数据结构可以嵌套,也可以在Message中定义枚举类型。
field后面的 =1, =2
id是用于二进制中的唯一标识tag
。由于1-15占用字节更少,所以建议优先使用。嵌套结构中id是可以与外层复用的。如果有重复的成员,那么将需要独立的Id,这种情况下可以使用repeated field
如果成员值没有初始化,那么将被设置为默认值,这个有点像Golang的规则。
完整的proto编写手册在Protocol Buffer Language Guide 。
protobuf并不支持继承机制。
编译proto文件
首先需要安装编译器,非c++用户可以直接下载预编译版本。 https://github.com/google/protobuf/releases
1 Go语言使用cpp版的编译器。
2 go编译器,当然作为一名go语言使用者,你应该已经有了
3 go get
相关的包go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
编译器插件将被置于$GOPATH/bin
以上软件有两部分,协议编译插件
用于生成go代码,一个提供运行时支持的库,codec和存取协议buffer。
使用protobuff
1 编译.proto生成go代码 , 使用go_out来指定文件输出目录
请确保你的protoc和protoc-gen-go二进制文件都在环境PATH之下
生成带方法的结构GRPC
使用以上命令生成的代码是不包含自定义方法的。要使用更多的参数,—go_output=k1=v1,k2=v2
如protoc --go_out=plugins=grpc,import_path=mypackage:. *.proto
import_prefix=xxx
xxx会加在所有import包的前面,比如xxx/github.com/xx/xxx
import_path=foo/bar
包名plugins=plugin1+plugin2
插件,https://github.com/golang/protobuf
中只有 grpc
这个插件Mfoo/bar.proto=quux/shme
声明foo/bar.proto
与packagequux/shme
关联,服从于import_prefix
参数
gRPC支持
如果proto文件指定了RPC服务,通常使用以下方式,将其加在—go_out参数中
总结
最终个人使用的命令如下(/ssd/GOPATH/bin/protoc-gen-go不在PATH中)