張嘉超
摘 要: 云服務(wù)商要提升云服務(wù),最好的方法是提供云平臺(tái)之間的移植性。在各種各樣的編程語(yǔ)言和開(kāi)發(fā)框架中,選擇合適的移植性開(kāi)發(fā)環(huán)境是必要的。文章提供了可移植性開(kāi)發(fā)環(huán)境的分析方法,提供了一個(gè)GAE和Azure之間的中間層解決方案,同時(shí)還提供了針對(duì)中間層的編程測(cè)試。
關(guān)鍵詞: 平臺(tái)即服務(wù); 可移植性; 谷歌互聯(lián)網(wǎng)應(yīng)用服務(wù)引擎(GAE); 微軟云計(jì)算平臺(tái)(Azure)
中圖分類號(hào):TP393.0 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2016)06-12-05
Abstract: To promote the cloud services, the best approach for cloud service providers is to realize the portability between the different cloud platforms. It is necessary to choose a suitable portability development environment in a variety of programming languages and development frameworks. This paper provides an approach to analyze the portability development environment, a middle-tier solution in between GAE and Azure, and the test of the middle-tier.
Key words: platform as a service; portability; GAE; Azure
0 引言
云計(jì)算是一種方便的模式,用戶按需通過(guò)網(wǎng)絡(luò)訪問(wèn)可配置的共享計(jì)算資源,(如網(wǎng)絡(luò),服務(wù)器,存儲(chǔ),應(yīng)用程序和服務(wù))。在云環(huán)境的架構(gòu)中有三種服務(wù)模式。
⑴ IaaS(基礎(chǔ)設(shè)施級(jí)服務(wù)):是位于底層的服務(wù),提供給用戶的服務(wù)是對(duì)所有計(jì)算基礎(chǔ)設(shè)施的利用,用戶能夠部署和運(yùn)行任意軟件,包括操作系統(tǒng)和應(yīng)用程序。
⑵ PaaS(平臺(tái)級(jí)服務(wù)):是中間業(yè)務(wù),提供給用戶的服務(wù)是把客戶開(kāi)發(fā)的應(yīng)用程序部署到供應(yīng)商的云計(jì)算基礎(chǔ)設(shè)施上去[1]。
⑶ SaaS(軟件級(jí)服務(wù)):提供了完整的軟件應(yīng)用。提供給客戶的服務(wù)是運(yùn)營(yíng)商運(yùn)行在云計(jì)算基礎(chǔ)設(shè)施上的應(yīng)用程序,用戶可以在各種設(shè)備上通過(guò)客戶端界面訪問(wèn)[2]。
然而,新技術(shù)總是有很多問(wèn)題。由于沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),不同廠商提供的云計(jì)算服務(wù)不能互操作和移植,這意味著開(kāi)發(fā)人員需要在兩個(gè)不同的平臺(tái)上寫兩次相同的程序。
要解決解決云可移植性問(wèn)題,本文采用的方法是提供一個(gè)應(yīng)用程序,在兩個(gè)不同的平臺(tái)上建立一個(gè)抽象層。
要實(shí)現(xiàn)的目標(biāo)是:在PaaS上讓兩個(gè)不同的PaaS廠商之間的應(yīng)用程序可移植。本文采用GAE(谷歌應(yīng)用程序引擎)和微軟Azure,使開(kāi)發(fā)人員可以在兩個(gè)PaaS之間遷移基于Python的應(yīng)用程序和數(shù)據(jù)存儲(chǔ)器。
GAE(Google App Engine)是一個(gè)由谷歌公司在2008年創(chuàng)立的互聯(lián)網(wǎng)應(yīng)用服務(wù)引擎,它采用云計(jì)算技術(shù)、多服務(wù)器和數(shù)據(jù)中心來(lái)虛擬化應(yīng)用。因此GAE可以看作web應(yīng)用托管的平臺(tái)[3]。
Azure是微軟提出的基于云計(jì)算的操作系統(tǒng),它的主要目標(biāo)是提供一個(gè)平臺(tái),為開(kāi)發(fā)者提供云服務(wù)器、數(shù)據(jù)中心、Web和PC應(yīng)用程序[4]。
基于這兩個(gè)開(kāi)發(fā)環(huán)境的簡(jiǎn)單研究,本文選擇的開(kāi)發(fā)語(yǔ)言是GAE和Azure都支持的Python。
1 實(shí)現(xiàn)方法
1.1 Python Web框架的選擇
目前市場(chǎng)上流行的Python Web框架,GAE和微軟Azure同時(shí)支持的是Django、Flask和Bottle,本文將比較這三個(gè)Web框架的功能和性能。
1.1.1 功能介紹
Flask是用Python編寫的一個(gè)輕量級(jí)Web應(yīng)用程序框架。Flask被稱為“微框架”,因?yàn)樗褂煤?jiǎn)單的內(nèi)核,通過(guò)擴(kuò)展來(lái)添加其他功能,所以在大多數(shù)情況下,它只用來(lái)在一些小項(xiàng)目上使用一個(gè)或兩個(gè)功能[4]。換句話說(shuō),它不適合中型和大型網(wǎng)站或應(yīng)用程序。
Bottle是一個(gè)非常微妙的框架,它提供Python Web開(kāi)發(fā)的基本支持:URL路由、請(qǐng)求/響應(yīng)對(duì)象包、模板支撐和集成支持WSGI服務(wù)器。Bottle對(duì)小型Web開(kāi)發(fā)更好,它可以根據(jù)項(xiàng)目的規(guī)模實(shí)現(xiàn)較小項(xiàng)目的快速開(kāi)發(fā)[5]。然而,由于其功能有限,對(duì)于大型Web應(yīng)用程序,bottle功能略顯不足,需要人工干預(yù)。
Django是迄今為止基于Python最大的Web框架之一。它由一個(gè)龐大而活躍的社區(qū)支持。它配備了一個(gè)強(qiáng)大的后臺(tái)管理界面,以及許多其他功能[6]。Django還提供了基于表格的模型、模板語(yǔ)言和完整的文檔。
1.1.2 性能比較
對(duì)Django,flask,bottle性能進(jìn)行測(cè)試,使用的操作系統(tǒng)是cenos6 64位,測(cè)試軟件是siege,測(cè)試命令請(qǐng)求只返回一個(gè)字符串。測(cè)試結(jié)果見(jiàn)圖1。
從測(cè)試結(jié)果可看出,純框架的性能排序?yàn)椋篵ottle>flask>Django。但是,當(dāng)真正使用這些框架時(shí),bottle需要的東西太多,隨著開(kāi)發(fā)復(fù)雜性的增加,性能會(huì)下降。
就比較結(jié)果進(jìn)行可行性分析,該項(xiàng)目的目標(biāo)是幫助Python程序員建立可以同時(shí)在谷歌App Engine和微軟Azure上運(yùn)行的網(wǎng)站或應(yīng)用程序。Flask具有建立如博客和電子郵件的功能,但它是一個(gè)“微框架”,因此,當(dāng)程序員要建立一個(gè)中等規(guī)模的網(wǎng)站或應(yīng)用程序時(shí),它缺乏可擴(kuò)展的能力。
據(jù)長(zhǎng)期不斷的測(cè)試,Django雖然性能最差(因?yàn)镈jango框架很大),但開(kāi)發(fā)人員使用起來(lái)十分方便。本文選擇Django框架是因?yàn)樗型暾目蚣芄δ芎涂梢越邮艿男阅堋?/p>
1.2 部署的方法
選定框架后,需要找到一種方法將其部署到GAE和微軟Azure上。微軟Azure很容易部署,因?yàn)槲④汚zure支持Django框架。要做的只是使用Visual Studio開(kāi)發(fā)程序,并把它上傳到微軟Azure上。
對(duì)于GAE,需要導(dǎo)入一個(gè)適配器,即Django-nonrel,它可以使Django運(yùn)行在非關(guān)系型數(shù)據(jù)庫(kù)上,它支持MongoDB和GAE。
1.3 使用數(shù)據(jù)存儲(chǔ)的方法
一旦應(yīng)用程序可以在兩個(gè)平臺(tái)上運(yùn)行時(shí),接下來(lái)就要考慮如何連接數(shù)據(jù)存儲(chǔ)。這里有三個(gè)選擇,分別是GAE云存儲(chǔ)、Azure存儲(chǔ)和亞馬遜簡(jiǎn)單存儲(chǔ)服務(wù)(S3)。我選擇S3為應(yīng)用程序的數(shù)據(jù)存儲(chǔ),因?yàn)槠鋼碛凶畲罅康暮献骰锇楹虸SV集成商,并且還具有強(qiáng)大的網(wǎng)絡(luò)供應(yīng)商和數(shù)據(jù)恢復(fù)能力[7]。
對(duì)于GAE和Azure連接S3的方式,我導(dǎo)入一個(gè)云平臺(tái)無(wú)關(guān)的API,即Boto。Boto是一個(gè)用于AWS的Python接口,通過(guò)使用Boto,開(kāi)發(fā)人員可以輕松地使用Python控制S3。
2 中間層的搭建
我為Python程序建立了整個(gè)中間層,這個(gè)中間層的功能是:
⑴ 通過(guò)使用中間層,Python開(kāi)發(fā)人員可以不改變?nèi)魏未a,就能把Django應(yīng)用部署到GAE和微軟的Azure上;
⑵ 開(kāi)發(fā)人員可以使用亞馬遜S3來(lái)存儲(chǔ)數(shù)據(jù)。它包含大量的文件,后面會(huì)給出這些文件的解釋和內(nèi)容。
2.1 可移植性文件在程序?qū)用娴慕忉?/p>
該程序的根目錄為myblog002,這個(gè)文件夾下包含兩個(gè)文件夾,分別是myblog002、google app engine和一個(gè)叫myblog002.sln的文件。Google app engine中包含google app的軟件開(kāi)發(fā)包,myblog002.sln是項(xiàng)目文件,Visual Azure同樣會(huì)使用到這個(gè)文件。當(dāng)進(jìn)入myblog002文件夾,會(huì)看到更多文件夾和文件。
他們可以分為三部分。
第一部分是項(xiàng)目和程序文件,包括myblog002、blog、manage.py。在manage.py中,可以看到環(huán)境變量路徑,這里我使用myblog002.settings。
第二部分是Azure中間層,這部分有三個(gè)文件夾:bin、env、obj,五個(gè)文件:myblog002.pyprol、myblog002.splite,ptvs_virtualenv_proxy.py,web.config和web.debug.config。Bin文件夾存儲(chǔ)程序代碼,用于部署控制和組件,例如Azure Setup,microsoft python tool和FastCGI。Env文件夾包含項(xiàng)目中用到的所有環(huán)境。Obj文件夾用于在編程過(guò)程中生產(chǎn)的臨時(shí)文件的存儲(chǔ),同時(shí)包含debug和release兩個(gè)子目錄,用于控制版本。以pyproj為后綴的腳本包含所有項(xiàng)目的配置。以splite為后綴的腳本用于存儲(chǔ)sqlite3數(shù)據(jù)庫(kù)。ptvs_virtualenv_proxy.py腳本用于讀取WSGI指針,激活虛擬環(huán)境和日志錯(cuò)誤。
web.config文件描述服務(wù)器如何處理請(qǐng)求。web.debug.config當(dāng)你將應(yīng)用程序發(fā)布到開(kāi)發(fā)環(huán)境時(shí),進(jìn)行轉(zhuǎn)換。所有的文件可以創(chuàng)建微軟Azure需要的.NET框架。
第三部分包括除boto文件夾之外所有文件夾和文件,這些可以形成GAE中間層。這部分包括autoload、dbindexer、django、diangoappengine、djangotoolbox、templates六個(gè)文件夾。Autoload在處理任何請(qǐng)求之前,通過(guò)確保信號(hào)指針或序號(hào)的加載,來(lái)正確地安裝diango項(xiàng)目。Dbindexer可以幫助開(kāi)發(fā)人員在使用GAE時(shí)使用非關(guān)系型數(shù)據(jù)庫(kù)。Django包含django庫(kù)。Djangoappengine包含Django-nonrel的應(yīng)用程序后端,如數(shù)據(jù)庫(kù)和email后端。
Djangotoolbox是一個(gè)小的django工具集。可以使用非關(guān)系型數(shù)據(jù)庫(kù)的Django后臺(tái),加載不必要的代碼,并提供良好的編碼規(guī)范和工具,這對(duì)你的代碼有好的實(shí)際影響。這四個(gè)文件夾是GAE中間層的核心。Templates包含一些錯(cuò)誤展示頁(yè),如404 error或505 error。
中間層的第三部分包含八個(gè)文件,分別是“urls.py”,“cron.yaml”,“build.sh”,“__init__.py”,“app.yaml”, “index.yaml”,“indexes.py”and“settings.py。Urls.py包含項(xiàng)目的所有url。cron.yaml重新索引那些由于新訪問(wèn)需要高頻更新的任何文檔。
build.sh被用來(lái)編譯文件包中的所有資源。__init__.py使python處理包含程序包的目錄,在模塊搜索時(shí)避免被有相同名字的目錄隱藏有效的模塊。app.yaml指定URL如何對(duì)應(yīng)于請(qǐng)求應(yīng)用程序和靜態(tài)文件。index.yaml和應(yīng)用程序一起加載來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的索引。indexes.py包含所有條目的字母索引。settings.py包含項(xiàng)目的所有環(huán)境變量。這些文件中最重要的是setting.py,它是GAE和Azure之間的鏈接。
對(duì)Python腳本的第一部分GAE和Azure的數(shù)據(jù)庫(kù)設(shè)計(jì),我使用splite數(shù)據(jù)庫(kù),并把數(shù)據(jù)庫(kù)名字命名為myblog002.sqlite。
接下來(lái),設(shè)置查找類來(lái)查找靜態(tài)文件,通過(guò)加密保證其惟一性,通過(guò)模板加載器從多種資源中導(dǎo)出模板,中間類可同時(shí)用于GAE和Azure,根URL配置文件和WSGI應(yīng)用程序。
在安裝的app類中,我導(dǎo)入了應(yīng)用程序和GAE中間層工具包。對(duì)于Google APP Engine,設(shè)置模板文本處理器,最后一件事是,指定默認(rèn)的測(cè)試程序和日志文件。
2.2 可移植性數(shù)據(jù)庫(kù)層面文件的解釋
最后一個(gè)叫boto的文件夾是AWS S3的接口。要使用這個(gè)API,我們需要設(shè)置setting.py,導(dǎo)入boto包,設(shè)置AWS的用戶名、密碼和存儲(chǔ)名稱。
接下來(lái),我們就可以在請(qǐng)求信息中使用boto API來(lái)連接AWS S3存儲(chǔ)了。
3 可移植性的測(cè)試和分析
首先用python寫一個(gè)簡(jiǎn)單的博客應(yīng)用程序,然后把代碼放到中間層上,最后把它發(fā)布到GAE和Azure上。
3.1 在Django上創(chuàng)建一個(gè)簡(jiǎn)單的博客應(yīng)用程序
開(kāi)發(fā)環(huán)境是MAC OS X,處理器是2.4GHZ Inter Corei5,內(nèi)存是4GB 1600MHZ DDR3。
數(shù)據(jù)庫(kù)同步結(jié)果見(jiàn)圖3。
3.2 創(chuàng)建一個(gè)GAE和Azure之間的中間層
⑴ 首先,創(chuàng)建一個(gè)命名為myblog002的文件夾,把文件夾都放入其中,把名為myblog002.sln(可由Visual Studioc創(chuàng)建)的GAE SDK放到該文件夾。
⑵ 進(jìn)入myblog002文件夾,下載5個(gè)django-nonrel文件,包括djangoappengine,autoload,dbindexer,django和djangotoolbox,把它們放到test2文件中,復(fù)制GAE可用的指定文件,包括template, _init_.py, cron.yaml, indexes.py,requirement.txt,urls.py,app.yaml,index.yaml, build.sh, and settings.py。
⑶ 接下來(lái)是添加Azure文件夾,包含3個(gè)文件夾:“bin”, “env” and “obj”,以及5個(gè)文件:“myblog002.pyprol”,“myblog002.sqlite”,“ptvs_virtualenv_proxy.py”,“web.config”and“web.debug.config”。
⑷ 這個(gè)步驟很重要,它用來(lái)改寫setting.py。
3.3 GAE的測(cè)試
安裝GAE,并把所有文件移動(dòng)到GAE文件夾中,然后運(yùn)行它,結(jié)果見(jiàn)圖4。
現(xiàn)在,程序可以在GAE上運(yùn)行。接下來(lái),我們需要把程序部署到網(wǎng)絡(luò)上。
3.4 Azure的測(cè)試
⑴ 把項(xiàng)目導(dǎo)入到Visual Studio2013。
⑵ 運(yùn)行程序,運(yùn)行結(jié)果見(jiàn)圖5。
現(xiàn)在,程序可以通過(guò)Visual Studio運(yùn)行。
⑶ 把程序發(fā)布到網(wǎng)絡(luò)上。
3.5 GAE和Azure之間python的存儲(chǔ)可移植性測(cè)試
在這部分,我選擇亞馬遜S3。因此,第一件事是注冊(cè)賬號(hào),獲得來(lái)自亞馬遜的認(rèn)證。之后,我們導(dǎo)入boto API,放到根目錄。
我使用名為cw00376的存儲(chǔ),在存儲(chǔ)中,我創(chuàng)建了名為blog的文件夾,準(zhǔn)備把博客放入其中。
現(xiàn)在,當(dāng)用戶在博客中寫東西時(shí),文章的標(biāo)題和內(nèi)容會(huì)存儲(chǔ)在S3存儲(chǔ)中。
4 結(jié)束語(yǔ)
首先,這份報(bào)告調(diào)查了當(dāng)今社會(huì)對(duì)云計(jì)算可移植性的研究,重點(diǎn)在兩個(gè)不同的云平臺(tái)供應(yīng)商之間的PaaS層面的中間層上。其次,基于對(duì)谷歌App Engine和微軟Azure的分析,本報(bào)告決定使用Python+Django+ AWS S3作為中間層接口。完成中間層開(kāi)發(fā)之后,創(chuàng)建了一個(gè)簡(jiǎn)單的博客應(yīng)用程序,用于測(cè)試中間層。
該項(xiàng)目成功地實(shí)現(xiàn)不同的PaaS平臺(tái)之間的可移植性,證明了中間層的可行性,并提供了更深入的研究方法。在開(kāi)發(fā)的過(guò)程中,使用編程語(yǔ)言Python,操作系統(tǒng)Linux,開(kāi)發(fā)Web框架如Django,云平臺(tái)和亞馬遜Web服務(wù)和大量已經(jīng)實(shí)現(xiàn)的API。
為進(jìn)一步的研究和開(kāi)發(fā),從縱向看,很多具有功能性和可移植性的程序可以開(kāi)發(fā),如Blob存儲(chǔ),郵件和隊(duì)列。該中間層可以嘗試添加更多的API,用于安裝更多類型的云服務(wù)。從橫向看,中間層可以嘗試添加更多的開(kāi)發(fā)環(huán)境和更多的編程語(yǔ)言,例如PHP和Node.js等。
參考文獻(xiàn)(References):
[1] 李露.GAE的技術(shù)發(fā)展及應(yīng)用[J].科技創(chuàng)業(yè)月刊,2012.25(8):
192
[2] 王鵬.云計(jì)算的關(guān)鍵技術(shù)與應(yīng)用實(shí)例[M].人民郵電出版社,
2009.
[3] 劉楓.基于Google云計(jì)算平臺(tái)的Web應(yīng)用系統(tǒng)設(shè)計(jì)及實(shí)現(xiàn)[D].
四川電子科技大學(xué)碩士學(xué)位論文,2011.
[4] 孫越.基于Windows Azure的教學(xué)資源平臺(tái)建設(shè)[J].福建電
腦,2013.29(10):159
[5] 王昊.基于GAE云計(jì)算的Web應(yīng)用與開(kāi)發(fā)[D].南京郵電大學(xué)
碩士學(xué)位論文,2013.
[6] 張?zhí)煺?遷移應(yīng)用到Windows Azure云計(jì)算平臺(tái)[J].軟件,
2013.34(2):144
[7] 盧朝輝.基于Windows Azure的大規(guī)模Web應(yīng)用程序設(shè)計(jì)[J].
計(jì)算機(jī)技術(shù)與發(fā)展,2014.24(12):57