文/蔡建坤
目前,中南地區(qū)空管業(yè)務(wù)系統(tǒng)由后臺服務(wù)和客戶端組成,在系統(tǒng)架構(gòu)上,一般采用傳統(tǒng)架構(gòu)。隨著空中交通管制理念的提升,管制部門對系統(tǒng)的依賴越來越大,對系統(tǒng)功能需求也越來越多,傳統(tǒng)的系統(tǒng)架構(gòu)在快速響應(yīng)管制需求及系統(tǒng)運(yùn)行要求上逐漸乏力。
在后臺服務(wù)端,限于項(xiàng)目范圍,一般只有一套資源支持業(yè)務(wù)系統(tǒng)的運(yùn)行。在系統(tǒng)上線后,當(dāng)出現(xiàn)用戶需求新增或者需求變更時(shí),需要在與生產(chǎn)環(huán)境相隔離的測試環(huán)境里面進(jìn)行測試驗(yàn)證后采用上線。由于測試環(huán)境與生產(chǎn)環(huán)境總存在一些差異,無法做到完全相同,因此雖新軟件在測試環(huán)境驗(yàn)證通過后,在生產(chǎn)環(huán)境仍存在不正常的情況。
在客戶端,傳統(tǒng)軟件架構(gòu)通過程序主體實(shí)現(xiàn),每一次的程序集成和代碼維護(hù)都需要重新編譯與鏈接源代碼和重新發(fā)布新軟件。在系統(tǒng)發(fā)布流程上,這種程序設(shè)計(jì)方式導(dǎo)致新軟件的發(fā)布都需要對該程序的所有功能進(jìn)行系統(tǒng)測試才能發(fā)布,給用戶和單位都造成時(shí)間及人力的浪費(fèi)。
因此,在現(xiàn)有運(yùn)行環(huán)境的約束下,研究一種支持相互隔離、穩(wěn)定可靠、部署簡便且可同時(shí)運(yùn)行多版本的系統(tǒng)架構(gòu)設(shè)計(jì)方案將可極大的降低功能上線失敗的風(fēng)險(xiǎn),且該架構(gòu)應(yīng)在穩(wěn)定安全的基礎(chǔ)上,可實(shí)現(xiàn)功能的快速交付。

圖1:基于Docker容器的后端架構(gòu)示意圖

