protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于通信协议、数据存储等。

protocol buffers 是什么?

protocol buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏根据旧数据结构编译而成并且已部署的程序。(官方网址Protocol Buffers)

为什么要使用Protobuf

2608075-1e8b5b166e9d9fee.png

它是如何工作的?

你可以通过在 .proto 文件中定义 protocol buffer message 类型,来指定你想如何对序列化信息进行结构化。每一个 protocol buffer message 是一个信息的小逻辑记录,包含了一系列的 name-value 对。这里有一个非常基础的 .proto 文件样例,它定义了一个包含 "book" 相关信息的 message:

message BookInfoReq {
    string bookId = 1;
}

message BookInfoResp {
    BookInfo book = 1;
    repeated Volume volume = 2;
}

message Volume {
    int64 volumeId = 1;
    repeated Chapters chapters = 2;
    string VolumeName = 3;
    int64 VolumeSerialNumber = 4;
    int64 VolumeOrderNumber = 5;
}

message Chapters {
    int64 ChapterId = 1;
    string ChapterName = 2;
    int64 ChapterSerialNumber = 3;
    int64 ChapterOrderNumber = 4;
    int64 ChapterPublishedTime = 5;
    int64 ChapterLastUpdateTime = 6;
    int64 ChapterNeedPay = 7;
    int64 ChapterWordCount = 8;
}

如你所见,message 格式很简单 - 每种 message 类型都有一个或多个具有唯一编号的字段,每个字段都有一个名称和一个值类型,其中值类型可以是数字(整数或浮点数),布尔值,字符串,原始字节,甚至(如上例所示)其它 protocol buffer message 类型,这意味着允许你分层次地构建数据。你可以指定 optional 字段,required 字段和 repeated 字段。 你可以在 Protocol Buffer 语言指南 中找到有关编写 .proto 文件的更多信息。

当然 protobuf支持更多的类型,比如 bool,double,float,枚举,更多类型可查看官方文档

定义一个Service

如果要将消息类型与RPC(远程过程调用)系统一起使用,则可以在.proto文件中定义RPC服务接口,协议缓冲区编译器将使用你选择的语言生成服务接口代码和存根。例如,如果要使用带有BookInfoReq和返回定义RPC服务BookInfoResp,可以.proto按如下方式在文件中定义它:

service Book {
    rpc GetBookInfo (BookInfoReq) returns (BookInfoResp) {
    }
}

编译生成对应的文件

要生成你需要在定义的消息类型的工作使用go代码.proto文件,你需要运行协议缓冲编译器protoc.proto。如果尚未安装编译器,请下载该软件包并按照自述文件中的说明进行操作。对于Go,您还需要为编译器安装一个特殊的代码生成器插件:您可以在GitHub上的golang/protobuf仓库中找到这个和安装说明。

协议编译器的调用如下:
官方链接

protoc --proto_path = IMPORT_PATH --go_out = DST_DIR  path/to/file.proto
  • IMPORT_PATH指定.proto解析import指令时在其中查找文件的目录。如果省略,则使用当前目录。可以通过--proto_path多次传递选项来指定多个导入目录; 他们将按顺序搜索。 可以用作简短的形式。 -I=IMPORT_PATH--proto_path
  • --go_out生成Go代码DST_DIR。有关更多信息,请参阅Go生成代码参考。

参考链接:

protocol-buffers/

文章目录