李富合 高東林 曹寧生
(中國艦船研究院 北京 100101)
隨著云計(jì)算、大數(shù)據(jù)、人工智能等基礎(chǔ)共性技術(shù)在船舶平臺上的逐步應(yīng)用,未來的船舶信息平臺上將實(shí)現(xiàn)各類設(shè)備的計(jì)算、存儲、網(wǎng)絡(luò)等資源的統(tǒng)一服務(wù)化管理,硬件設(shè)備資源的服務(wù)化管理為云計(jì)算環(huán)境中軟件的服務(wù)化提供了基礎(chǔ)支撐。目前船舶裝備中的軟件包含三類:基礎(chǔ)軟件、中間件[1]和應(yīng)用軟件?;A(chǔ)軟件包括固件、操作系統(tǒng)以及硬件模塊的驅(qū)動程序等,應(yīng)用軟件則囊括了船舶裝備上使用的各種定制軟件,中間件作為基礎(chǔ)軟件和應(yīng)用軟件之間的軟件,屏蔽了各類不同廠家設(shè)備之間的差異,為應(yīng)用軟件提供統(tǒng)一的接口調(diào)用。船舶設(shè)備中間件實(shí)現(xiàn)了包括操控、音視頻、顯示、人機(jī)交互等功能,是船舶裝備軟件的重要組成部分。
中間件雖然為應(yīng)用軟件提供了統(tǒng)一的接口,但是它們往往獨(dú)立工作于單一物理設(shè)備,容易形成“信息孤島”[2]。此外,中間件傳統(tǒng)的部署模式缺乏靈活性,系統(tǒng)維護(hù)難度大。無法滿足云計(jì)算環(huán)境下船舶信息基礎(chǔ)平臺對軟件資源共享、系統(tǒng)動態(tài)重構(gòu)的要求。
本文設(shè)計(jì)一種基于RESTful的中間件服務(wù)化體系架構(gòu),通過提供一套開放的RESTfulAPI來實(shí)現(xiàn)中間件接口服務(wù)化以及中間件部署管理的功能需求。REST(Representational State Transfer)是分布式超媒體系統(tǒng)的架構(gòu)風(fēng)格,它采用面向資源的架構(gòu),將網(wǎng)絡(luò)上所有的事物都抽象為資源,通過統(tǒng)一資源標(biāo)識符(Universal Resource Identifies,URI)來定位和表示資源并進(jìn)行面向不同資源的操作[3]。資源表述格式的Web服務(wù)(RESTful Web Services)是符合REST架構(gòu)風(fēng)格的一種輕量級的Web Services。它以更加貼近Web特性的方式實(shí)現(xiàn)Web服務(wù)。它具有很好的松散耦合性、互操作性和可擴(kuò)展性。
船舶裝備中的中間件軟件作為底層軟件,它部署在每一臺設(shè)備上,中間件軟件與設(shè)備是一一對應(yīng)的。而應(yīng)用軟件是部署在某一臺或幾臺服務(wù)器上,它通過調(diào)用中間件來設(shè)備信息的獲取和設(shè)備管理控制。為了實(shí)現(xiàn)應(yīng)用軟件對中間件資源的統(tǒng)一調(diào)用和管理,系統(tǒng)提出一種使用Web技術(shù)來為上層應(yīng)用軟件開放提供一系列RESTful中間件接口調(diào)用的服務(wù)化體系架構(gòu)。通過調(diào)用中間件接口服務(wù)層,應(yīng)用層軟件可以實(shí)現(xiàn)分布式調(diào)用不同設(shè)備上的中間件接口,并能夠進(jìn)行對不同設(shè)備上的中間件資源進(jìn)行統(tǒng)一管理。圖1為系統(tǒng)應(yīng)用場景圖。
圖1 系統(tǒng)應(yīng)用場景圖
在實(shí)際的工程應(yīng)用中,云主機(jī)上的中間件分布具有異構(gòu)性、分散性、多樣性等特點(diǎn),不同中間件需要部署到不同的云主機(jī)上。從平臺的開放性和互操作性角度考慮,本系統(tǒng)采用二層架構(gòu)設(shè)計(jì)。圖2為系統(tǒng)架構(gòu)圖。
圖2 系統(tǒng)架構(gòu)圖
與傳統(tǒng)中間件體系結(jié)構(gòu)相比,本系統(tǒng)使用B/S(Browser/Server)系統(tǒng)架構(gòu),突破了單機(jī)限制,滿足了在云環(huán)境下中間件資源的分布式管理,具有部署簡單、管理方便的特性。系統(tǒng)劃分成服務(wù)器端和客戶端兩部分??蛻舳瞬渴鹪诎惭b有中間件的設(shè)備中,它通過加載設(shè)備中的中間件來為服務(wù)器端提供中間件接口調(diào)用服務(wù),它接收來自于服務(wù)器端的RESTful接口并返回中間件執(zhí)行結(jié)果。服務(wù)器端接收來自于上層應(yīng)用的RESTful接口,并將接口的執(zhí)行結(jié)果返回給應(yīng)用程序。它提供的RESTful接口實(shí)現(xiàn)了客戶端中間件的部署管理、中間件的池化管理、系統(tǒng)管理以及負(fù)載管理等功能。
2.2.1 客戶端功能設(shè)計(jì)
客戶端需要部署到運(yùn)行中間件的設(shè)備中,因此客戶端程序基本需要在集群中每一臺設(shè)備運(yùn)行,為了降低系統(tǒng)客戶端的功能冗余,客戶端僅僅保留中間件接口調(diào)用功能,它接收服務(wù)器端的接口調(diào)用請求,調(diào)用相關(guān)的中間件接口并將中間件執(zhí)行結(jié)果返回給服務(wù)器端。
2.2.2 客戶端功能設(shè)計(jì)
服務(wù)器端軟件可以部署在一臺性能較高的服務(wù)器中,也可以選擇一臺客戶端設(shè)備同時作為服務(wù)器。服務(wù)器端統(tǒng)一負(fù)責(zé)各個客戶端上中間件的部署管理、服務(wù)器端中間件的池化管理、RESTful接口訪問負(fù)載管理以及系統(tǒng)管理等。
1)中間件部署管理。管理客戶端設(shè)備上的中間件,包括部署中間件、移除中間件、升級中間件、中間配置參數(shù)管理等功能;
2)中間件池化管理。對系統(tǒng)中所有不同類型、不同版本的中間件資源進(jìn)行統(tǒng)一管理控制,包括上傳中間件、下載中間件、更新中間件、中間件版本控制管理、中間件配置管理等功能;
3)系統(tǒng)管理。對服務(wù)器端進(jìn)行管理,包括用戶管理、用戶權(quán)限管理、系統(tǒng)配置參數(shù)管理、客戶端管理等功能;
4)負(fù)載管理。將不同用戶、不用應(yīng)用程序提交的RESTful中間件網(wǎng)絡(luò)接口分發(fā)到不同的設(shè)備節(jié)點(diǎn)。
3.1.1 資源定義
資源分為以下幾類:
1)物理設(shè)備資源;
2)中間件資源;
3)中間件接口資源;
4)用戶資源。
3.1.2 網(wǎng)絡(luò)操作定義
系統(tǒng)RESTful接口分為以下四類[4]:
1)GET方法。用戶查詢已有的資源;
2)POST方法。用戶更新已有資源;
3)PUT方法。用戶創(chuàng)建新的資源;
4)DELETE方法。用戶刪除已有的資源。
3.1.3 狀態(tài)碼定義
應(yīng)用程序調(diào)用中間件網(wǎng)絡(luò)接口時,根據(jù)中間件執(zhí)行結(jié)果向用戶返回的狀態(tài)碼和提示信息,基本返回狀態(tài)碼定義[5]如下(方括號中是該狀態(tài)碼對應(yīng)的HTTP請求方式)。
200OK-[GET]:客戶端成功返回用戶請求的數(shù)據(jù),該操作是冪等的(Idempotent)。
201CREATED-[POST/PUT]:用戶新建或修改數(shù)據(jù)成功。
202Accepted-[*]:表示一個請求已經(jīng)進(jìn)入后臺排隊(duì)(異步任務(wù))。
204NOCONTENT-[DELETE]:用戶刪除數(shù)據(jù)成功。
400INVALIDREQUEST-[POST/PUT]:用戶發(fā)出的請求有錯誤,服務(wù)器沒有進(jìn)行新建或修改數(shù)據(jù)的操作,該操作是冪等的。
401Unauthorized-[*]:表示用戶沒有權(quán)限(令牌、用戶名、密碼錯誤)。
403Forbidden-[*]表示用戶得到授權(quán)(與401錯誤相對),但是訪問是被禁止的。
404NOTFOUND-[*]:用戶發(fā)出的請求針對的是不存在的記錄,服務(wù)器沒有進(jìn)行操作,該操作是冪等的。
500INTERNALSERVERERROR-[*]:服務(wù)器發(fā)生錯誤,用戶將無法判斷發(fā)出的請求是否成功。
系統(tǒng)中的資源分布在不同的物理設(shè)備中,為了保證服務(wù)器正確將應(yīng)用程序的RESTful請求準(zhǔn)確、快速地發(fā)送到相應(yīng)的設(shè)備上。需要制定一套路由規(guī)則完成接口的路由,像路由器的路由算法一樣,優(yōu)秀的路由設(shè)計(jì)可以讓URL地址更加簡潔和優(yōu)雅,并且容易被人理解。
常用的路由方法有以下幾種:
1)正則路由;
2)規(guī)則路由;
3)靜態(tài)路由(URL映射)。
靜態(tài)路由直觀明了,但不利于URL地址的重用,容易導(dǎo)致配置文件過大,降低地址匹配效率。正則路由使用正則表達(dá)式來解析URL地址,并將網(wǎng)絡(luò)請求重定向到相應(yīng)的網(wǎng)絡(luò)程序,雖然正則表達(dá)式簡潔高效,但正則表達(dá)式語法比較復(fù)雜,不易入門學(xué)習(xí)。因此本文使用正則表達(dá)式來支持系統(tǒng)可以對URL地址進(jìn)行路由操作。
在每一個物理節(jié)點(diǎn)中設(shè)計(jì)路由配置文件,配置文件的每一行代表一個路由規(guī)則,路由規(guī)則定義如下:
‘路由規(guī)則’=>[‘模塊名/模塊接口’,[‘method’=> ‘請求類型’],[‘匹配參數(shù)1’=>‘變量規(guī)則1’,‘匹配參數(shù)2 ’=>‘變量規(guī)則2’]……];
配置文件格式示例如下:
系統(tǒng)會按配置文件中路由規(guī)則的順序依次匹配路由規(guī)則,一旦匹配到的話,就會定位到路由定義中的控制器和操作方法去執(zhí)行中間件接口(可以傳入接口相應(yīng)的參數(shù))。
3.3.1 接口設(shè)計(jì)
http://serverName:port/devices/devID/midwares/midID/interfaces/interfaceName。這是客戶端提供給用戶的接口格式,參數(shù)說明如下。
server Name:服務(wù)器端Web域名,也可以是IP地址;
port:服務(wù)器端端軟件監(jiān)聽端口,默認(rèn)為Apache默認(rèn)監(jiān)聽端口80,可通過修改apache配置文件設(shè)置;
devices:系統(tǒng)中的物理設(shè)備資源;
devID:設(shè)備唯一標(biāo)識。通常由廠商號+設(shè)備號+通道號組成,可以唯一標(biāo)識一臺物理設(shè)備,dev-ID與設(shè)備IP地址的對應(yīng)關(guān)系反映在服務(wù)器端的配置文件中;
midwares:系統(tǒng)中的中間件資源;
midID:中間件ID。唯一標(biāo)識使用的某一個中間件,中間件ID與中間件名稱的對應(yīng)關(guān)系反映在服務(wù)器端的配置文件中;
interfaces:系統(tǒng)中的中間件接口資源;
interfaceName:中間件接口名稱,參見各個中間件技術(shù)設(shè)計(jì)文檔。
3.3.2 接口執(zhí)行流程
考慮到客戶端需要部署到每一臺設(shè)備的實(shí)際情況,客戶端設(shè)計(jì)時采用功能最小化原則。因此用戶調(diào)用客戶端提供的RESTful接口并不是直接將HTTP請求發(fā)送到客戶端,而是發(fā)送到服務(wù)器端,服務(wù)器端先進(jìn)行權(quán)限認(rèn)證,認(rèn)證通過后解析接口的URL,并根據(jù)其中的devID將請求轉(zhuǎn)發(fā)到相應(yīng)的客戶端,客戶端調(diào)用部署在本地設(shè)備的中間件接口并將程序結(jié)果返回給服務(wù)器,最后服務(wù)器將結(jié)果封裝成統(tǒng)一的JSON數(shù)據(jù)并返回給用戶。
圖3 客戶端執(zhí)行流程圖
客戶端的執(zhí)行流程圖如圖3所示??蛻舳耸紫扰袛嗑W(wǎng)絡(luò)請求是否合法,由于客戶端不能進(jìn)行權(quán)限驗(yàn)證,因此它通過判斷是否是服務(wù)器端發(fā)起的網(wǎng)絡(luò)接口調(diào)用來實(shí)現(xiàn),即客戶端僅僅接受服務(wù)器端的中間件接口調(diào)用請求,若請求端不是服務(wù)器端,則認(rèn)為是一個非法的網(wǎng)絡(luò)請求。若請求合法,則解析HTTP請求body中的參數(shù)信息,根據(jù)參數(shù)加載相應(yīng)的中間件并調(diào)用相應(yīng)的中間件接口。中間件接口執(zhí)行完成后客戶端將執(zhí)行結(jié)果返回給服務(wù)器。
3.4.1 接口設(shè)計(jì)
服務(wù)器端管理的資源包括中間件資源、用戶資源、中間件資源,三種資源之間是多對多的關(guān)系,服務(wù)器端使用XML配置文件來描述系統(tǒng)資源之間的關(guān)系。以下是對三種資源的RESTful接口設(shè)計(jì)。
1)中間件部署管理
物理節(jié)點(diǎn)上的中間件管理。包括部署中間件、移除中間件、升級中間件、中間配置參數(shù)管理等。接口設(shè)計(jì)如下:
表1 中間件部署管理路由設(shè)計(jì)
2)中間件池化管理
中間件池化管理。包括上傳中間件、下載中間件、更新中間件、中間件版本控制管理、中間件配置管理等。接口設(shè)計(jì)如表2。
表2 中間件池化管理路由設(shè)計(jì)
表3 系統(tǒng)管理路由設(shè)計(jì)
3)系統(tǒng)管理
系統(tǒng)管理。包括用戶管理、用戶權(quán)限管理、系統(tǒng)配置參數(shù)管理、物理節(jié)點(diǎn)配置管理等。接口設(shè)計(jì)如表3。
3.4.2 API執(zhí)行流程
圖4為服務(wù)器端執(zhí)行流程。
圖4 服務(wù)器端API執(zhí)行流程
1)URL訪問檢測
上層應(yīng)用在調(diào)用中間件網(wǎng)絡(luò)接口時,必須提供一種身份認(rèn)證機(jī)制,具體做法是先發(fā)送一個用戶登錄請求到服務(wù)器端,服務(wù)器端會產(chǎn)生一對臨時密鑰,公鑰存在服務(wù)器,私鑰發(fā)送給應(yīng)用程序,用于用戶權(quán)限驗(yàn)證;只有訪問檢測通過,中間件接口調(diào)用請求才會受理。密鑰獲取方法如下:
返回信息如下:
所有對資源訪問的請求,都需要設(shè)置Authorization(授權(quán))請求頭,并加上自己的access_token,會話結(jié)束后密鑰也隨之失效。
2)路由檢測
將網(wǎng)絡(luò)URL與路由表中的路由進(jìn)行匹配,如果一旦檢測到匹配的路由,根據(jù)定義的路由地址會注冊到相應(yīng)的URL調(diào)度。
3)分發(fā)請求
完成了URL檢測和路由檢測之后,路由器會分發(fā)請求到對應(yīng)的路由地址,這也是應(yīng)用請求的生命周期中最重要的一個環(huán)節(jié)。
根據(jù)URL中的DevID參數(shù)將請求直接分發(fā)請求到設(shè)備ID相對應(yīng)的重定向地址,支持指定重定向代碼,默認(rèn)為301重定向。
4)響應(yīng)輸出
將客戶端返回的數(shù)據(jù)輸出到頁面或者應(yīng)用程序。特別的,對于耗時較長的接口調(diào)用,客戶端程序無法實(shí)時返回接口執(zhí)行結(jié)果,為此系統(tǒng)需要對此類請求作相應(yīng)的處理,對應(yīng)狀態(tài)碼設(shè)計(jì)中的202返回值,并返回一個輪詢IP地址,其他設(shè)備可以調(diào)用這個輪詢IP查詢提交任務(wù)的執(zhí)行狀態(tài),若任務(wù)執(zhí)行完成,則返回200狀態(tài)碼。
本文根據(jù)云計(jì)算環(huán)境下船舶信息基礎(chǔ)平臺對中間件所承載的各類資源共享的需求,分析了在云計(jì)算集群中實(shí)現(xiàn)中間件服務(wù)化的可行性,提出了一種基于RESTful技術(shù)的二層中間件服務(wù)化體系架構(gòu),并對該架構(gòu)中的接口標(biāo)準(zhǔn)和執(zhí)行流程提出設(shè)計(jì)方案,為在船舶信息基礎(chǔ)平臺中實(shí)現(xiàn)中間件數(shù)據(jù)資源共享、系統(tǒng)動態(tài)重組重構(gòu)提供了有效的解決途徑。