grpc通信原理_gRPC原理简析

grpc通信原理_gRPC原理简析_第1张图片

gRPC原理简析

gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信。 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样。而gRPC的核心组成部分则是protocol buffers和http2.0,以下将详细讨论:

protocol buffers

简介

  • 开发者可以使用 pb compiler 生成用于读写数据代码。
  • 多语言支持特性,轻松支持技术栈不同的上下游。
  • Protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议。各种类型所用的编码算法如下所示:

grpc通信原理_gRPC原理简析_第2张图片

编码算法

varints 编码

  • 每字节使用第一位表示后面是否还有内容,另外7位保存真是数据。
  • 使用小端模式(数据低位在低地址,高位在高地址)。
  • 小整数使用该编码,空间能得到较大压缩,大整数可以考虑fix32 fix64代替。

以下我们看一个示例,varints 如何表示300

    1010 1100 0000 0010
     -         -
    ↓         ↓
下一字节有数据  下字节为空

所以其实真正表示300的数据位
     010 1100  000 0010
再转为对人类相对友好的大端模式表示即可得
     000 0010  010 1100

zigzag 编码

  • 对于int32, int64来说,高位置1表示负数,int64表示一个负数会使用10个字节,绝对值较小的负数会造成较多的空间浪费。
  • sint32, sint64会使用该编码方式,建议在存在负数且绝对值较小的场景下使用。
  • 编码算法 sint32(n << 1) ^ (n >> 31), sint64(n << 1) ^ (n >> 63)

定长编码

  • 在真实的数据前,使用一个varints 来表示数据长度
  • string, bytes, embedded messages, packed repeated fields均使用该编码方式
  • 数据格式如下:
 [tagNum|02] [length] [data]

repeated 编码

  • 在2.1版本,会被默认编码成TVTVTVTV(T代表tag,V代表数据本身)的格式,如
   [00002|02] [data1]
    [00002|02] [data2] 
 
  • 在3.0版本,会被默认编码成TVVVVVV的格式,通过减少tag来达到节约空间的目的。
    [00002|02] [length] [data1] [data2] [data3]

message struct 编码

  • Protobuf 消息是一系列的键值对组成。消息的二进制版本仅使用 field 数字当作 key,不同 field 的属性和类型只能通过消息类型的定义 在解码端确定。
  • 如果消息中不存在该 field,那么序列化后的 Message Buffer 中也不会有该 field,这些特性都有助于节约消息本身的大小。
  • 完整数据示例如下:
        type 0 代表varints
   tag num ↑        数据,300
       ↑   ↑          ↑
    [00001|00] [1010 1100 0000 0010]
    [00002|02] [100] [haha]
           ↓     ↓
           ↓  长度为4字节
        type 2, 定长编码

HTTP 2.0

特性

  1. 新的二进制格式。
  2. 流量控制。
  3. 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
  4. header压缩,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小,像cookie这类重复的数据来回传输很占用带宽。
  5. 双向数据流,服务端也能具备主动推送消息的能力

gRPC

优势

  1. 效率高于 restful 服务,编码节约空间,使得在低带宽场景下很有优势。
  2. pb compiler生成数据读写代码,提高开发者编码效率。
  3. 支持向上游传递超时时间,让上游在发现超时时主动决定如何执行后续操作,http1.1则会直接断开连接。

缺点

  1. 只有少数浏览器支持gRPC。
  2. 移动端网络可能在wifi及4G频繁切换,无法体现出长连接以及多路复用的优势。
  3. 编码后数据可读性低,json则具有很高的可读性。

小结

gRPC其实就是使用protocol buffer作为序列化协议(编码解码),http2.0作为通讯协议的RPC协议。

reference

  1. https://developers.google.com/protocol-buffers/docs/overview
  2. https://developers.google.com/protocol-buffers/docs/encoding

头条内推请扫码,成功入职小李同学请吃饭~~~

grpc通信原理_gRPC原理简析_第3张图片

你可能感兴趣的:(grpc通信原理)