gRPC 笔记(02)— Google Protocol Buffer 协议语法规则

      最后更新:2022-05-03 12:35:03 手机定位技术交流文章

      1. 简介

      Protocol Buffers这是一种轻量级和有效的数据储存格式,可用于组织数据测序,最适合数据储存或检索。RPC可在通信协议、数据储存等领域的语文相关、平台相关和综合数据表格中加以利用。

      它有以下特点:

      • 支持多种语文的多种语文,包括:C++JavaPython等;
      • (b) 电文编码后,该电文较小,易于存储和传输。
      • 解密能力相当强;
      • 支持多版本协议的前方兼容性。
      • Google开源的二进制RPC通讯协议;

      Protobuf没有限制, 因此没有头条标题。 标题通常由用户指定, 用户通常使用长度前缀来创建边界 。

      同样Protobuf也没有指定信件类型。 当服务器收到一串信件时, 它必须确定匹配类型, 然后选择编码器来读取信件。 此类型的信息也必须由信头中的用户提供 。

      二. 二. 二元文本议定书

      2.1 二进制协议

      网络协议是一套规范计算机网络数据流动的规则、标准或协议。由于计算机与网络连接,二进制协议会发生变化。JSON类似此文本文件的文本文件, 但不完全相同BSON这样的二进制数据。

      二进制协议是一个字节流, 可能包含信头, 也可能不包括信头 。header)和消息体(body信件信头的长度是固定的, 标题包含信件正文的长度。 这样就可以从数据流中提取全部二进制数据 。 以下为典型的二进制协议结构模型 :
      2
      其中,

      • Guide用于标识协议起始;
      • Length是消息体Data,连同必要的核查(为数据完整性的目的)DataCRCHeaderCRC);
      • Data中又分为命令字(CMD命令词定义在相互商定的文档中,例如登录为 0x01,注销为 0x02,等等,常规数据字段的长度是固定的。由于固定长度,多余数据减少,传输效率提高。

      优点

      • 所消耗的空间很少,没有不必要的场地。
      • 条例是直截了当和有效的。

      缺点

      • (b) 可读性和调试问题低;
      • 扩大不够,前一个版本与新字段不兼容。

      2.2 文本协议

      文本协议通常以字符串表示 。ACSII字符构成详情,包括数字、案件信函、百分比数字和回程车。r)、换行(n)以及空格等等。

      文本协议旨在帮助理解和理解,因此,在协议中通常增加特殊字符,例如以下数据,以便加以划分。

      这是一个书面的方向,我们可以看到它的眼睛 即使它没有意义。git里面的commit指令,-m随后是描述性数据的最新输入。

      然而,文本协议必须包括不必要的字符,为便于理解而分别订购,限制其传输的效率;它只适用于文本传输,因此不可能插入其他数据,如图像、乐谱等。

      优点

      • 可读性和可调试性良好;
      • (a) 扩大令人满意,新的领域可以很容易地扩大,以适应上一个版本;

      缺点

      • (a) 空间被占用,有一些多余的领域;
      • 业务条例复杂,难以理解;

      2.3 二元协议和文本协议的效力

      我们描述了文本协议和二元协议的利弊:

      • 文本协议是图形、 描述性、 易于捕捉、 简单调试。 缺点在于有更多的多余数据, 不适合传输二进制文件, 并且很难读取 。
      • 二元协议缺乏多余的字段、高效传输和快速解决,其缺点在于难以具体说明相对死亡、死亡地点和重要性,以及现场是单独和难以延伸的。

      所以:

      1. 使用有效传输的二元规程,例如传感器数据收集和密集指令的传输。
      2. 例如,如果你想简单调试的话。RPC(c) 接口电话等使用文本协议;
      3. 如果订购量较少,可采用文本方法,如即时通信软件。
      4. (a) 二元数据、自然加密和使用需要特定数据安全标准的二元协议的性质难以理解;

      3. 语法规则

      Protobuf源码已在GitHub com/protocolbuffers/protobubuf。

      com/protocol-buffers/. com/protocol-buffers/. com/protocol-buffers/。

      以下示例默认使用proto3库编写。

      Protobuf传输是密钥对的序列,如果连续按键重复,则数值为列表。repeated。图中的key3就是一个列表类型repeated
      协议格式
      key两部分组成:tagtype

      • tag

      Protobuf将正序( tag)与项目中每个字段匹配。所创建的代码确保了必要的信息。在排序过程中,用整数值取代字段名称。因此,传输通信量可以急剧减少。如果字段较少,上面写着四位数最多可容纳16个田地。如果字段数超过16,之后再添加一个字节。如果这还不够,请再加一个字节。你也许猜到了,这个tag值使用的是varint编码。 字段的长度没有理论限制, 因为varint扩展字节可容纳任何大小的任何非负整数。

      • type

      Protobuf字段类型也与正序(类型)匹配,每个原始的java类型只与一个正整数相关,使类型信息非常高效。type使用三位元表示最多支持八种。

      也许你会得出结论 八类就足够了放心,肯定够的!由于zigzag类型可以指任何整数类型,在(未签署的)长/长/无/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年/年

      Python语言的数量更加独特。它不区分整数和非整数。它甚至可能是一个大整数。这是华林的专长领域。它有能力永远增加地点的数量。这可以写成无限数的整数 。长度有限的类型可以代表字节数组、字符串和嵌套对象。此外,每个浮动和双重类型都属于一种类型。最终你看,使用的只有8种不同类型。

      • 整数

      Protobuf的整数数值使用zigzag编码。zigzag编码支持负数值,varint编码的都是非负数。

      • 浮点数

      浮点数分为floatdouble它们分别占4和6个字节。value这是正常的浮点数, 没有任何额外的处理 。

      • 字符串

      Protobuf第一个字节代表字符串的长度,而相应的长度的后继字节是字符串的内容。如果字符串大,则其长度前缀大于一个字节,可能为两个字节、三个字节或四个字节,而您本来会预计使用这一长度。varint编码。

      3.1 字段类型

      通过.proto当相关代码文件由文件汇编时,proto3以下是界定的数据结构与汇编的数据结构的比较:

      Type C++ Type Java Type Notes
      double double double
      float float float
      int32 int32 int 编码负值效率低下;如果字段可能包含负值,请使用 Sint32 。
      int64 int64 long 工作长度编码变量。 负编码无效; 如果您的字段含有负值, 请使用 Sint64 。
      uint32 int uint32
      uint64 long uint64
      sint32 int uint32 使用可变长度编码。 带有符号的整数值比标准的 It32 编码更有效 。
      sint64 long uint64 使用可变长度编码。 带有符号的整数值比标准的 int64 编码更有效 。
      fixed32 int uint32 如果值总是大于2的28倍,这种类型比昆特32更有效。
      fixed64 long uint64 如果值总是超过56倍,则这种类型比Vint64更有效,如果值总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍,总是大于56倍
      sfixed32 int int32 总是 4 个字节
      sfixed64 long int64 总是 8 个字节
      bool boolean bool
      string String string 字符串必须是已编码的 UTF-8 或 7 位 ASCII 编码的 。
      bytes ByteString string 任何字节序列都可能包括在内。

      3.2 编码规则

      • 描述文件以.proto做为文件后缀;
      • message命名使用座头名称,实地命名使用小写字母和下划线分隔符。
      • enum(a) 型号名称用骆驼峰表示,野外名称用大写字母表示,用突出线分隔。
      • servicerpc(a) 方法名称一致使用座头名称;

      3.3 注释

      单行注释

      多行注释

      3.4 默认值

      如果编码电文不包括特定单位元素,解析对象中的相应字段被设定为该字段的默认值,该字段是特定类型:

      • 字符串类型默认值为空字符串。
      • 字节类型的默认值为空字节;
      • Boolean 类型的默认值是false
      • 数值类型的默认值为零;
      • 列数的默认值是第一个宣布的数值,必须存在。0
      • 信息字段尚未设定,其准确值由语言决定。
      • 重复字段的默认值为空(通常为各自语言的空列表);

      3.5 分配标签

      信件定义中的每个字段只有一个数字标签。这些标签用于在二进制格式信息中识别字段,一旦使用,就不能修改。

      注:

      • 编码时, [1, 15] 内的标签使用字节。
      • [16,2047] 有一个标签 使用两个字节。

      因此,对于经常出现的电文部分,应保留[1、15]中的标签,同时铭记某些标签是为今后可能引入的经常出现的字段保留的。

      电文定义 3.6

      .proto文件定义消息,message.proto由文件最小的逻辑单位序列组成 。name-value键值对构成:

      message信件有一个或多个独有编号字段, 每个字段由“ 页面限制 + 字段类型 + 字段名称 + 编号 ” 组成, 字段限制分为“ 页面限制 + 字段类型 + 字段名称 + 编号 ” 。optional(可选,省略)required(必要,省略)repeated(重复的)。

      信件可以设置在各种文件中,可以通过import还指定信件用于支持导入时的拼图 。

      它可以用来避免两种电文之间的同义词纠纷。package字段声明包名。

      3.7 枚举

      在定义信件类型时,您可能需要在预设值序列中指定字段的值。通过在信件定义中插入新项目(在信件定义中),可以指定字段的值(在预设值序列中)。enum并且为每种可想象的价值确定一个常数。

      三.8 任何(任何类型的信息)

      Any类型是一种不需要在.proto文件指定可以直接使用的信件类型。 您必须先导入文件才能使用 :

      3.9 服务

      如果想在RPC在系统中使用信件类型, 必须启用该类型 。.proto文件中定义RPC服务界面, 然后使用编译器生成匹配语言的内存根 。

      3.10 保留识别物保留

      当我们修改字段时手动删除或加注上一个标签版本时, 旧版本用于装入新版本 。.proto文献资料可能造成重大困难,如数据丢失、侵犯隐私等,防止今后发生这种情况的方法之一是指定要维护的标签。Protocol Buffer如果未来的用户试图使用这些域名标签,汇编者将通知这些用户。

      3.11 更新协议

      如果当前信件不再满足您的需求, 如添加新字段, 但您仍然想要与上一个版本创建的信件兼容, 您必须安装以下规则来更改信件, 否则将丢失兼容性( 包括一些原版2 的语法函数 ):

      • 不更改现有的数字标签;
      • 你介绍的新领域是什么?optional或者repeated
      • required字段可以删除,但不能重新使用它们所指的数字标签。
      • 只需确保数字标签保持不变,一个例外。required扩展字段可以从字段转换为扩展字段,反之亦然。
      • int32uint32int64uint64bool这些种类可以共存;
      • sint32sint64与某些数字类型兼容,但与其它类型不兼容;
      • stringbytes兼容性 只要二进制内容正确UTF-8
      • optionalrepeated兼容性,即指定输入字段为repeated如果受款人预言optional,他选择了原始类型字段的最终值,他合并了信息类型字段的所有输入。

      三. 12个原3和原2之间的分离

      • 使用proto3语法第一行必须读作:syntax = "proto3"
      • 字段规则移除了requiredoptional,所有字段默认是optional类型的;
      • repeated字段默认采用packed编码,在proto2要指定更紧凑的字段,必须明确使用[包装=真 。packed编码方式;
      • 语言增加GoRubyJavaNano支持;
      • 移除了default选项;
      • 查点类型的第一个字段必须是0
      • 组群支持已删除;
      • 扩展支持已被删除。 已添加 。Any类型;
      • 增加了JSON映射特性;

      4. 其它参考

      https://blog.csdn.net/u011518120/article/details/54604615
      https://blog.csdn.net/mzpmzk/article/details/80824839

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/23179.html

          热门文章

          文章分类