郝亞平
(常州工業(yè)職業(yè)技術(shù)學(xué)院,江蘇 常州213000)
MNSS 平臺(tái)是基于開源軟件的虛擬仿真教學(xué)實(shí)驗(yàn)平臺(tái),旨在利用瀏覽器實(shí)現(xiàn)在線虛擬仿真實(shí)驗(yàn)[1]。MNSS 綜合利用云計(jì)算、虛擬化、linux bridge 等技術(shù)[2],同時(shí)整合了眾多優(yōu)秀的開源底層軟件作為基礎(chǔ),構(gòu)建了一個(gè)以云計(jì)算技術(shù)為基礎(chǔ)的“高性能、集中式、開放性”兼具的創(chuàng)新型在線實(shí)驗(yàn)平臺(tái)??梢院芎玫膽?yīng)用于教學(xué)、科研、實(shí)踐等方面[3-4]。
MNSS 平臺(tái)主要由一臺(tái)管理機(jī)服務(wù)器、一臺(tái)原型機(jī)服務(wù)器與執(zhí)行機(jī)服務(wù)器群構(gòu)成,并且在平臺(tái)中集成了眾多的開源底層軟件。由于其系統(tǒng)架構(gòu)龐大,導(dǎo)致管理、運(yùn)營(yíng)和維護(hù)較為復(fù)雜,因而如何提升平臺(tái)的可維護(hù)性、可拓展性與安全性變得尤為重要[5]。目前,平臺(tái)的運(yùn)營(yíng)和管理比較零散,缺乏統(tǒng)一的平臺(tái)架構(gòu)。
為了解決以上的問題,我們以Python 開源庫(kù)Fire 為基礎(chǔ),將系統(tǒng)底層中的命令行以功能進(jìn)行統(tǒng)一分類,并進(jìn)行二次封裝,采用命名加參數(shù)的形式進(jìn)行調(diào)用,該架構(gòu)不僅可以使命令行更加安全的運(yùn)行,并且在開發(fā)過程中,提高開發(fā)人員的二次開發(fā)效率,增加平臺(tái)的可維護(hù)性與可拓展性。
Fire 是谷歌團(tuán)隊(duì)開源的Python 庫(kù),用于將Python 代碼自動(dòng)轉(zhuǎn)換為代碼行(CLI),開發(fā)者不需要定義參數(shù),設(shè)置幫助信息,也不需要編寫具體執(zhí)行代碼的main 函數(shù)。相反,開發(fā)者只需從main 模塊調(diào)用“Fire”函數(shù),其余工作全部交由Python Fire 來完成。
Fire 的實(shí)現(xiàn)原理如圖1 所示,采用Fire 編寫命令行中的參數(shù)順序和代碼內(nèi)部對(duì)象的樹狀層次結(jié)構(gòu)是直接對(duì)應(yīng)的關(guān)系。如果fire 不帶參數(shù)暴露了當(dāng)前的模塊,那么第一個(gè)參數(shù)就應(yīng)該是這個(gè)模塊內(nèi)部的函數(shù)名、類名或者是變量名。如果第一個(gè)參數(shù)是函數(shù),那么接下來的參數(shù)就是函數(shù)的參數(shù)。如果第一個(gè)參數(shù)是類,那么接下來的參數(shù)可以用這個(gè)類實(shí)例內(nèi)部的方法或者字段。如果第一個(gè)參數(shù)是變量名,后面沒有參數(shù)的話,就直接顯示這個(gè)變量。如果后面還有參數(shù),那么就把這個(gè)變量看成一個(gè)對(duì)象,然后繼續(xù)使用后續(xù)參數(shù)來深入解析這個(gè)對(duì)象。由于Fire 可以使開發(fā)人員專注于方法本身,而不需要考慮如何轉(zhuǎn)變?yōu)槊?,非常?shí)用,因此我們采用Fire 將MNSS 平臺(tái)的運(yùn)營(yíng)、管理、開發(fā)等工作轉(zhuǎn)化為命令行,實(shí)現(xiàn)底層代碼和上層顯示的隔離。
在Python 里面所有的變量都是對(duì)象,包括普通的整數(shù)、字符串、浮點(diǎn)數(shù)、布爾值等。理論上可以一直將對(duì)象結(jié)構(gòu)遞歸下去,形成一個(gè)復(fù)雜的鏈?zhǔn)秸{(diào)用。
MNSS 采用集群式服務(wù)器設(shè)計(jì),并集成了眾多開源底層軟件,為了保障系統(tǒng)底層命令行的運(yùn)行安全,提升系統(tǒng)可維護(hù)性和可拓展性,我們以Python 開源庫(kù)Fire 為基礎(chǔ),重新設(shè)計(jì)了一套針對(duì)MNSS 平臺(tái)的命令集。
圖1 Fire 原理圖
MNSS 平臺(tái)在物理架構(gòu)上主要由一臺(tái)管理機(jī)服務(wù)器、一臺(tái)原型機(jī)服務(wù)器與若干執(zhí)行機(jī)服務(wù)器群組成,如圖2 所示:
圖2 MNSS 架構(gòu)圖
管理機(jī)服務(wù)器:主要實(shí)現(xiàn)用戶管理、資源管理、執(zhí)行機(jī)管理和運(yùn)維管理。
原型機(jī)服務(wù)器:為執(zhí)行機(jī)的運(yùn)行提供共性資源,如實(shí)驗(yàn)拓?fù)洹⒁曨l教程、用戶數(shù)據(jù)、虛擬元器件等等。
執(zhí)行機(jī)服務(wù)器集群:執(zhí)行機(jī)服務(wù)器集群主要由若干執(zhí)行機(jī)組成,執(zhí)行機(jī)掛載原型機(jī)服務(wù)器中的資源。執(zhí)行機(jī)為用戶仿真提供計(jì)算資源、內(nèi)存資源、存儲(chǔ)資源等必要的資源,在用戶登錄期間,每個(gè)用戶與一臺(tái)執(zhí)行機(jī)動(dòng)態(tài)綁定,當(dāng)用戶退出后,執(zhí)行機(jī)資源將動(dòng)態(tài)釋放。通過不斷增加執(zhí)行機(jī)的數(shù)量,可以滿足MNSS的共同在線用戶數(shù)量。每個(gè)執(zhí)行機(jī)的資源都是可以靈活調(diào)配的,管理員可以通過增加執(zhí)行機(jī)的CPU、內(nèi)存、網(wǎng)絡(luò)等資源,為每個(gè)用戶動(dòng)態(tài)配置所需的資源。
我們以Fire 為設(shè)計(jì)思路,將MNSS 底層的命令行按照功能進(jìn)行統(tǒng)一分類。其重構(gòu)包括以下步驟:第一步,由于目前MNSS底層軟件中,有大量以Python 語(yǔ)言為基礎(chǔ)的軟件,我們可以將此類軟件接口直接使用Fire 進(jìn)行重寫,按照其功能,在調(diào)用時(shí)統(tǒng)一分類;第二步,將MNSS 平臺(tái)對(duì)于底層命令行的調(diào)用按照功能進(jìn)行統(tǒng)一分類,包含之前對(duì)于Python 的命令行調(diào)用,并二次封裝;第三步,按照功能對(duì)二次封裝的接口進(jìn)行統(tǒng)一分類命名,并按照Fire 的原理,命名層次結(jié)構(gòu)與功能進(jìn)行一一對(duì)應(yīng)。
我們統(tǒng)一將封裝后命令行以mnss 作為一級(jí)名稱,以系統(tǒng)模塊作為二級(jí)名稱,以功能作為三級(jí)名稱,以具體實(shí)現(xiàn)作為四級(jí)名稱,中間以空格分隔。具體模塊分類如圖3 所示。
圖3 命名模塊結(jié)構(gòu)圖
我們以基礎(chǔ)組件模塊為例,其命名結(jié)構(gòu)如圖4 所示。
圖4 基礎(chǔ)模塊命名結(jié)構(gòu)圖
我們以用戶登錄MNSS 后,對(duì)執(zhí)行機(jī)服務(wù)器的性能優(yōu)化為例進(jìn)行命令行的重構(gòu)。MNSS 平臺(tái)在每個(gè)用戶登錄執(zhí)行機(jī)的時(shí)候,為避免某些進(jìn)程重復(fù)開啟或某些應(yīng)用的內(nèi)存需要進(jìn)行清理,在登錄代碼中,我們加入了進(jìn)程清理與內(nèi)存釋放的代碼,代碼如下:
我們將此段代碼進(jìn)行二次封裝到統(tǒng)一命令行運(yùn)行類中,按照功能命名為:mnss performance login_operation clean,封裝后的代碼如下:
重構(gòu)完成后,我們可以看到,對(duì)于開發(fā)人員來說,不僅提高了代碼可讀性,而且,在后續(xù)開發(fā)中,如若添加或修改性能優(yōu)化命令行時(shí),只需要在統(tǒng)一命令行運(yùn)行類中,將對(duì)應(yīng)命名的方法進(jìn)行修改就可以完成,對(duì)于復(fù)用性比較高的命令行來說,此架構(gòu)可以大大提高開發(fā)效率,并且由于統(tǒng)一分類,可以大大提升平臺(tái)的可維護(hù)性和可拓展性。
本文以Python 開源庫(kù)Fire 為設(shè)計(jì)思路,重新設(shè)計(jì)了一套MNSS 平臺(tái)底層中命令行的設(shè)計(jì)架構(gòu)。該架構(gòu)不僅將MNSS 底層中的Python 命令行使用Fire 進(jìn)行優(yōu)化,更采用Fire 的設(shè)計(jì)思路,將MNSS 底層命令行按功能統(tǒng)一分類,并進(jìn)行二次封裝,采用命名加參數(shù)的方式進(jìn)行調(diào)用,使命令行更加安全的運(yùn)行,并且在開發(fā)過程中,可以提高開發(fā)人員的二次開發(fā)效率,提升平臺(tái)的可維護(hù)性與可拓展性。