目录

Protobuf简介

1. 什么是Protocol Buffers

Protocol Buffers 是一种序列化数据结构的协议,和XML,Json差不多都一种公共的数据交换协议或格式,与语言和平台无关。XMLJson是基于文本格式,而ProtoBuf 是基于二进制格式,因此ProtoBufXML,Json相比体积更小,速度更快

2. ProtoBuf编译器

2.1 Protoc安装

要在java、go等编程语言中使用ProtoBuf,需要将ProtoBuf文件编译成对应的代码,这里用到的编译器叫protoc,从Protobuf Releases下载对应版本安装并添加到环境变量,可通过如下方式测试安装是否成功

1
2
protoc --version
libprotoc 3.14.0-rc3
2.2 生成对应代码

使用protocproto文件编译成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 入门教程