2 了解 Protobuf
protobuf,全称 protocol buffers,google开发的一种序列化结构。
Protobuf是一种灵活、高效、自动化的序列化机制,与语言无关,平台无关,用于通信协议,数据存储等。
目前,Protobuf 已发展到第3版,又称为proto3,相对proto2添加了一些新功能,简化了protocol buffer语言,既易于使用,又可以在更广泛的编程语言中使用。
Protobuf自成体系,不与任何特定编程语言绑定,拥有对各种语言特性的描述。正是通过这些描述,实现对多语言支持。
要使用Protobuf,你需要先创建一个.proto文件,在其中定义protocol buffer消息类型,指定你希望构建的序列化信息。
下面是一个.proto文件的一个简单例子:
syntax = "proto3";
option java_package = "com.java.grpc.geral";
option java_outer_classname = "messages";
message Messages {
int32 id = 1;
int64 code = 2;
string texts = 3;
}
代码2.1 定义一个protobuf
可以看到,我们使用protobuf定义了一条 Messages 消息。
我们使用了proto3。关于protobuf的版本信息,必须写在 .proto 文件第一条。
Protobuf 拥有自己的消息类型,例如int32、int64、string。也就是之前说的 Protobuf 对各种语言特性的描述。Protobuf 对应不同的语言都有相应的类型转换规则,通过 Protobuf 各语言的编译器生成编译语言时,自动完成消息类型转换。
下面是与Java语言对应的一些常用的protobuf消息类型:
.protobuf |
java |
---|---|
int32 |
int |
int64 |
long |
bool |
boolean |
string |
String |
bytes |
ByteString |
我们看到,消息格式定义很简单——从右向左看,每个字段都有一个名称和一个消息类型;从左向右看,每种消息类型都有一个或多个唯一编号的字段,这些字段用于消息标识序列化位置。Protobuf是一种二进制序列化机制。你可以指定可选字段、必填字段和重复字段。
定义好了.proto文件,你就可以运行应用程序语言的protocol buffer编译器来生成程序语言数据访问类。它们为每个字段提供了简单的访问器(如name() 和set_name()),以及将整个结构序列化/解析为原始字节的方法。
很明显,在我们定义的.proto文件中,使用 protocol buffer java编译器最为合适。关于protocol buffer编译器的使用,我们可以查看protocol buffer 官网或者 gRPC 官网项目。我们在.proto文件中指定了java的一些选项,如果使用其他语言的protocol buffer编译器,则这些选项将被忽略。
生成程序语言数据访问类后,就可以在应用程序中使用此类来填充、序列化和检索Messages消息了。
我们可以写一些这样的代码:
…………
Messages message = Messages.newBuilder()
.setId(1)
.setCode(200)
.setTexts("protobut")
.build();
message.getId();
message.getCode();
message.getTexts();
…………
代码2.2 使用protobuf数据访问类填充、检索数据
正是基于Protobuf的灵活、高效和语言无关、平台无关特性,所以 gRPC 选择使用 Protobuf 来定义服务接口及通信协议,继而实现对多语言的支持。
接下来,我们就来开始使用 Protobuf 定义一个 gRPC 服务接口。