林志煌,張菽妍,趙蓮芬
(廣州軟件學(xué)院網(wǎng)絡(luò)技術(shù)系,廣州 510990)
21世紀(jì)人類面臨的最大機(jī)遇是計算機(jī)語言,計算機(jī)語言將成為科技創(chuàng)新的核心動力,因此就需要結(jié)合新教改的要求創(chuàng)新教學(xué)模式,加強(qiáng)高校學(xué)生的編程實踐能力,提高學(xué)生編程興趣。在如今的計算機(jī)課程實驗教學(xué)中,大部分老師都是使用PaaS平臺進(jìn)行教學(xué),雖然PaaS平臺提供了比較完善的開發(fā)環(huán)境,但由于PaaS的很多基礎(chǔ)構(gòu)建都是基于虛擬機(jī)運(yùn)行的,導(dǎo)致計算機(jī)資源大量消耗,出現(xiàn)資源利用率低下等問題。同時高校學(xué)生在開發(fā)應(yīng)用、編程等課程中需要更為穩(wěn)定的開發(fā)環(huán)境來進(jìn)行相關(guān)實驗。對于初學(xué)者而言,需要在電腦本地部署好計算機(jī)語言需要的編譯環(huán)境,安裝相關(guān)的開發(fā)工具,安裝開發(fā)插件等。在這個過程中,由于電腦硬件環(huán)境不同以及安裝過程的某些特殊原因?qū)е碌陌惭b失敗等問題頻繁發(fā)生,難以找到合適的解決方式,嚴(yán)重地打擊了編程初學(xué)者的學(xué)習(xí)熱情,高校內(nèi)的學(xué)生更有可能因為配置環(huán)境問題無法在非上課時間進(jìn)行課程實踐。本平臺通過docker容器技術(shù)結(jié)合瀏覽器遠(yuǎn)程訪問服務(wù)器內(nèi)統(tǒng)一配置好的容器,無需考慮硬件環(huán)境及電腦配置,可以做到所有學(xué)生統(tǒng)一環(huán)境進(jìn)行實驗,這將有效提升學(xué)生的編程課程效率及穩(wěn)定性。
Docker是Docker.Lnc公司開源的一個基于LXC技術(shù)搭建的Container容器引擎,該引擎的源代碼托管在Github上。Docker使用Google公司推出的Go語言進(jìn)行開發(fā)實現(xiàn),基于Linux內(nèi)核的cgroup,namespace以 及OverlayFS類的Union FS等技術(shù),對進(jìn)程進(jìn)行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。傳統(tǒng)虛擬機(jī)攜帶有操作系統(tǒng),很小的應(yīng)用程序卻因為攜帶了操作系統(tǒng)而變得十分笨重,而docker容器內(nèi)的應(yīng)用程序是直接調(diào)用宿主機(jī)的cpu、磁盤等,容器沒有自己的內(nèi)核,也沒有虛擬硬件,因此比較輕便。每個容器間是相互隔離的,每個容器內(nèi)部都有一個屬于自己的文件系統(tǒng),通過隔離機(jī)制可以將服務(wù)器利用到極致。由于Docker底層使用LXC來實現(xiàn),LXC將linux進(jìn)程沙盒化,使得進(jìn)程之間彼此隔離,并且能夠控制各進(jìn)程的資源分配。
Docker中包含三個基本的概念:鏡像(image)、容器(container)和倉庫(repository)。鏡像通常是一個只讀文件,它的功能是用于創(chuàng)建容器,且創(chuàng)建出來的容器與鏡像文件完全相同,唯一的區(qū)別在于容器是可讀寫的。只有容器才能用于運(yùn)行程序,每一個容器之間是相互隔離的,可以理解為一臺輕量化的虛擬機(jī)。在此基礎(chǔ)上,容器也可以反過來用于構(gòu)建鏡像。倉庫即集中存放鏡像文件的場所。
傳統(tǒng)虛擬機(jī)是虛擬出一套硬件,運(yùn)行一個完整的操作系統(tǒng),其本質(zhì)是一臺物理機(jī)上模擬出多臺虛擬服務(wù)器,可以在這個虛擬服務(wù)器上安裝與運(yùn)行軟件,因而其占用的硬件資源較多,啟動較慢。而Docker容器不封裝整個操作系統(tǒng),基于主機(jī)內(nèi)核通過Docker守護(hù)程序主機(jī)進(jìn)程執(zhí)行,是內(nèi)核級別的虛擬化,可以在一個物理機(jī)上運(yùn)行多個容器實例。具有輕量化、啟動快、占用資源少等特點。
當(dāng)容器需要回滾時,新容器替代容器的整個過程秒級完成,而傳統(tǒng)虛擬化技術(shù)由于依賴項可能不同,更有可能產(chǎn)生沖突,因此傳統(tǒng)虛擬化技術(shù)做回滾時比較困難。
本編程平臺基于混合云環(huán)境,發(fā)揮了公有云和私有云兩類云平臺的優(yōu)勢,擴(kuò)展了本編程平臺的技術(shù)基礎(chǔ),提高平臺的可用性與便捷性,降低了信息化投入成本的同時保障了數(shù)據(jù)的安全性。利用Docker容器技術(shù)和Web技術(shù),將傳統(tǒng)的實驗室機(jī)房環(huán)境轉(zhuǎn)移至云環(huán)境中,學(xué)生通過瀏覽器就能使用云主機(jī)進(jìn)行課程的實驗。在實驗過程中,學(xué)生不僅可以根據(jù)教師上傳的實驗指導(dǎo)書和建立的云實驗環(huán)境進(jìn)行實驗,而且可以編輯實驗筆記,保存或上傳實驗結(jié)果。該平臺還提供實驗社區(qū)、綜合協(xié)作實驗、實驗資源和系統(tǒng)資源的監(jiān)控管理等。
本編程平臺服務(wù)者主要由學(xué)生和教師組成。學(xué)生在本平臺上通過用戶鑒權(quán)登錄后,查看實驗列表,選擇自己所要學(xué)習(xí)的課程,連接遠(yuǎn)程主機(jī)就可以開始學(xué)習(xí),并且同時可以查看實驗文檔,實驗完成后,通過實驗完成檢查退出、斷開遠(yuǎn)程主機(jī),上傳或下載文件,即可完成本次實驗。教師通過用戶鑒權(quán)登錄后,可以進(jìn)行實驗文檔編輯,選擇本次實驗所需要的環(huán)境,便可以發(fā)布實驗,同時可以管理實驗,對實驗再次編輯。管理員主要管理用戶、實驗內(nèi)容、服務(wù)器主機(jī)、環(huán)境鏡像等。角色設(shè)計如圖1所示。
圖1 角色設(shè)計
該平臺在面對大量實驗參與者連接遠(yuǎn)程主機(jī)的情況下,每一個參與者平均需要近300 MB的主機(jī)內(nèi)存及根據(jù)參與者主機(jī)運(yùn)行程序決定的cpu消耗。為了防止容器中的性能占用過高,在創(chuàng)建容器時需要提前設(shè)置相關(guān)參數(shù)限制容器性能消耗,在出現(xiàn)過高消耗時docker會殺死當(dāng)前容器。同時在每一次創(chuàng)建容器時對當(dāng)前剩余內(nèi)存及cpu進(jìn)行查詢,若不滿足新容器的創(chuàng)建就將連接放入隊列中,等待其他容器銷毀后再進(jìn)行連接。若大量實驗參與者同時進(jìn)入導(dǎo)致部分容器創(chuàng)建失敗則會觸發(fā)事務(wù)回滾,避免了數(shù)據(jù)庫數(shù)據(jù)與服務(wù)器中實際狀況不同步。
使用Docker容器化技術(shù)搭建分布式服務(wù)器集群為用戶提供穩(wěn)定、可靠的在線虛擬操作環(huán)境。在云服務(wù)器中搭建各個實驗環(huán)境的Docker鏡像,在鏡像中配置noVNC實現(xiàn)瀏覽器訪問。在云服務(wù)器中基于鏡像生成容器,各個容器的端口地址使用動態(tài)分配算法。容器具有隔離性,某個用戶的容器發(fā)生問題不會影響其他用戶的容器,也不會對服務(wù)器集群產(chǎn)生問題,具備較高的安全性。
本平臺在Windows10環(huán)境中使用visual studio code(簡稱VS code)的源代碼編輯器進(jìn)行前后端開發(fā)。使用Navicat進(jìn)行可視化的數(shù)據(jù)庫管理,使用postman接口測試工具進(jìn)行后端接口測試。使用Google Chrome瀏覽器進(jìn)行前端頁面開發(fā)調(diào)試。通過apidoc生成后端的接口文檔。
用戶端主要功能有:用戶通過鑒權(quán)登錄編程平臺,查看實驗列表、連接遠(yuǎn)程主機(jī)、斷開主機(jī)連接、上傳下載文件、實驗完成檢查、刷新實驗主機(jī)、查看實驗文檔。
3.2.1 用戶鑒權(quán)功能實現(xiàn)
用戶鑒權(quán)模塊用于用戶登陸功能,用戶在登陸時需要輸入手機(jī)號碼,點擊發(fā)送驗證碼按鈕,前端將用戶請求發(fā)送至后端,后端發(fā)送調(diào)用騰訊云接口,將驗證碼短信發(fā)送至用戶手機(jī)中。用戶獲取驗證碼后,需要輸入驗證碼,并點擊登陸按鈕。
3.2.2 用戶連接遠(yuǎn)程主機(jī)功能實現(xiàn)
當(dāng)用戶請求連接主機(jī)時,遠(yuǎn)程主機(jī)先查詢實現(xiàn)環(huán)境的鏡像id,再根據(jù)鏡像信息生成容器并運(yùn)行,并根據(jù)端口分配算法為容器映射一個端口,將端口與服務(wù)器域名拼接生成一個完整地址后返回給用戶,用戶即可在瀏覽器中進(jìn)入服務(wù)器的編程環(huán)境。連接過程架構(gòu)圖如圖2所示,流程圖如圖3所示,連接成功后的頁面如圖4所示。
圖2 用戶連接遠(yuǎn)程主機(jī)過程圖
圖3 用戶連接主機(jī)流程圖
圖4 用戶連接主機(jī)成功后的初始頁面
教師通過鑒權(quán)登錄到教師端,可查看實驗列表、連接遠(yuǎn)程主機(jī)、斷開主機(jī)連接、上傳下載文件、實驗發(fā)布、實驗管理、實驗文檔查看、刷新實驗主機(jī)、查看實驗文檔。
3.3.1 實驗發(fā)布功能的實現(xiàn)
實驗的發(fā)布需要教師填寫發(fā)布表單,表單中包含有實驗的標(biāo)題、簡介、實驗環(huán)境等內(nèi)容。在用戶正確填寫表單并點擊發(fā)布后,后端將表單數(shù)據(jù)插入數(shù)據(jù)庫并為用戶生成一臺根據(jù)用戶表單中信息所選擇的實驗環(huán)境的容器,教師在實驗管理頁面可以查看到自己發(fā)布后暫未編輯章節(jié)的實驗。
教師點擊完善實驗章節(jié)按鈕向后端發(fā)送請求,后端響應(yīng)后將測試環(huán)境的網(wǎng)址返回至前端,前端收到網(wǎng)址后將數(shù)據(jù)渲染至頁面,教師進(jìn)入測試實驗環(huán)境中,即可以開始實驗并編輯章節(jié),編輯章節(jié)完成后用戶點擊編輯完成按鈕,將章節(jié)數(shù)據(jù)發(fā)送至后端,后端將章節(jié)數(shù)據(jù)插入章節(jié)表中,實驗發(fā)布完成。
圖5 編輯實驗文檔頁面
3.3.2 實驗文檔上傳下載功能的實現(xiàn)
實驗文檔上傳功能是前端通過http庫axios中的post方法向后端發(fā)送文件數(shù)據(jù),后端接收到數(shù)據(jù)后存儲于指定主機(jī)隨機(jī)碼位置的靜態(tài)文件夾,上傳后可以通過遠(yuǎn)程主機(jī)的目錄直接查看。文件上傳成功后會在數(shù)據(jù)庫文件表中插入一條新數(shù)據(jù)用于存儲文件名及文件的外部訪問路徑。文件的下載功能通過瀏覽器直接訪問文件的外部訪問路徑來實現(xiàn)。實驗上傳下載功能實現(xiàn)界面如圖6所示。
圖6 上傳下載功能
管理員可進(jìn)行連接管理、主機(jī)管理、實驗管理、環(huán)境管理、新建實驗環(huán)境、用戶管理。后臺界面如圖7所示。
圖7 后臺界面
該編程平臺基于混合云環(huán)境,利用Docker容器技術(shù)結(jié)合Web技術(shù)構(gòu)建基于瀏覽器的多用戶同時在線且彼此間互不干擾的在線實現(xiàn)平臺。相對于傳統(tǒng)的編程平臺,在線虛擬編程平臺不僅能夠打破時間和地點的限制,讓學(xué)生能有更多的機(jī)會來接觸和研究所做的實驗,而且還能培養(yǎng)他們以理論聯(lián)系實際的思維方式以及自主創(chuàng)新的能力。在線編程平臺可以同時提供實驗和資源的共享,這種共享可以基于校內(nèi)或者校外,提供隨時隨地在線學(xué)習(xí)和實踐資源?;贒ocker容器技術(shù)的在線編程平臺具備靈活性和共享性等優(yōu)勢,能夠極大地節(jié)約資源,提高學(xué)習(xí)者的學(xué)習(xí)興趣以及綜合實踐能力,具有廣闊的應(yīng)用前景。