圖2:基于插件式軟件架構(gòu)的客戶端架構(gòu)示意圖
Docker項(xiàng)目的目標(biāo)是實(shí)現(xiàn)一次性構(gòu)建的輕量級系統(tǒng)虛擬化解決方案,重新定義了程序開發(fā),交付和部署過程。基于linux容器,Docker更具包容性,因此用戶無需關(guān)心容器的管理,從而使操作更容易。操作Docker容器用戶就像操作快速,輕量級的虛擬機(jī)一樣簡單。
除了運(yùn)行應(yīng)用程序之外,Docker容器基本上不消耗額外的系統(tǒng)資源,這使得應(yīng)用程序性能較高且系統(tǒng)開銷較小。Docker容器作為系統(tǒng)中的進(jìn)程存在,與正常進(jìn)程沒有區(qū)別。Docker在這些方面具有很大的優(yōu)勢。
(1)安全性:可實(shí)現(xiàn)空管業(yè)務(wù)系統(tǒng)各應(yīng)用之間不僅限于應(yīng)用層隔離,還獨(dú)立于底層基礎(chǔ)架構(gòu)。
(2)更快速的交付和部署:空管業(yè)務(wù)系統(tǒng)運(yùn)維人員可直接部署開發(fā)人員使用的容器。
(3)更輕松的遷移和擴(kuò)展:可在任意的平臺上運(yùn)行,亦可在任意不同平臺間遷移。
(4)更簡單的管理:對空管業(yè)務(wù)系統(tǒng)的修改都以增量的方式被分發(fā)和更新,自動(dòng)化且高效。
(5)多版本應(yīng)用管理:可同時(shí)支持多個(gè)版本在線。
插件的本質(zhì)在于不修改程序主體的情況下對軟件功能進(jìn)行擴(kuò)展與加強(qiáng),當(dāng)插件的接口公開后,系統(tǒng)可以通過實(shí)現(xiàn)插件來增加新的功能,也就是實(shí)現(xiàn)真正意義上的“即插即用”的軟件。
插件式客戶端架構(gòu)將要開發(fā)的目標(biāo)軟件劃分為兩部分,將軟件系統(tǒng)的核心或基礎(chǔ)作為一部分,將次要功能或易變功能作為另一部分,及為插件。插件完成的功能是擴(kuò)展和補(bǔ)充程序的主要功能。
采用插件式客戶端架構(gòu)的優(yōu)點(diǎn):
(1)實(shí)現(xiàn)空管業(yè)務(wù)系統(tǒng)軟件組件的“即插即用”;
(2)在二進(jìn)制級上集成軟件,減少空管業(yè)務(wù)系統(tǒng)軟件重新編譯與發(fā)布麻煩與時(shí)間;
(3)能夠很好實(shí)現(xiàn)空管業(yè)務(wù)系統(tǒng)軟件的分工開發(fā);
(4)可較好實(shí)現(xiàn)空管業(yè)務(wù)系統(tǒng)代碼隱藏,保護(hù)知識產(chǎn)權(quán)。
本節(jié)對后臺服務(wù)采用Docker架構(gòu)、客戶端采用插件式軟件架構(gòu)的設(shè)計(jì)方法進(jìn)行描述。
基于Docker架構(gòu)的后端服務(wù)由操作系統(tǒng)、Docker、二進(jìn)制文件/庫、功能服務(wù)組成。操作系統(tǒng)提供系統(tǒng)運(yùn)行的基礎(chǔ)平臺,Docker提供容器運(yùn)行所需運(yùn)行時(shí)庫,二進(jìn)制文件/庫則為功能服務(wù)提供業(yè)務(wù)功能運(yùn)行時(shí)庫,功能服務(wù)則為客戶端提供服務(wù)調(diào)用。
每個(gè)功能服務(wù)利用Docker容器進(jìn)行部署。如圖1所示。功能服務(wù)基于Docker層運(yùn)行,利用Docker技術(shù)提供的功能,支撐應(yīng)用的運(yùn)行。每個(gè)Docker容器提供一種功能服務(wù),例如數(shù)據(jù)庫Docker容器提供數(shù)據(jù)庫業(yè)務(wù),中間件Docker容器提供中間件業(yè)務(wù)。由于Docker容器的應(yīng)用隔離特點(diǎn),數(shù)據(jù)庫Docker容器和中間件Docker容器相互隔離,任一Docker容器的退出不影響其他容器。
如圖2所示,基于插件式軟件架構(gòu)的客戶端程序由功能界面、程序主體、插件管理組件、功能插件組成。
功能界面主要完成功能展示功能,為用戶提供業(yè)務(wù)功能的界面入口。
程序主體主要完成業(yè)務(wù)系統(tǒng)的主要產(chǎn)品功能,這一部分的功能應(yīng)該是項(xiàng)目建設(shè)時(shí)便已經(jīng)明確的。
插件管理組件主要完成對插件的管理,提供加載、卸載、啟用、禁用等功能。
功能插件則為本系統(tǒng)的部分功能實(shí)現(xiàn),包括系統(tǒng)的擴(kuò)展功能、易變更的功能實(shí)現(xiàn)。
熱部署架構(gòu)后端采用linux系統(tǒng)進(jìn)行部署,客戶端采用c#語言進(jìn)行開發(fā)。以下以中間件升級為例,對熱部署功能進(jìn)行說明。
開發(fā)人員在完成中間件的功能升級后,交付了一個(gè)中間件服務(wù)v2的Docker容器和一個(gè)調(diào)用中間件服務(wù)v2的中間件插件v2組件。由于采用Docker容器,中間件服務(wù)v2的Docker容器與原中間件服務(wù)v1的Docker容器相互獨(dú)立,互不影響。中間件插件也是。如圖3所示,按以下5個(gè)步驟便可實(shí)現(xiàn)在線熱部署升級:
(1)在原服務(wù)器內(nèi)運(yùn)行新Docker容器;
(2)將中間件插件v2組件拷貝到客戶端插件目錄下;
(3)通過插件管理組件禁用中間件插件v1;
(4)通過插件管理組件啟用中間件插件v2;
(5)重啟客戶端程序。
如遇問題需進(jìn)行回退時(shí),只需以下三個(gè)步驟:
(1)通過插件管理組件禁用中間件插件v2;
(2)通過插件管理組件啟用中間件插件v1;
(3)重啟客戶端程序。
本文分析了Docker容器的關(guān)鍵技術(shù)和插件式客戶端架構(gòu),設(shè)計(jì)并實(shí)現(xiàn)了基于Docker和插件的熱部署架構(gòu)方案。本文提出的架構(gòu)方案切中空管業(yè)務(wù)系統(tǒng)面臨的實(shí)際問題,實(shí)現(xiàn)難度低,具有優(yōu)秀的安全性和擴(kuò)展性,還能實(shí)現(xiàn)業(yè)務(wù)的快速迭代,持續(xù)集成和部署。