郝亞平
(常州工業職業技術學院,江蘇 常州213000)
MNSS 平臺是基于開源軟件的虛擬仿真教學實驗平臺,旨在利用瀏覽器實現在線虛擬仿真實驗[1]。MNSS 綜合利用云計算、虛擬化、linux bridge 等技術[2],同時整合了眾多優秀的開源底層軟件作為基礎,構建了一個以云計算技術為基礎的“高性能、集中式、開放性”兼具的創新型在線實驗平臺。可以很好的應用于教學、科研、實踐等方面[3-4]。
MNSS 平臺主要由一臺管理機服務器、一臺原型機服務器與執行機服務器群構成,并且在平臺中集成了眾多的開源底層軟件。由于其系統架構龐大,導致管理、運營和維護較為復雜,因而如何提升平臺的可維護性、可拓展性與安全性變得尤為重要[5]。目前,平臺的運營和管理比較零散,缺乏統一的平臺架構。
為了解決以上的問題,我們以Python 開源庫Fire 為基礎,將系統底層中的命令行以功能進行統一分類,并進行二次封裝,采用命名加參數的形式進行調用,該架構不僅可以使命令行更加安全的運行,并且在開發過程中,提高開發人員的二次開發效率,增加平臺的可維護性與可拓展性。
Fire 是谷歌團隊開源的Python 庫,用于將Python 代碼自動轉換為代碼行(CLI),開發者不需要定義參數,設置幫助信息,也不需要編寫具體執行代碼的main 函數。相反,開發者只需從main 模塊調用“Fire”函數,其余工作全部交由Python Fire 來完成。
Fire 的實現原理如圖1 所示,采用Fire 編寫命令行中的參數順序和代碼內部對象的樹狀層次結構是直接對應的關系。如果fire 不帶參數暴露了當前的模塊,那么第一個參數就應該是這個模塊內部的函數名、類名或者是變量名。如果第一個參數是函數,那么接下來的參數就是函數的參數。如果第一個參數是類,那么接下來的參數可以用這個類實例內部的方法或者字段。如果第一個參數是變量名,后面沒有參數的話,就直接顯示這個變量。如果后面還有參數,那么就把這個變量看成一個對象,然后繼續使用后續參數來深入解析這個對象。由于Fire 可以使開發人員專注于方法本身,而不需要考慮如何轉變為命令,非常實用,因此我們采用Fire 將MNSS 平臺的運營、管理、開發等工作轉化為命令行,實現底層代碼和上層顯示的隔離。
在Python 里面所有的變量都是對象,包括普通的整數、字符串、浮點數、布爾值等。理論上可以一直將對象結構遞歸下去,形成一個復雜的鏈式調用。
MNSS 采用集群式服務器設計,并集成了眾多開源底層軟件,為了保障系統底層命令行的運行安全,提升系統可維護性和可拓展性,我們以Python 開源庫Fire 為基礎,重新設計了一套針對MNSS 平臺的命令集。

圖1 Fire 原理圖
MNSS 平臺在物理架構上主要由一臺管理機服務器、一臺原型機服務器與若干執行機服務器群組成,如圖2 所示:

圖2 MNSS 架構圖
管理機服務器:主要實現用戶管理、資源管理、執行機管理和運維管理。
原型機服務器:為執行機的運行提供共性資源,如實驗拓撲、視頻教程、用戶數據、虛擬元器件等等。
執行機服務器集群:執行機服務器集群主要由若干執行機組成,執行機掛載原型機服務器中的資源。執行機為用戶仿真提供計算資源、內存資源、存儲資源等必要的資源,在用戶登錄期間,每個用戶與一臺執行機動態綁定,當用戶退出后,執行機資源將動態釋放。通過不斷增加執行機的數量,可以滿足MNSS的共同在線用戶數量。每個執行機的資源都是可以靈活調配的,管理員可以通過增加執行機的CPU、內存、網絡等資源,為每個用戶動態配置所需的資源。
我們以Fire 為設計思路,將MNSS 底層的命令行按照功能進行統一分類。其重構包括以下步驟:第一步,由于目前MNSS底層軟件中,有大量以Python 語言為基礎的軟件,我們可以將此類軟件接口直接使用Fire 進行重寫,按照其功能,在調用時統一分類;第二步,將MNSS 平臺對于底層命令行的調用按照功能進行統一分類,包含之前對于Python 的命令行調用,并二次封裝;第三步,按照功能對二次封裝的接口進行統一分類命名,并按照Fire 的原理,命名層次結構與功能進行一一對應。
我們統一將封裝后命令行以mnss 作為一級名稱,以系統模塊作為二級名稱,以功能作為三級名稱,以具體實現作為四級名稱,中間以空格分隔。具體模塊分類如圖3 所示。

圖3 命名模塊結構圖
我們以基礎組件模塊為例,其命名結構如圖4 所示。

圖4 基礎模塊命名結構圖
我們以用戶登錄MNSS 后,對執行機服務器的性能優化為例進行命令行的重構。MNSS 平臺在每個用戶登錄執行機的時候,為避免某些進程重復開啟或某些應用的內存需要進行清理,在登錄代碼中,我們加入了進程清理與內存釋放的代碼,代碼如下:

我們將此段代碼進行二次封裝到統一命令行運行類中,按照功能命名為:mnss performance login_operation clean,封裝后的代碼如下:

重構完成后,我們可以看到,對于開發人員來說,不僅提高了代碼可讀性,而且,在后續開發中,如若添加或修改性能優化命令行時,只需要在統一命令行運行類中,將對應命名的方法進行修改就可以完成,對于復用性比較高的命令行來說,此架構可以大大提高開發效率,并且由于統一分類,可以大大提升平臺的可維護性和可拓展性。
本文以Python 開源庫Fire 為設計思路,重新設計了一套MNSS 平臺底層中命令行的設計架構。該架構不僅將MNSS 底層中的Python 命令行使用Fire 進行優化,更采用Fire 的設計思路,將MNSS 底層命令行按功能統一分類,并進行二次封裝,采用命名加參數的方式進行調用,使命令行更加安全的運行,并且在開發過程中,可以提高開發人員的二次開發效率,提升平臺的可維護性與可拓展性。