热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gRPCproto3语法指南

本文将描述如何使用protocolbuffer语言构造你的protocolbuffer数据,包括.proto文件语法规则,以及如何由.proto文件生成数据访问类。本文涵盖了proto3版

本文将描述如何使用protocol buffer 语言构造你的protocol buffer数据,包括.proto文件语法规则,以及如何由.proto文件生成数据访问类。本文涵盖了proto3版本的协议语言:想了解proto2的语法,查看 Proto2 语言指南.

这是一个参考指南——给出了一步一步的操作的示例,示例使用了本文中描述的很多特性,这里有适合你所选语言的教程:

定义一个消息类型

首先让我们来看一个非常简单的例子。假定我们有这样的需求,我们要定义一个搜索请求消息,每个消息都包含一个查询字符串,和你感兴趣的特定页面编号,以及每个页面的命中个数。

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}
  1. 文件的第一行指定了你使用的是proto3的语法:如果你不指定,protocol buffer 编译器就会认为你使用的是proto2的语法。这个语句必须出现在.proto文件的非空非注释的第一行。
  2. 我们看到,搜索请求消息结构中定义指定了三个字段(name/value pairs)。每个字段都有一个名称和类型。

指定字段类型

在上述例子中,所有的字段都是值类型:两个整形(page_number and result_per_page) 和一个字符串 (query)。然而,你也可以指定你的字段的组合类型,包括枚举和其他消息类型。

分配标识——tag

如你所见,消息中的每个字段都有一个唯一的数字标识。这些标识用来在消息的二进制格式中识别你的字段,并且,一旦你的消息投入使用,这些标识就不应该再被修改。

注意,标识是由1到15使用一个字节来编码,包括标识数字和字段类型(你可以在Protocol Buffer 编码中查看更多详细)。

标识16到2047占用两个字节。所以你应该保留1到15,用作出现最频繁的消息类型的标识。记得为将来会继续增加并可能频繁出现的元素留一点儿标识区间,也就是说,不要一下子把1—15全部用完,为将来留一点儿哦。

你可以指定的最小的标识数字是1,最大是228,或者536,870,911。你也不能使用19000 到 19999之间的数字(FieldDescriptor::kFirstReservedNumber through FieldDescriptor::kLastReservedNumber),因为它们被Protocol Buffers保留使用——如果你在自己的.proto文件中使用了一个保留数字,protocol buffer 编译器将会提示。同样的,你不能使用任何之前保留的标识。

指定字段规则

消息字段可以是下边中的一种:

  1. singular(单个): 符合语法规则的消息包含零个或者一个这样的字段(最多一个)。

  2. repeated(重复): 一个字段在合法的消息中可以重复出现一定次数(包括零次)。重复出现的值的次序将被保留。在proto3中,重复出现的值类型字段默认采用压缩编码。你可以在这里找到更多关于压缩编码的东西: Protocol Buffer Encoding。

添加更多消息类型

多个消息类型可以定义在一个.proto文件中。这个在你定义多个关联的消息的时候非常有用,——这样,举个例子吧,如果你想定义你的搜索消息类型的响应消息格式,你可以在同一个.proto文件中添加如下的内容:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

message SearchResponse {
 ...
}

添加注释

在你的 .proto 文件中添加注释, 使用C/C++-风格的 // 语法,像下边这样:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;  // Which page number do we want?
  int32 result_per_page = 3;  // Number of results to return per page.
}

保留字段

如果你通过删除整个字段更新了消息类型,或者将整个字段其注释掉,未来用户在编写新的类型的时候能够复用这些注释掉的标识数字。然而,这会引起一些严重的问题,如果他们后来加载了同一个.proto的旧版,包括数据损坏,安全隐私bug等等。一个确保这种问题不会发生的办法是,保留你要删除的字段的标识。Protocol buffer 编译器将会提示以后用户使用这些保留的字段标识。

message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

注意,你不要混淆同一个保留语句中的字段名称和标识。

你的.proto编译之后会生成什么?

