GRPC-草稿

2020-11-21  本文已影响0人  逗比的一生

gRPC简介

gRPC是Google发布的基于HTTP 2.0传输层协议承载的高性能开源软件框架,提供了支持多种编程语言的、对网络设备进行配置和纳管的方法。由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由gRPC框架实现的底层通信的关注。如图1,DATA部分即业务层面内容,下面所有的信息都由gRPC进行封装。


1

下面展示一下gRPC的交互过程:


2

上图展示的是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自带一个编译器也是一个优势点。前面提到的proto文件就是通过编译器进行编译的,proto文件需要编译生成一个类似库文件,基于库文件才能真正开发数据应用。具体用什么编程语言编译生成这个库文件呢?由于现网中负责网络设备和服务器设备的运维人员往往不是同一组人,运维人员可能会习惯使用不同的编程语言进行运维开发,那么Protocol Buffers其中一个优势就能发挥出来——跨语言

基于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中使用“头表”来跟踪之前发送的数据,对于相同的数据将不再使用重复请求和发送,进而减少数据的体积。

但是具体的数据模型,到底是基于JSON模型还是YANG模型???

Dial-in模式和Dial-out模式

Dial-in模式:设备作为gRPC服务器,采集器作为gRPC客户端。由采集器主动向设备发起gRPC连接并订阅需要采集的数据信息。Dial-in模式适用于小规模网络和采集器需要向设备下发配置的场景。
Dial-out模式:设备作为gRPC客户端,采集器作为gRPC服务器。设备主动和采集器建立gRPC连接,将设备上配置的订阅数据推送给采集器。Dial-out模式适用于网络设备较多的情况下向采集器提供设备数据信息。

缺省情况下,gRPC服务的端口号为50051
缺省情况下,gRPC会话超时时间为5分钟
缺省情况下,设备和采集器建立gRPC连接时不会引用PKI域
缺省情况下,gRPC功能处于关闭状态

· 事件触发:传感器组的数据采样没有固定周期,仅由事件触发。

· 周期采样:传感器组以固定的时间间隔来进行数据采样。

建议系统中创建的目标组数量不超过5个,否则会影响系统性能。
完成传感器组和目标组的配置后,需要创建订阅并将二者关联,设备才能和目标组中的采集器建立gRPC连接,从而将订阅报文发送给采集器。

Protocol Buffers编码格式

Dial-out模式的proto文件

grpc_dialout.proto文件定义了Dial-out模式下的公共RPC方法,其内容和含义如下:

syntax = "proto2";

package grpc_dialout;

message DeviceInfo{ //推送的设备信息

    required string producerName = 1; //厂商名

    required string deviceName = 2; //设备的名称

    required string deviceModel = 3; //设备型号

}

message DialoutMsg{   //推送的消息格式描述

    required DeviceInfo deviceMsg = 1; //DeviceInfo所描述的设备信息

    required string sensorPath = 2; //采样路径,对应netconf表的xpath路径

    required string jsonData = 3; //采样结果数据(JSON格式字符串)

}

message DialoutResponse{  //采集器(gRPC服务器)返回信息,预留(暂不处理返回值,可填充任意值)

    required string response = 1;

}

service GRPCDialout {  //推送方法

    rpc Dialout(stream DialoutMsg) returns (DialoutResponse);

}

获取proto文件的方法

gnmi.proto和gnmi_ext.proto文件的下载地址:

· https://github.com/openconfig/gnmi/tree/master/proto/gnmi/gnmi.proto

· https://github.com/openconfig/gnmi/tree/master/proto/gnmi_ext/gnmi_ext.proto

上一篇 下一篇

猜你喜欢

热点阅读