Contents
  1. 1. 使用.proto格式来定义数据结构
  2. 2. 编译proto文件
  3. 3. 使用protobuff
  4. 4. 生成带方法的结构GRPC
  5. 5. gRPC支持
  6. 6. 总结

protobuf是google的语言、平台中立,可扩展的结构数据序列化机制。你可以定义数据结构一次,然后用专门生成的代码来方便地读写结构数据,支持多种语言。

proto3版本支持go语言。

下面以一个简单的例子来演示如何使用proto3来生成Go代码。

大致分为三步

  1. 定义数据结构
  2. 使用Protobuf编译器
  3. 使用Go协议buffer接口读写数据

相对于其它序列化方式,protobuf可以根据.proto格式的模板文件来生成自带高效的二进制格式的codec方法的类,同时类利用getter和setter管理数据读写的细节,
另外重要的数据可以扩展,方便以后的更新而不影响旧有功能。

使用.proto格式来定义数据结构

在proto文件中,使用message{}来定义一个需要序列化的结构,在花括号中加上需要的数据名称和类型。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
message Person {
string name = 1;
int32 id = 2; // Unique ID number for this person.
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
// Our address book file is just one of these.
message AddressBook {
repeated Person people = 1;
}

还有许多常见的数据类型bool, int32, float, double,bytes

如上所示,数据结构可以嵌套,也可以在Message中定义枚举类型。

field后面的 =1, =2id是用于二进制中的唯一标识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来指定文件输出目录

1
protoc --go_out=. *.proto

请确保你的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参数中

1
protoc --go_out=plugins=grpc:. *.proto

总结

最终个人使用的命令如下(/ssd/GOPATH/bin/protoc-gen-go不在PATH中)

1
2
3
export PATH=$PATH:/ssd/GOPATH/bin
protoc --go_out=import_path=common,plugins=grpc:/tmp/grpc -I=/ssd/GOPATH/src/baishancloud.com/wow/host_data/ /ssd/GOPATH/src/baishancloud.com/wow/host_data/hostdata.proto

Contents
  1. 1. 使用.proto格式来定义数据结构
  2. 2. 编译proto文件
  3. 3. 使用protobuff
  4. 4. 生成带方法的结构GRPC
  5. 5. gRPC支持
  6. 6. 总结