趙明芳 劉軍 楊青 趙世偉
【摘要】基于gRPC框架設(shè)計(jì)實(shí)現(xiàn)電磁頻譜監(jiān)測系統(tǒng)中間件,主要包括:定義gRPC服務(wù)、實(shí)現(xiàn)客戶端與服務(wù)端功能。實(shí)踐表明該方法通用性好,適用于架構(gòu)分布式測試系統(tǒng),能夠滿足自動(dòng)測試方向的需求。
【關(guān)鍵詞】電磁頻譜監(jiān)測系統(tǒng);中間件;遠(yuǎn)程過程調(diào)用;gRPC
中圖分類號(hào):TN92? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ?文章編號(hào):1673-0348(2020)018-084-03
Abstract: Based on the gRPC framework, a design and realization method of middleware in electromagnetic spectrum monitoring system including gRPC service defining, realizing client and server functions is presented in this paper. Good testing result shows that this method has good versatility, is suitable for the architecture of distributed test system, and can meet the needs of automatic testing.
Key words: Electromagnetic Spectrum Monitoring System; middleware; Remote Procedure Call; gRPC
1.引言
隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)通信技術(shù)的發(fā)展,分布式技術(shù)在計(jì)算機(jī)的工程應(yīng)用領(lǐng)域,例如:數(shù)據(jù)信息管理、自動(dòng)化等方面取得快速發(fā)展,并應(yīng)用于自動(dòng)測試系統(tǒng)的分布式部署中,即基于局域網(wǎng)與互聯(lián)網(wǎng),把分散在不同地點(diǎn)、不同測試能力的計(jì)算機(jī)、設(shè)備組合在一起,實(shí)現(xiàn)遠(yuǎn)程自動(dòng)化測試與測試資源共享。電磁頻譜監(jiān)測系統(tǒng)屬于分布式測試系統(tǒng),它具備的一個(gè)重要能力是遠(yuǎn)程過程控制功能,中間件技術(shù)為這種分布式架構(gòu)方法提供了有力保障,使用該技術(shù)可獨(dú)立于平臺(tái)與語言實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用、數(shù)據(jù)庫訪問、消息傳遞等服務(wù),從而實(shí)現(xiàn)電磁頻譜監(jiān)測系統(tǒng)中不同監(jiān)測角色(如:客戶端、服務(wù)器、設(shè)備)的靈活組態(tài)、遠(yuǎn)程測試、以及資源共享與管理。
分布式測試系統(tǒng)中,各種應(yīng)用不是部署在一個(gè)進(jìn)程(/主機(jī))中,通?;赗PC(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)協(xié)議實(shí)現(xiàn)對(duì)遠(yuǎn)程計(jì)算機(jī)服務(wù)的調(diào)用。RPC遵從server/client模型,實(shí)際使用時(shí),客戶端調(diào)用服務(wù)端提供的接口就如同本地調(diào)用,且不需要開發(fā)網(wǎng)絡(luò)通信和協(xié)議層的功能,只需關(guān)心業(yè)務(wù)相關(guān)的服務(wù)。目前有多種RPC框架用于開發(fā)實(shí)現(xiàn)網(wǎng)絡(luò)進(jìn)程間通信,例如:Dubbox 、thrift ,gRPC等。其中g(shù)RPC 框架是一個(gè)由谷歌開發(fā)的語言中立、平臺(tái)中立、開源的 RPC 框架,它面向 HTTP/2 設(shè)計(jì)、使用 protobuf 作為數(shù)據(jù)序列化協(xié)議,并且具有解析速度快,序列化數(shù)據(jù)體積小,可擴(kuò)展性高,使用簡單等特性,相比其他RPC框架而言,發(fā)展空間更大。
2. 電磁頻譜監(jiān)測系統(tǒng)中間件設(shè)計(jì)與實(shí)現(xiàn)
2.1 整體框架設(shè)計(jì)
實(shí)際的測試場景中,監(jiān)測系統(tǒng)的客戶端與服務(wù)端物理位置分離,兩端通過網(wǎng)絡(luò)連接,中間件位于客戶端與服務(wù)端中間,實(shí)現(xiàn)了兩者之間的遠(yuǎn)程應(yīng)用程序調(diào)用、數(shù)據(jù)序列化與數(shù)據(jù)傳輸功能??蛻舳耸怯脩魳I(yè)務(wù)的入口,接收用戶的監(jiān)測意圖,即服務(wù)消費(fèi)方,通過中間件調(diào)用服務(wù)端提供的對(duì)應(yīng)服務(wù)。該服務(wù)執(zhí)行時(shí),操作監(jiān)測設(shè)備,獲取測量數(shù)據(jù),經(jīng)服務(wù)端分析、處理后再經(jīng)過中間件將測量結(jié)果返回客戶端,從而實(shí)現(xiàn)客戶端的業(yè)務(wù)功能。
遠(yuǎn)程過程調(diào)用中間件框架如圖1所示:
2.2 gRPC安裝與部署
基于gRPC框架開發(fā)中間件,需要預(yù)先在目標(biāo)平臺(tái)上安裝gRPC庫、配置 gRPC運(yùn)行環(huán)境、安裝 protocol buffer 以及gRPC插件來編譯系統(tǒng)定義的服務(wù)。首先,確定目標(biāo)平臺(tái)和語言,這里選擇Windows操作系統(tǒng),目標(biāo)語言為C++;接著,安裝目標(biāo)語言的IDE開發(fā)環(huán)境(Visual Studio 2015);最后,通過vcpkg包管理工具便捷地實(shí)現(xiàn)第三方開發(fā)庫(gRPC庫等)的管理以及與IDE的集成。
2.3 定義gRPC服務(wù)
首先,按照要求生成gRPC服務(wù)接口。gRPC通過 Protobuf(Google protocol buffers)定義服務(wù)以及生成客戶端與服務(wù)端的接口執(zhí)行代碼。Protobuf 是谷歌提出的一種數(shù)據(jù)序列化協(xié)議,它的語言無關(guān)、平臺(tái)無關(guān)、可擴(kuò)展的特性,使得它十分適合用于gRPC框架實(shí)現(xiàn)數(shù)據(jù)傳輸。它最大的特點(diǎn)是能夠根據(jù)用戶自定義的遠(yuǎn)程調(diào)用服務(wù)文件(.proto文件)轉(zhuǎn)換成目標(biāo)語言的頭文件與接口實(shí)現(xiàn)文件,從而用戶可以方便地調(diào)用服務(wù)接口函數(shù),實(shí)現(xiàn)客戶端請(qǐng)求的服務(wù)功能。定義gRPC服務(wù)需要兩步:
1) 編寫proto文件
proto文件相當(dāng)于待傳輸?shù)南⒛0?,它定義了需要傳輸?shù)臄?shù)據(jù)本身,主要包括服務(wù)端與客戶端的接口和消息。
·接口:是客戶端與服務(wù)端遠(yuǎn)程過程調(diào)用的函數(shù)接口,該接口定義可表達(dá)四種類型RPC方法(例如:簡單RPC、流式RPC)。接口定義需遵循規(guī)定的格式,即由service 關(guān)鍵字引導(dǎo)具體的服務(wù)接口名稱,大括號(hào)內(nèi)包含具體的RPC方法(服務(wù)接口函數(shù))列表,格式如下:
service 服務(wù)接口名稱
{
rpc 函數(shù)名(請(qǐng)求) returns (響應(yīng)){ }
......
}
·消息:定義不同消息類型(例如:enum,message)包含的字段。格式如下:
消息類型關(guān)鍵字消息名稱
{
消息字段1;
......
消息字段n;
}
2) 編譯proto文件
由于proto文件不能直接使用,也不能直接傳輸,所以需要通過protobuf編譯器(protoc.exe),將proto文件轉(zhuǎn)換為目標(biāo)語言的頭文件和源文件(C++語言對(duì)應(yīng)的是.h與.cc文件),生成的文件中包含了對(duì)上述proto文件中定義的消息字段的讀寫函數(shù),以及服務(wù)端與客戶端的接口調(diào)用函數(shù)。經(jīng)過這一步就將語言中立的proto文件的信息轉(zhuǎn)換為接口與消息的C++類(包含數(shù)據(jù)與方法),下一步就是在生成的目標(biāo)語言代碼的基礎(chǔ)上,開發(fā)服務(wù)端與客戶端的功能。
2.4 實(shí)現(xiàn)服務(wù)端
首先,VS2015新建server項(xiàng)目(控制臺(tái)項(xiàng)目),并設(shè)置項(xiàng)目屬性,主要包括:
1) 添加gRPC的宏定義:_WIN32_WINNT=0x0600;
2) 指定目標(biāo)語言的頭文件(.h)和源文件(.cc)所在目錄,并將源文件添加到項(xiàng)目;
3) 添加windows socket庫ws2_32.lib。
接著,編碼實(shí)現(xiàn)服務(wù)端接口功能:按照上述proto文件定義的service服務(wù)接口,依次實(shí)現(xiàn)包含的服務(wù)接口函數(shù)功能,即從自動(dòng)生成的接口類 Service(.grpc.pb.h 文件中,自動(dòng)生成的服務(wù)接口文件。)派生自定義C++類,并重寫該類的服務(wù)端接口虛函數(shù)。代碼段示例:
//文件xx.grpc.pb.h中定義的server接口
class Service : public ::grpc::Service
{
public:
Service();
virtual ~Service();
virtual ::grpc::Status teamFile(::grpc::ServerContext* context,
const::DEPARTMENT::Identity* request, ::DEPARTMENT::Profile* response);
};
//類TeamService派生自類Service,需重寫接口函數(shù)teamFile,實(shí)現(xiàn)服務(wù)端功能。
class TeamService final : public teamData::Service
{
public:
TeamService ();
virtual ~ TeamService ();
public:
Status teamFile(ServerContext* context, const Identity* request, Profile* response) override;
private:
void editTeam(const string& id, const string& name, Gender gender);
private:
map
};
最后,構(gòu)建并啟動(dòng)server端服務(wù),監(jiān)聽指定的地址和端口,等待接收來自客戶端的服務(wù)請(qǐng)求。代碼段示例:
int main(int argc, char** argv)
{
std::string server_address("127.0.0.1:50051"); //server端監(jiān)聽地址和端口
TeamService service; //服務(wù)類對(duì)象
ServerBuilder builder;
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
std::unique_ptr
cout << "Server listen on" << server_address << endl;
server->Wait();
return 0;
}
2.5 實(shí)現(xiàn)客戶端
首先,新建client項(xiàng)目,并設(shè)置項(xiàng)目屬性,方法同server端項(xiàng)目屬性設(shè)置方法。
接著,編碼實(shí)現(xiàn)client功能:按照proto文件中定義的接口,調(diào)用client端同名接口函數(shù),從而測試 server端服務(wù)接口功能是否正確。開發(fā)客戶端功能不必像實(shí)現(xiàn)server端功能那樣編碼實(shí)現(xiàn)具體的服務(wù)實(shí)現(xiàn)過程,而是委托Stub類對(duì)象調(diào)用客戶端的接口函數(shù)即可。
最后,編譯生成client項(xiàng)目,查錯(cuò)直至成功。
2.6 運(yùn)行測試
基于gRPC框架實(shí)現(xiàn)的遠(yuǎn)程過程調(diào)用,以server/client模型實(shí)現(xiàn)。實(shí)際程序員做的工作就是在目標(biāo)IDE中按照gRPC要求的接口、數(shù)據(jù)規(guī)范分別實(shí)現(xiàn)服務(wù)端與客戶端的功能,而gRPC框架實(shí)現(xiàn)了兩端的通信,所以服務(wù)端與客戶端的程序編譯生成成功后,可直接測試服務(wù)接口功能。
測試方法是:通過分別運(yùn)行客戶端與服務(wù)端程序,客戶端向服務(wù)端發(fā)送服務(wù)請(qǐng)求,驗(yàn)證是否調(diào)用成功服務(wù)端接口函數(shù),并獲得預(yù)期結(jié)果。具體步驟如下:
step1.根據(jù)目標(biāo)平臺(tái)與版本,選擇并打開client端與server端可執(zhí)行程序所在目錄;
step2.運(yùn)行server端可執(zhí)行程序,根據(jù)提示信息,確認(rèn)服務(wù)端是否構(gòu)建并運(yùn)行成功,并進(jìn)入監(jiān)聽狀態(tài);
step3.運(yùn)行client端可執(zhí)行程序:根據(jù)命令行提示輸入請(qǐng)求命令,進(jìn)行服務(wù)接口測試,查看server端的響應(yīng)結(jié)果,并驗(yàn)證。
3. 結(jié)論
基于gRPC框架設(shè)計(jì)實(shí)現(xiàn)中間件,是將復(fù)雜的系統(tǒng)模塊功能或業(yè)務(wù)拆分為多個(gè)服務(wù)功能,且每部分可獨(dú)立并行開發(fā)、測試以及環(huán)境部署,實(shí)現(xiàn)了功能高內(nèi)聚、接口低耦合。各服務(wù)進(jìn)程獨(dú)立,互相協(xié)作配合,實(shí)現(xiàn)用戶業(yè)務(wù)功能。同時(shí)gRPC框架完成了網(wǎng)絡(luò)數(shù)據(jù)傳輸與序列化,能夠有效提升網(wǎng)絡(luò)傳輸效率。該遠(yuǎn)程過程調(diào)用中間件設(shè)計(jì)實(shí)現(xiàn)方法已應(yīng)用于某電磁頻譜監(jiān)測系統(tǒng)軟件開發(fā)中,測試結(jié)果表明其平臺(tái)適應(yīng)性好,中間件可靠、穩(wěn)定,傳輸數(shù)據(jù)體積小、速度快,能夠滿足電磁頻譜監(jiān)測系統(tǒng)分布式部署與測試需求。
參考文獻(xiàn):
[1] 劉龍,王偉平,劉遠(yuǎn)飛.自動(dòng)測試系統(tǒng)的發(fā)展現(xiàn)狀及前景[J].飛機(jī)設(shè)計(jì), 2007(04):71-74.
[2] 馬雄.基于微服務(wù)架構(gòu)的系統(tǒng)設(shè)計(jì)與開發(fā)[D].南京:南京郵電大學(xué),2017.
[3] 宋瑾.基于ProtocolBuffer協(xié)議的服務(wù)端-客戶端通信[J].電腦編程技巧與維護(hù),2014(12):100-101.
[4] 劉宏,吳江.分布式對(duì)象中間件技術(shù)[J].現(xiàn)代電子技術(shù),2003(08):91-94.