grpc
gRPC(Google Remote Procedure Call,Google远程过程调用)
一.gRPC简介
gRPC是Google发布的基于HTTP 2.0传输层协议承载的高性能开源软件框架,提供了支持多种编程语言的、对网络设备进行配置和纳管的方法。由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由gRPC框架实现的底层通信的关注。如图3,DATA部分即业务层面内容,下面所有的信息都由gRPC进行封装。
gRPC的交互过程
1.交换机在开启gRPC功能后充当gRPC客户端的角色,采集服务器充当gRPC服务器角色;
2.交换机会根据订阅的事件构建对应数据的格式(GPB/JSON),通过Protocol Buffers进行编写proto文件,交换机与服务器建立gRPC通道,通过gRPC协议向服务器发送请求消息;
3.服务器收到请求消息后,服务器会通过Protocol Buffers解译proto文件,还原出最先定义好格式的数据结构,进行业务处理;
4.数据梳理完后,服务器需要使用Protocol Buffers重编译应答数据,通过gRPC协议向交换机发送应答消息;
5.交换机收到应答消息后,结束本次的gRPC交互。
上图展示的是gRPC交互过程的具体流程,这也是Telemetry触发方式其中之一,称为Dial-out模式。简单地说,gRPC就是在客户端和服务器端开启gRPC功能后建立连接,将设备上配置的订阅数据推送给服务器端。我们可以看到整个过程是需要用到Protocol Buffers将所需要处理数据的结构化数据在proto文件中进行定义。
二.Protocol Buffers
你可以理解Protocol Buffers是一种更加灵活、高效的数据格式,与XML、JSON类似,在一些高性能且对响应速度有要求的数据传输场景非常适用。
Protoco Buffers在gRPC的框架中主要有三个作用:
1.定义数据结构
2.定义服务接口
3.通过序列化和反序列化,提升传输效率
更快的传输速度——序列化的成果
我们知道使用XML、JSON进行数据编译时,数据文本格式更容易阅读,但进行数据交换时,设备就需要耗费大量的CPU在I/O动作上,自然会影响整个传输速率。Protocol Buffers不像前者,它会将字符串进行序列化后再进行传输,即二进制数据。
可以看到其实两者内容相差不大,并且内容非常直观,但是Protocol Buffers编码的内容只是提供给操作者阅读的,实际上传输的并不会以这种文本形式,而是序列化后的二进制数据。字节数会比JSON、XML的字节数少很多,速率更快。
在目前或者说未来信息数据爆炸的时代,因为Protocol Buffers是以二进制的形式进行传输的,传输效率相比XML、JSON是有天然的优势,而数据采集效率必然是架构设计、运维建设考虑的重点之一。
跨平台多语言
Protocol Buffers自带一个编译器也是一个优势点。前面提到的proto文件就是通过编译器进行编译的,proto文件需要编译生成一个类似库文件,基于库文件才能真正开发数据应用。具体用什么编程语言编译生成这个库文件呢?由于现网中负责网络设备和服务器设备的运维人员往往不是同一组人,运维人员可能会习惯使用不同的编程语言进行运维开发,那么Protocol Buffers其中一个优势就能发挥出来——跨语言。
从上面的介绍,我们得出在编码方面Protocol Buffers对比JSON、XML的优点:
1.简单,体积小,数据描述文件大小只有1/10至1/3;
2.传输和解析的速率快,相比XML等,解析速度提升20倍甚至更高;
3.可编译性强。除了Protocol Buffers之外,
4. gRPC还有另外一个优势——它是基于HTTP 2.0协议的。
HTTP 2.0
由于gRPC基于HTTP 2.0标准设计,带来了更多强大功能,如多路复用、二进制帧、头部压缩、推送机制。这些功能给设备带来重大益处,如节省带宽、降低TCP连接次数、节省CPU使用等。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现两端的通信和简化通信系统的构建。
HTTP 版本分为HTTP 1.X、 HTTP 2.0,其中HTTP 1.X是当前使用最广泛的HTTP协议,HTTP 2.0称为超文本传输协议第二代。HTTP 1.X定义了四种与服务器交互的方式,分别为:GET、POST、PUT、DELETE,这些在HTTP 2.0中均保留。我们再来看看HTTP 2.0的新特性:
双向流、多路复用
在HTTP 1.X协议中,客户端在同一时间访问同一域名的请求数量是有限制的,当超过阈值时请求会被阻断,但是这种情况在HTTP 2.0中将被忽略。由于HTTP 1.X传输的是纯文本数据,传输体积较大,而HTTP 2.0传输的基本单元为帧,每个帧都包含消息,并且由于HTTP 2.0允许同时通过一条连接发起多个“请求-响应”消息,无需建立多个TCP链接的同时实现多条流并行,提高吞吐性能,并且在一个连接内对多个消息进行优先级的管理和流控。
二进制帧
相对于HTTP 1.X的纯文本传输来,HTTP 2.0传输的是二进制数据,与Protocol Buffers相辅相成。使得传输数据体积小、负载低,保持更加紧凑和高效。
头部压缩
因为HTTP是无状态协议,对于业务的处理没有记忆能力,每一次请求都需要携带设备的所有细节,特别是在头部都会包含大量的重复数据,对于设备来说就是在不断地做无意义的重复性工作。HTTP 2.0中使用“头表”来跟踪之前发送的数据,对于相同的数据将不再使用重复请求和发送,进而减少数据的体积。
总结:
GRPC的优势建立在protocol buffers上,protocol buffers的优势又建立在http2上。