背景:
需要對(duì)rpc服務(wù)進(jìn)行壓測(cè)俩功,需要構(gòu)造rpc請(qǐng)求喝峦。
protobuf 簡(jiǎn)介
Protocol Buffer (簡(jiǎn)稱Protobuf) 是Google出品的性能優(yōu)異牲芋、跨語(yǔ)言惠险、跨平臺(tái)的序列化庫(kù)舔糖。
文檔結(jié)構(gòu)
protobuf 使用 .proto 文件來保存文檔。
syntax = "proto3";
package cw.videoanalyze.alg_plugin;
message AlgPluginObject {
string plugin_name = 1; // 插件名稱(必須要填寫)
uint64 UOID = 2; // UOID (非必須)
string plugin_func = 3; // 插件方法
}
message AlgPluginRequest {
AlgPluginObject plugin = 1; // 插件對(duì)象
bytes serialize_data = 2; // 序列化數(shù)據(jù)(無關(guān)數(shù)據(jù))
}
message AlgPluginResponse {
AlgPluginObject plugin = 1; // 插件對(duì)象
bool ret_flag = 2; // 響應(yīng)結(jié)果
int32 error_no = 3; // 錯(cuò)誤碼莺匠,當(dāng)ret_flag = false 時(shí)有用
string message = 4; // 返回消息
bytes serialize_data = 5; // 返回的序列化數(shù)據(jù)
}
/*
* 插件上報(bào)數(shù)據(jù)
* 說明: 該數(shù)據(jù)中包換了插件上報(bào)的所有的圖片,抓拍坐標(biāo)十兢,屬性等數(shù)據(jù)
*/
message AlgPluginReport {
AlgPluginObject plugin = 1; // 插件對(duì)象
string camera_id = 2; // 攝像頭ID
bytes serialize_data = 3; // 序列化數(shù)據(jù)(無關(guān)數(shù)據(jù))
}
/*
* 插件上報(bào)RPC接口
*/
service AlgReportPush {
rpc Report (AlgPluginReport) returns (AlgPluginResponse);
rpc Request (AlgPluginRequest) returns (AlgPluginResponse);
}
- protobuf 文檔的第一行趣竣,為版本申明,不填寫默認(rèn)為版本2.
- package 定義proto的包名旱物,包名可以避免對(duì)message 類型之間的名字沖突遥缕。也可省略。
- message 關(guān)鍵字定義消息宵呛。
- service 關(guān)鍵字定義服務(wù)单匣。
定義消息
protobuf使用message定義消息,例如:
message AlgPluginObject {
string plugin_name = 1; // 插件名稱(必須要填寫)
uint64 UOID = 2; // UOID (非必須)
string plugin_func = 3; // 插件方法
}
AlgPluginObject消息定義了三個(gè)字段宝穗,分別為插件名稱户秤,U0ID及插件方法。
消息定義中的每個(gè)字段都有唯一的編號(hào)逮矛。這些字段編號(hào)用于以消息二進(jìn)制格式標(biāo)識(shí)字段鸡号,并且在使用消息類型后不應(yīng)更改
定義服務(wù)
定義RPC方法,需要使用service關(guān)鍵字定義服務(wù)须鼎,并在里面定義方法鲸伴。
/*
* 插件上報(bào)RPC接口
*/
service AlgReportPush {
rpc Report (AlgPluginReport) returns (AlgPluginResponse);
rpc Request (AlgPluginRequest) returns (AlgPluginResponse);
}
此處定義了一個(gè)AlgReportPush服務(wù),包含兩個(gè)rpc方法:
- Reprot 方法晋控,入?yún)锳lgPluginReport汞窗,返回參數(shù)為 AlgPluginResponse
- Request 方法,入?yún)锳lgPluginRequest赡译,返回參數(shù)為 AlgPluginResponse
下面針對(duì)上面的proto文件仲吏,寫一個(gè)grpc client 進(jìn)行rpc請(qǐng)求。
import grpc
import va_plugin_proto_pb2_grpc
import va_plugin_proto_pb2
import VideoObjectPush_pb2
def get_bytes():
img = 'D:\\10w\\1.jpg'
with open(img,'rb') as f:
bytes_data = f.read()
return bytes_data
def run():
# 連接RPC服務(wù)器
channel = grpc.insecure_channel('localhost:21001')
# 調(diào)用RPC服務(wù)
stub = va_plugin_proto_pb2_grpc.AlgReportPushStub(channel=channel)
#組裝請(qǐng)求參數(shù)
alg_plugin_obj = va_plugin_proto_pb2.AlgPluginObject(plugin_name='videostream.person',plugin_func='videostream.person.return_callback')
box = VideoObjectPush_pb2.Box(x=1,y=1,width=1,height=1)
face = VideoObjectPush_pb2.Object(box=box,objPic=get_bytes(),qualityScore=0.656565,confidenceScore=0.13265,
pts=1546272000000)
person = VideoObjectPush_pb2.Person(objectId=1,cameraId="xiuxiqu",face=face)
object = VideoObjectPush_pb2.DetectedObject(person=person)
resp = stub.Report(va_plugin_proto_pb2.AlgPluginReport(plugin=alg_plugin_obj,camera_id='xiuxiqu',serialize_data=object.SerializeToString()))
print(resp)