【龍田百科】淺析gRPC技術,遠程過(guò)程調用的優質選擇
發(fā)布時間:2024-03-27
随著(zhe)網絡複雜化,服務之間遠程調用的普遍使用,對(duì)遠程調用工具的需求也越來越迫切,gRPC協議應運而生。
Google遠程過(guò)程調用(Google Remote Procedure Call,gRPC)是基于HTTP 2.0傳輸層協議承載的高性能(néng)開(kāi)源RPC軟件框架,爲管理和配置網絡設備提供了一種(zhǒng)API接口設計的方法。gRPC提供了多種(zhǒng)編程語言,如C、Java、golong、python等。
gRPC可以作爲數據傳輸協議與Telemetry技術配合使用,可實時、高速、精确的監控網絡設備的運行狀态。此外,網絡設備提供了一種(zhǒng)基于gRPC方式來管理設備的方法,包括配置、查詢和能(néng)力獲取三種(zhǒng)方法。這(zhè)些方法是通過(guò)設備和采集器對(duì)接,實現采集設備數據的功能(néng)。

 

gRPC vs REST

 

 

REST(Representational State Transfer)表征狀态轉移,是一種(zhǒng)軟件架構風格,用于指導WEB架構的設計和開(kāi)發(fā)。REST同樣(yàng)爲管理和配置網絡設備提供了一種(zhǒng)API接口設計的方法。gRPC與REST兩(liǎng)者的主要差異如下:
  • REST遵循基于HTTP 1.1的請求-響應通信模型,而gRPC遵循基于HTTP 2.0的客戶端-響應通信模型。HTTP 2.0相對(duì)于HTTP 1.1,在速度上有著(zhe)絕對(duì)的優勢。雖然REST也可以基于HTTP 2.0進(jìn)行數據傳輸,但是爲了兼容HTTP 1.1方式,導緻其沒(méi)有充分利用HTTP 2.0的優勢。
  • 幾乎所有的浏覽器都(dōu)支持REST,而支持gRPC的浏覽器非常有限。這(zhè)是REST相對(duì)于gRPC的主要優勢。
  • REST使用JSON或XML編碼格式承載數據,而gRPC默認使用ProtoBuf(Protocol Buffers)編碼格式承載數據。ProtoBuf是二進(jìn)制的,是以二進(jìn)制數據進(jìn)行傳輸,而JSON或XML編碼格式以文本形式傳輸,所以在傳輸速率上gRPC更具有優勢。
  • REST不提供内置代碼生成(chéng)功能(néng),需要使用Swagger等工具生成(chéng)API請求代碼。而gRPC具有protoc編譯器,具有代碼生成(chéng)功能(néng),而且protoc編譯器與多種(zhǒng)編程語言兼容。
gRPC的工作原理
1.gRPC協議框架
gRPC是一種(zhǒng)用于實現RPC API的技術。由于gRPC是開(kāi)源框架,通信雙方都(dōu)基于該框架進(jìn)行二次開(kāi)發(fā),從而使得通信雙方聚焦在業務,無需關注由gRPC軟件框架實現的底層通信。如下圖,DATA部分即爲業務層面(miàn)内容,DATA下面(miàn)所有的信息由gRPC進(jìn)行封裝。

 

gRPC協議架構
2.gRPC支持的操作
設備在網絡架構裡(lǐ)支持Dial-in和Dial-out兩(liǎng)種(zhǒng)對(duì)接模式。
Dial-in模式:設備作爲gRPC服務器,采集器作爲gRPC客戶端。由采集器主動向(xiàng)設備發(fā)起(qǐ)gRPC連接并獲取需要采集的數據信息或下發(fā)配置。Dial-in模式适用于小規模網絡和采集器需要向(xiàng)設備下發(fā)配置的場景。
Dial-in模式支持以下操作:
  • Subscribe操作:高速采集設備的接口流量統計、CPU和内存等數據信息。當前僅支持基于Telemetry技術的Subscribe操作。
  • Get操作:獲取設備運行狀态和運行配置。當前僅支持基于gNMI(gRPC Network Management Interface)規範的Get操作。
  • Capabilities操作:獲取設備能(néng)力數據。當前僅支持基于gNMI規範的Capabilities操作。
  • Set操作:向(xiàng)設備下發(fā)配置。當前僅支持基于gNMI規範的Set操作。
Dial-out模式:設備作爲gRPC客戶端,采集器作爲gRPC服務器。設備主動和采集器建立gRPC連接,將(jiāng)設備上配置的訂閱數據推送給采集器。Dial-out模式适用于網絡設備較多的情況下,由設備主動向(xiàng)采集器提供設備數據信息。Dial-out模式隻支持基于Telemetry技術的Subscribe操作。
3.gRPC交互過(guò)程
如下圖,gRPC采用客戶端和服務器模型,以網絡設備爲gRPC客戶端,采集器爲gRPC服務器爲例,說明gRPC的交互過(guò)程:
  • 設備在開(kāi)啓gRPC功能(néng)後(hòu)作爲gRPC客戶端,采集器作爲gRPC服務器。
  • 設備會(huì)根據應用服務(如訂閱的事(shì)件)構建對(duì)應數據的格式(GPB/JSON),通過(guò)ProtoBuf(Protocol Buffers)編寫Proto文件。然後(hòu),設備與采集器建立gRPC通道(dào),通過(guò)gRPC協議向(xiàng)采集器發(fā)送請求消息。
  • 采集器收到請求消息後(hòu),會(huì)通過(guò)ProtoBuf解譯Proto文件,還(hái)原出事(shì)先定義好(hǎo)的數據結構,進(jìn)行業務處理。
  • 采集器處理完數據後(hòu),需要使用ProtoBuf重新編譯應答數據,通過(guò)gRPC協議向(xiàng)設備發(fā)送應答消息。
  • 設備收到應答消息後(hòu),結束本次的gRPC交互。

