劉 班
(武漢職業(yè)技術(shù)學(xué)院,湖北 武漢 430074)
隨著Web2.0技術(shù)的興起,Web應(yīng)用已經(jīng)成為一種最重要的信息服務(wù)提供方式。但Web應(yīng)用采用傳統(tǒng)的方式部署之后,可伸縮性不強(qiáng),在一定程度上限制了其快速發(fā)展。云計算技術(shù)的出現(xiàn)和逐漸流行為Web應(yīng)用的部署提供了一個新的途徑。云計算按需使用、動態(tài)可伸縮以及資源共享的優(yōu)勢非常適用于Web應(yīng)用的部署。本文從多個不同的方面詳細(xì)分析了在云端部署Web應(yīng)用時需要遵循的各種策略和原則。
Web應(yīng)用可選擇3種不同的模式進(jìn)行部署,分別是基礎(chǔ)設(shè)施即服務(wù)(Infrastructure as a Service,IaaS)、平臺即服務(wù)(Platform as a Service,PaaS)以及軟件即服務(wù)(Software as a Service,SaaS)[1]。具體采用哪一種部署模式取決于應(yīng)用需求的實際情況。
IaaS是一個為用戶提供IT基礎(chǔ)設(shè)施的平臺。云端服務(wù)商僅提供硬件服務(wù)器或者虛擬機(jī),用戶可以利用這些基礎(chǔ)設(shè)施(CPU、內(nèi)存、存儲、網(wǎng)絡(luò)等)來自由部署和運行自己所需的任意軟件,如操作系統(tǒng)或應(yīng)用程序等,也能獲得對網(wǎng)絡(luò)組件(路由器、防火墻、負(fù)載均衡器等)的有限控制權(quán)。IaaS是自由度最大的一種部署模式,用戶可以決定安裝什么操作系統(tǒng)以及是否需要安裝或者安裝什么類型的數(shù)據(jù)庫、安裝什么軟件等。不過該模式的缺陷也很明顯,除了管理維護(hù)量大之外,還有就是會導(dǎo)致計算資源的嚴(yán)重浪費。操作系統(tǒng)、數(shù)據(jù)庫以及中間件這些組件本身就要消耗大量的計算資源,而這些消耗對于用戶來說毫無實際意義。
PaaS是運行在IaaS之上的一種模式。在該模式下,云端服務(wù)商為用戶提供除用戶應(yīng)用程序和數(shù)據(jù)之外的所有軟硬件設(shè)施,包括硬件服務(wù)器、虛擬機(jī)、操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)軟件、中間件以及運行庫等。基于PaaS模式部署應(yīng)用,使用戶可以將精力集中在應(yīng)用程序核心功能的開發(fā)上,此外還提供了專門針對應(yīng)用程序的功能。為了方便服務(wù)提供商有效地管理平臺,在PaaS模式下,用戶被限制只能使用某些軟件服務(wù)。
在SaaS模式下,云端服務(wù)商為用戶提供了包括用戶業(yè)務(wù)所需應(yīng)用程序在內(nèi)的幾乎所有的軟硬件設(shè)施,用戶只需要把應(yīng)用程序業(yè)務(wù)數(shù)據(jù)導(dǎo)入其中即可開始工作。由于應(yīng)用程序代碼是由云端服務(wù)商提供的,開發(fā)人員沒有應(yīng)用程序的修改權(quán)限,因此很難將外部工作流集成到用戶自己的系統(tǒng)中[2]。SaaS模式通常不是部署自定義Web應(yīng)用程序的最佳選擇。
通過分析Web應(yīng)用3種不同的云端部署模式可知,應(yīng)該選擇PaaS這種模式來部署Web應(yīng)用,從而可以讓開發(fā)人員更專注于應(yīng)用軟件功能的實現(xiàn)上。
PaaS為大多數(shù)語言和運行提供了開箱即用的彈性伸縮功能。但是對于開發(fā)人員來說,還需要了解云端服務(wù)提供的各類伸縮方式。
垂直伸縮是非常常見的一種伸縮形式,通過使用配置更好的系統(tǒng)來實現(xiàn)。例如,通過將服務(wù)器的配置升級為TB級別的隨機(jī)存取存儲器(Random Access Memory,RAM)和大量多核心中央處理器(Central Processing Unit,CPU),從而大幅度提高應(yīng)用程序的運行效率。通常情況下,當(dāng)使用垂直伸縮時,可以用單個大型系統(tǒng)處理來自用戶的大部分或所有請求[3]。
通過水平伸縮,應(yīng)用程序的負(fù)載和收到的請求通常被分配到一組位于負(fù)載均衡服務(wù)器后面的普通服務(wù)器上。當(dāng)很多不同的用戶向應(yīng)用程序發(fā)出大量請求時,負(fù)載均衡服務(wù)器會將這些請求均衡地分配到各個普通服務(wù)器上,然后跨服務(wù)器集群進(jìn)行會話狀態(tài)管理。為了給用戶帶來最好的使用體驗,通常會采用兩種類型的水平伸縮,一種是手動伸縮,另一種是自動伸縮。
2.2.1 手動伸縮
當(dāng)能預(yù)測到即將會出現(xiàn)一個大幅增加Web應(yīng)用負(fù)載的任務(wù)時,用戶可以通過手動伸縮的方式增加Web應(yīng)用的規(guī)模,以便能更快地處理這個即將到來的大型任務(wù)[4]。例如,某公司即將要舉辦一個促銷活動,以吸引更多消費者使用該公司的購物網(wǎng)站。為了讓W(xué)eb應(yīng)用適應(yīng)這種大規(guī)模并發(fā)訪問需求,開發(fā)人員應(yīng)該手動地向現(xiàn)有的服務(wù)器集群添加更多的應(yīng)用服務(wù)器。此外,大多數(shù)PaaS服務(wù)商都允許用戶使用一個簡單的命令來實現(xiàn)此功能。
2.2.2 自動伸縮
自動伸縮通過設(shè)置Web應(yīng)用自動伸縮條件來實現(xiàn)。當(dāng)符合條件時,Web應(yīng)用就可以自動實現(xiàn)伸縮。伸縮條件可以基于Web應(yīng)用正在接收的并發(fā)HTTP請求的數(shù)量或者Web應(yīng)用正在使用的CPU的數(shù)量來定義,這使得開發(fā)人員能夠在Web應(yīng)用的負(fù)載較高時自動向負(fù)載平衡集群添加新的服務(wù)器。自動伸縮提供了一種無需用戶干預(yù)的伸縮方法,以確保及時滿足用戶的需求。當(dāng)負(fù)載量動態(tài)變化幅度很大,導(dǎo)致用戶無法預(yù)估Web應(yīng)用的負(fù)載量時,采用自動伸縮模式最為合適。
大多數(shù)提供PaaS模式的云端服務(wù)商都要求用戶基于當(dāng)前的PaaS平臺重新開發(fā)項目。因為平臺的文件系統(tǒng)不允許在其上保存應(yīng)用程序狀態(tài)或資源,所以將現(xiàn)有或者過去遺留的Web應(yīng)用移植到PaaS平臺是非常困難[5]。如果要獲得云端基礎(chǔ)設(shè)施提供的全部優(yōu)勢,那么用戶就需要在項目中使用無狀態(tài)應(yīng)用程序設(shè)計,要實現(xiàn)這一點,需為新應(yīng)用程序提供下文所述3個功能。
(1)允許應(yīng)用程序服務(wù)器或容器在整個集群中維護(hù)用戶的會話狀態(tài),而不是依賴于文件系統(tǒng)來保存這些狀態(tài)數(shù)據(jù)。(2)使用基于云的存儲服務(wù),并通過為存儲服務(wù)提供的表述性狀態(tài)轉(zhuǎn)移風(fēng)格應(yīng)用程序編程接口(Representational State Transfer Application Programming Interface,REST API)來實現(xiàn)各種資源的傳輸。不要將文件或用戶資源保存到部署代碼的服務(wù)器的物理文件系統(tǒng)上。(3)如果無法訪問和使用云存儲API,就要借助數(shù)據(jù)庫來存儲與用戶相關(guān)的資源。
通過上面的分析可知,用戶應(yīng)該設(shè)計無狀態(tài)的Web應(yīng)用程序并部署到云端,這類應(yīng)用不會在文件系統(tǒng)上存儲用戶資源。而對于遺留的或已開發(fā)完成的應(yīng)用,請選擇同時支持有狀態(tài)和無狀態(tài)應(yīng)用程序的PaaS服務(wù)。
現(xiàn)在,幾乎所有應(yīng)用程序都依賴于各類后端數(shù)據(jù)庫來存儲和檢索信息。當(dāng)開發(fā)云端運行的Web應(yīng)用程序時,還必須考慮將要使用何種數(shù)據(jù)庫以及這些數(shù)據(jù)庫所在的具體位置,即該數(shù)據(jù)庫是應(yīng)該與應(yīng)用程序托管在相同的服務(wù)器上,還是將這個數(shù)據(jù)庫托管在單獨的服務(wù)器或容器上[6]。
通常情況下,Web應(yīng)用依賴的數(shù)據(jù)庫通常都位于防火墻之后,而前端界面則部署在公有云上,可以選擇以下的兩種方式來高效訪問需要在前端呈現(xiàn)的數(shù)據(jù)庫信息。(1)選擇一個允許用戶通過遠(yuǎn)程虛擬私有云(Virtual Private Cloud,VPC)連接數(shù)據(jù)的PaaS云端服務(wù)商。(2)通過部署在PaaS基礎(chǔ)設(shè)施上的一組經(jīng)過身份認(rèn)證的REST API與數(shù)據(jù)庫進(jìn)行通信。
當(dāng)然,通過這兩種方式從外部的云端應(yīng)用連接到公司防火墻后的數(shù)據(jù)庫時,都存在固有的安全隱患。為了避免出現(xiàn)安全相關(guān)的問題,用戶可以選擇一個允許云端應(yīng)用程序部署在非多租戶環(huán)境上的PaaS云端供應(yīng)商。
如果應(yīng)用程序沒有連接到公司內(nèi)部數(shù)據(jù)庫的需求,那么數(shù)據(jù)庫的選擇就非常自由和靈活。建議將這類數(shù)據(jù)庫部署在與應(yīng)用程序距離較近的單獨容器或服務(wù)器上,可以實現(xiàn)獨立于Web層伸縮數(shù)據(jù)庫的功能。此外,還要選擇一個支持高效伸縮的關(guān)系型或非關(guān)系型數(shù)據(jù)庫。
云計算最大的優(yōu)勢是可以在世界各地部署Web應(yīng)用基礎(chǔ)設(shè)施,而幾乎不用花費任何前期成本。例如,采用傳統(tǒng)方式在中國上海和美國紐約同時部署一個Web應(yīng)用,需要耗費巨大的前期成本購買硬件和數(shù)據(jù)中心,而借助云端提供的基礎(chǔ)設(shè)施可以輕松地跨多個地區(qū)部署Web應(yīng)用程序,并且不用花費任何前期成本[7]。當(dāng)然,對于那些用戶數(shù)量有限的簡單Web應(yīng)用而言,完全不需要這樣做。但是通過將Web應(yīng)用部署到盡可能接近每個客戶的多區(qū)域位置,就更能提升客戶的滿意度。另外,如果再結(jié)合云端提供的手動或自動伸縮功能,那么將會獲得比在傳統(tǒng)IT基礎(chǔ)設(shè)施上部署Web應(yīng)用更優(yōu)的效果。
綜上所述,要選擇能夠支持在全球多個地區(qū)部署和彈性伸縮Web應(yīng)用基礎(chǔ)設(shè)施的云端服務(wù)商,以確保每個客戶在使用Web應(yīng)用時獲得更好的體驗。
在云端部署Web應(yīng)用可以獲得很多優(yōu)勢,其中一個顯著的優(yōu)勢是能夠獨立地伸縮Web層和數(shù)據(jù)庫層。另外,還可以將核心業(yè)務(wù)邏輯改寫為可以供前端代碼調(diào)用的Web服務(wù),進(jìn)而實現(xiàn)Web服務(wù)層獨立于數(shù)據(jù)庫和前端表現(xiàn)層的單獨伸縮[8]。將Web應(yīng)用的核心邏輯與前端表現(xiàn)層分離,為Web應(yīng)用的開發(fā)提供了一個全新的思路,如可以使用Node.js和Vue.js這類平臺或框架創(chuàng)建單頁面Web應(yīng)用。
在DevOps思想的指導(dǎo)下,為了實現(xiàn)Web應(yīng)用的快速交付,將Web應(yīng)用部署到云端的基礎(chǔ)設(shè)施上時,需確保在現(xiàn)有的構(gòu)建系統(tǒng)中包含了持續(xù)集成和持續(xù)交付(Continuous Integration/Continuous Deployment,CI/CD)的工作流,以便可以在不同的環(huán)境中部署Web應(yīng)用的代碼。如今大多數(shù)的構(gòu)建系統(tǒng)都為一些頂級云端服務(wù)商提供了各種插件,這使得用戶配置應(yīng)用程序的部署規(guī)則變得更加容易。
選擇一個滿足上述所有要求的云端服務(wù)商,然后在平臺上添加CI/CD工具。選擇的云端服務(wù)商應(yīng)該允許部署用戶的構(gòu)建系統(tǒng),或者具有輕松地與部署在云平臺之外的系統(tǒng)進(jìn)行集成的能力。
當(dāng)前,Web應(yīng)用越來越流行基于Docker容器的部署。Docker是一個用來開發(fā)、交付和運行應(yīng)用程序的開放平臺。使用Docker可以將應(yīng)用程序與基礎(chǔ)架構(gòu)分離,以便快速交付軟件。在Docker的支持下,用戶能夠以管理應(yīng)用程序的方式來管理基礎(chǔ)架構(gòu)。通過Docker快速交付、測試和部署代碼,可以顯著縮短編寫代碼與在生產(chǎn)環(huán)境中部署和運行代碼的時間間隔。
在云端部署Web應(yīng)用的優(yōu)勢非常多,開發(fā)人員應(yīng)該在日常的Web應(yīng)用研發(fā)和部署中充分利用這些優(yōu)勢,以使自己的Web應(yīng)用擁有更高的穩(wěn)定性、更大的可伸縮性以及更完善的安全性,同時還要善于使用云端容器技術(shù)來提升Web應(yīng)用部署的可靠性和靈活性,并且降低Web應(yīng)用部署和維護(hù)的成本。