当你运行对一个.proto文件的编译之后,编译器会为你选择的语言生成代码。你在文件中描述的消息类型,包括获取和设置字段的值,序列化你的消息到一个输出流,以及从一个输入流中转换出你的消息。

  1. 对于C++,编译器会为每个.proto文件生成一个.h 和一个.cc的文件,为每一个给出的消息类型生成一个类。
  2. 对于Java,编译器会生成一个java文件,其中为每一个消息类型生成一个类,还有特殊的用来创建这些消息类实例的Builder类,
  3. Python有一点小不同——Python编译器生成一个模块儿,其中为每一个消息类型生成一个静态的描述器,在运行时,和一个metaclass一起使用来创建必要的Python数据访问类。
  4. 对于Go,编译器为每个消息类型生成一个.pb.go文件。
    ……

值类型

值类型的消息字段可以是一下类型中的一种——这个表格展示了可以在.proto文件中使用的类型,以及自动生成的相应语言的类型:

.proto Type 说明 C++ Type Java Type Python Type[2] Go Type
double double double float float64
float float float float float32
int32 使用可变长度编码。对负数进行编码时比较低效 – 如果你的字段要使用负数值,请使用sint32来代替。 int32 int int int
int64 使用可变长度编码。对负数进行编码时比较低效 – 如果你的字段要使用负数值,请使用sint64来代替。 int64 long int/long[3] int64
uint32 使用可变长度编码 uint32 int[1] int/long[3] uint32
uint64 使用可变长度编码 uint64 long[1] int/long[3] uint64

推荐阅读
  • 互联网世界 9 种基本的商业模式
    互联网世界9种基本的商业模式一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获 ... [详细]
  • 文章目录前言必知必会的软件服务器分类机架式服务器塔式服务器刀片式服务器三者的区别虚拟服务器(云服务器)服务器的硬件组成服务器常见的品牌前言本文是循序渐进学linux的第一课,为 ... [详细]
  • 如果您想到达任何地方,就一定不要害怕探索。我的背景我在2001年只有4岁。那是我第一次使用计算机“联机”的时候。从一开始我就一直是一个好奇的孩子。我知道如何建立拨号连 ... [详细]
  • 一、域名解析记录说明记录类型A:用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP ... [详细]
  • 1、Everything:速度最快最好用的文件搜索工具,可以基于文件名极速搜索、瞬间定位文件,所有匹配的文件或文件夹都会实时显示,Windows7之后为减少硬盘占用,在关闭索引功能后不能得到“即搜既 ... [详细]
  • 写在前面:说起来我是个地地道道的老网民了,最早的时候家里就只有一台无线路由器,最高传输速率也就只有54Mbps,而这些年随着网速的不断提升和宽带资费的不断下降,我也终于做坐上了网速达到的100M ... [详细]
  • apk简单介绍APK的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法?默认支持的数据类型包括什么是apk打包流程 ... [详细]
  • PyQt 如何创建自定义QWidget
    这篇文章主要介绍了PyQt如何创建自定义QWidget,帮助大家更好的理解和学习使用pyqt,感 ... [详细]
  • 开发笔记:深度探索!Android之OkHttp网络架构源码解析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了深度探索!Android之OkHttp网络架构源码解析相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 步骤一:明确主打的核心目标用户群(对应产品侧的定位)这个核心目标用户群体是该产品成功挤进市场的切入点,甚至是撬动市场的支点和撬杠。市面上几乎很少有产品是专门给一个群体用而对其他群体 ... [详细]
  • 数据结构之图的深度优先搜索,Go语言社区,Golang程序员人脉社 ... [详细]
  • 先去官网下载Linux的压缩包$cd~$tarxJfMybase-Desktop-Ver820b7-Linux-amd64.tar.xz$cd.Mybase8$.Mybas ... [详细]
  • 终端系统服务器部署一、安装IIS依次单击“开始”菜单—控制面板—添加和删除程序—添加和删除windows组件,出现窗口如下图a所示,将“应用程序服 ... [详细]
  • centos卸载不必要的程序_在 Linux 中移除从源代码安装的程序的一种简单的方法...
    不是所有的程序都可以在官方或者第三方库中找到,因此你不能使用常规的包管理来安装它们。有时你不得不从源代码中手动构建这些程序。就如你已经知道的一样,当你从 ... [详细]
  • [网页设计]新手做 网站 必备 软件。及 下载 地址~~~~(06年10月10日修订)
      1、做网站先要从策划开始msvcp71dll下载。  MicrosoftOffice2007Beta2简体中文版  M ... [详细]
author-avatar
Jump_jiedB0_666
这个家伙很懒,什么也没留下!
RankList | 热门文章