簡單地說,設備主動和采集器建立gRPC連接,將(jiāng)設備上配置的訂閱數據推送給采集器。在整個gRPC交互的過(guò)程中,設備和采集器都(dōu)需要使用ProtoBuf來定義Proto文件。

gRPC交互過(guò)程

4.gRPC的應用

gRPC支持通過(guò)Telemetry技術實現訂閱功能(néng)(Subscribe操作)。Telemetry是一項遠程的從物理設備或虛拟設備上高速采集數據的技術。設備通過(guò)推模式(Push Mode)周期性地主動向(xiàng)采集器上送設備的接口流量統計、CPU和内存數據等信息。
如下圖所示,網絡設備和網絡管理系統建立gRPC連接後(hòu),網絡管理系統可以訂閱設備上指定模塊的數據信息。Telemetry有動态訂閱和靜态訂閱兩(liǎng)種(zhǒng)方式,動态訂閱基于Dial-in模式建立,靜态訂閱基于Dial-out模式建立。

 

基于gRPC的Telemetry技術

 

Telemetry的實現流程:
1).用戶定義Telemetry靜态訂閱或Telemetry動态訂閱。 
  • Telemetry靜态訂閱:在huawei-grpc-dialout.proto文件中定義。
  • Telemetry動态訂閱:在huawei-grpc-dialin.proto文件中定義。

2).用戶將(jiāng)采集到的信息通過(guò)GPB或JSON格式進(jìn)行編碼,在huawei-telemetry.proto文件裡(lǐ)定義采樣(yàng)路徑、采樣(yàng)時間戳等重要信息。

  • GPB編碼時,huawei-telemetry.proto文件中的encoding字段爲Encoding_GPB(值爲0),data_gpb字段承載GPB編碼格式的采樣(yàng)數據,data_str字段爲空。
  • JSON編碼時,huawei-telemetry.proto文件中的encoding字段爲Encoding_JSON(值爲1),data_str字段承載JSON編碼格式的采樣(yàng)數據,data_gpb字段爲空。

3).設備傳輸數據到采集器,解碼數據并分析結果。

  • huawei-telemetry.proto文件中data_gpb字段内容需要相應的業務proto文件進(jìn)行解碼,由huawei-telemetry.proto文件中的sensor_path字段标識對(duì)應哪個具體的業務proto文件,例如,當sensor_path取值爲huawei-ifm:ifm/interfaces/interface時,其數據結構定義在huawei-ifm.proto文件中。
  • 當采用純JSON編碼格式(編碼層和數據模型層均爲JSON編碼格式),用戶隻需要對(duì)huawei-grpc-dialout.proto文件或huawei-grpc-dialin.proto文件進(jìn)行解碼。當采用混合JSON編碼格式(編碼層爲GPB編碼格式,數據模型層爲JSON編碼格式),用戶隻需要對(duì)huawei-grpc-dialout.proto文件或huawei-grpc-dialin.proto文件和huawei-telemetry.proto文件進(jìn)行解碼,不需要相應的業務proto文件

什麼(me)是gRPC ProtoBuf
 

gRPC ProtoBuf是gRPC協議的接口描述語言,是一種(zhǒng)與語言無關、平台無關、擴展性好(hǎo)的用于通信協議、數據存儲的序列化結構數據格式。gRPC ProtoBuf編碼格式也稱爲GPB(Google Protocol Buffers)編碼格式。GPB提供了一種(zhǒng)靈活、高效、自動序列化結構數據的機制。GPB與XML、JSON編碼類似,也是一種(zhǒng)編碼方式,但不同的是,它是一種(zhǒng)二進(jìn)制編碼,性能(néng)好(hǎo),效率高。

目前,GPB包括v2和v3兩(liǎng)個版本,設備當前支持的GPB版本是v3。

GPB在gRPC的框架中主要有三個作用:

 

  • 定義數據結構
  • 定義服務接口
  • 通過(guò)序列化和反序列化提升傳輸效率

 

什麼(me)是Proto文件

 

gRPC協議用GPB編碼格式承載數據,GPB編碼格式的文件名後(hòu)綴爲.proto,即爲Proto文件。
GPB通過(guò)“.proto”文件描述編碼使用的字典,即數據結構描述。采集器可以利用Protoc等工具軟件根據“.proto”文件自動生成(chéng)代碼(例如java代碼),然後(hòu)用戶基于自動生成(chéng)的代碼進(jìn)行二次開(kāi)發(fā)對(duì)獲取到的數據進(jìn)行解析,從而實現與設備的數據對(duì)接。
Proto文件包含公共Proto文件和業務數據Proto文件。
公共Proto文件
Telemetry提供3個公共的proto文件,支持數據上送和訂閱功能(néng):
  • huawei-grpc-dialout.proto文件:定義了設備作爲gRPC客戶端對(duì)外推送數據。
  • huawei-grpc-dialin.proto文件:定義了設備作爲gRPC服務端對(duì)外推送數據。
  • huawei-telemetry.proto文件:定義了Telemetry采樣(yàng)數據上送時的數據頭,包括采樣(yàng)路徑,采樣(yàng)時間戳等重要信息。
業務數據Proto文件
設備提供多個業務數據Proto文件,用于定義具體業務數據的GPB編碼,采集器側需要根據實際要監控的業務選擇對(duì)應的proto文件。
一個簡單的Proto文件示例:
Telemetry靜态訂閱功能(néng):設備作爲gRPC客戶端,采集器作爲gRPC服務端,由設備主動發(fā)起(qǐ)到采集器的連接,進(jìn)行數據采集上送。