1. 什么是Protocol Buffers
Protocol Buffers
是一种序列化数据结构的协议,和XML
,Json
差不多都一种公共的数据交换协议或格式,与语言和平台无关。XML
和Json
是基于文本格式,而ProtoBuf
是基于二进制格式,因此ProtoBuf
与XML,Json
相比体积更小,速度更快
2. ProtoBuf编译器
2.1 Protoc安装
要在java、go
等编程语言中使用ProtoBuf
,需要将ProtoBuf
文件编译成对应的代码,这里用到的编译器叫protoc
,从Protobuf Releases下载对应版本安装并添加到环境变量,可通过如下方式测试安装是否成功
1
2
|
protoc --version
libprotoc 3.14.0-rc3
|
2.2 生成对应代码
使用protoc
将proto
文件编译成java
代码,第一个参数是生成的代码的路径,第二个参数是proto
文件所在的路径,将生成好的代码复制到项目中即可
1
|
protoc --java_out=./ User.proto
|
如果想生成go
代码还需要安装protoc-gen-go
1
2
3
|
go get -u github.com/golang/protobuf/protoc-gen-go
protoc --go_out=. *.proto
|
3. 定义消息
1
2
3
4
5
6
7
8
9
10
11
12
|
// 定义获取用户信息的请求消息
message GetUserInfoRequest{
int32 id = 1;//用户id
}
// 定义用户信息
message UserInfo{
int32 id = 1; // 1,2,3是标识符。在消息的二进制格式中识别各个字符,一旦使用就不能再更改
string name = 2;
string phone = 3;
string address = 4;
}
|
4. 定义服务
如果定义的消息类型是用来远程通信(rpc
)的,还需要在protobuf
文件中定义rpc
服务接口,如下所示定义了一个GetUserInfo
方法,并指定了参数和返回值
1
2
3
4
5
|
//定义UserInfo服务
service GetUserInfoService{
//获取用户信息方法
rpc GetUserInfo(GetUserInfoRequest) returns (UserInfo){};
}
|
5. 完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
syntax = "proto3";
// 定义包名
package proto;
//定义UserInfo服务
service GetUserInfoService{
//获取用户信息方法
rpc GetUserInfo(GetUserInfoRequest) returns (UserInfo){};
}
// 定义获取用户信息的请求消息
message GetUserInfoRequest{
int32 id = 1;//用户id
}
// 定义用户信息
message UserInfo{
int32 id = 1;
string name = 2;
string phone = 3;
string address = 4;
}
|
参考文档
1.Go Protobuf 简明教程
2.ProtoBuf 入门教程