2 了解 Protobuf

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 服务接口。

目录