現(xiàn)實(shí)中的開(kāi)放源碼云計(jì)算,第2部分:針對(duì)云進(jìn)行開(kāi)發(fā)
概述:本文使用一個(gè)看似簡(jiǎn)單的應(yīng)用程序和為人熟知的開(kāi)源技術(shù)來(lái)闡釋相關(guān)概念和探究云計(jì)算的實(shí)力。
您可能對(duì)這樣的說(shuō)法 —— “一次編程,處處可用” —— 早有耳聞。但是如果想要為運(yùn)行在某個(gè)云中的應(yīng)用程序編程,恐怕真的需要知道其中的究竟。在 “現(xiàn)實(shí)中的開(kāi)放源碼云計(jì)算” 系列的第 2 部分中,了解如何使用 PHP 編寫(xiě)一個(gè)運(yùn)行在 Aptana 云計(jì)算平臺(tái)上的應(yīng)用程序。探索云應(yīng)用程序和傳統(tǒng)的 N 層應(yīng)用程序之間的關(guān)鍵設(shè)計(jì)差異。
關(guān)于本系列
在這個(gè)分三部分的 “現(xiàn)實(shí)中的開(kāi)放源碼云計(jì)算” 系列中,學(xué)習(xí)如何判斷云計(jì)算是否對(duì)您有幫助以及如何制定云計(jì)算戰(zhàn)略。在第 1 部分中,了解云計(jì)算的益處、云的類(lèi)型和可供選擇的云計(jì)算平臺(tái)。第 3 部分所涵蓋的是部署在云上的應(yīng)用程序生命周期的其他部分。
本文中,我們將學(xué)習(xí)用 PHP 編寫(xiě)一個(gè)簡(jiǎn)單的、在 Aptana 云計(jì)算平臺(tái)上運(yùn)行的應(yīng)用程序。另外還將探討云應(yīng)用程序與傳統(tǒng) N-層應(yīng)用程序的設(shè)計(jì)差異。
云計(jì)算架構(gòu)
要想使軟件穩(wěn)定運(yùn)行、執(zhí)行良好且能進(jìn)行伸縮以滿(mǎn)足所有的功能需求,至關(guān)重要的一點(diǎn)是針對(duì)軟件的運(yùn)行環(huán)境來(lái)量身打造軟件。這時(shí)要考慮您的軟件所運(yùn)行的環(huán)境是您自己的還是別人的。正如您在 現(xiàn)實(shí)中的開(kāi)放源碼云計(jì)算,第 1 部分:并不是所有云都相同 看到的,不是所有的云都相同。不同類(lèi)型的云計(jì)算需要不同的設(shè)計(jì)。需要把基礎(chǔ)云計(jì)算平臺(tái)與專(zhuān)用云計(jì)算平臺(tái)區(qū)分開(kāi)來(lái)。
針對(duì)專(zhuān)用平臺(tái)的架構(gòu)
就架構(gòu)而言,高度專(zhuān)用的平臺(tái)最為復(fù)雜。當(dāng)設(shè)計(jì)運(yùn)行在這些云上的應(yīng)用程序時(shí),需要考慮很多問(wèn)題。當(dāng)然,它們帶來(lái)的獨(dú)特益處足以彌補(bǔ)這些限制。Google App Engine 是一個(gè)很好的例子。
當(dāng)針對(duì) Google App Engine 創(chuàng)建一個(gè)應(yīng)用程序時(shí),僅需創(chuàng)建應(yīng)用程序源代碼以及需要用到的靜態(tài)資源(比如圖片)。您無(wú)法控制應(yīng)用服務(wù)器或數(shù)據(jù)訪(fǎng)問(wèn)。對(duì)此,有一個(gè)很好的解釋?zhuān)篈pp Engine 提供高度可伸縮的解決方案。不過(guò),您需要理解 App Engine 所提供的基礎(chǔ)架構(gòu)。Google 提供了一個(gè) API(Google Query Language)用來(lái)訪(fǎng)問(wèn) App Engine 數(shù)據(jù)存儲(chǔ)。這非常類(lèi)似 SQL,這樣一來(lái),您就能輕松地開(kāi)始使用數(shù)據(jù)存儲(chǔ)了。這個(gè)數(shù)據(jù)存儲(chǔ)不是一個(gè)關(guān)系數(shù)據(jù)庫(kù),倒更像是一個(gè)簡(jiǎn)單的文件系統(tǒng)。
對(duì)數(shù)據(jù)庫(kù)的簡(jiǎn)單訪(fǎng)問(wèn)要比對(duì)數(shù)據(jù)庫(kù)的查詢(xún)(通過(guò)主鍵找到一個(gè)單一對(duì)象)慢一些。關(guān)系查詢(xún)(例如表連接)是允許的,但要通過(guò)多個(gè)連續(xù)查詢(xún)才能實(shí)現(xiàn)。這要比關(guān)系數(shù)據(jù)庫(kù)上的連接慢得多,因此很難創(chuàng)建一個(gè)讓數(shù)據(jù)存儲(chǔ)超負(fù)荷的查詢(xún)。
為了充分利用數(shù)據(jù)存儲(chǔ),我們通常建議對(duì)數(shù)據(jù)進(jìn)行反常規(guī)處理,比如允許相關(guān)數(shù)據(jù)存儲(chǔ)在一起并被一起檢索。例如,看這樣一個(gè)例子:我們需要存儲(chǔ)用戶(hù)信息,其中每個(gè)用戶(hù)都可能具有多個(gè)電話(huà)號(hào)碼。這是一個(gè)典型的一對(duì)多的關(guān)系,并且通常情況下,在數(shù)據(jù)庫(kù)中,都會(huì)相應(yīng)地建立一個(gè)用戶(hù)表及一個(gè)電話(huà)號(hào)碼表,其中的電話(huà)號(hào)碼表包括一個(gè)指向用戶(hù)表的外鍵。您完全可以按同樣的方法用 Google 的數(shù)據(jù)存儲(chǔ)建模,但將電話(huà)號(hào)碼封裝為用戶(hù)的一部分(作為一個(gè)電話(huà)號(hào)碼的列表或數(shù)組),效率會(huì)更高。對(duì)數(shù)據(jù)存儲(chǔ)的單一查詢(xún)就可以返回您所需要的任何東西。
Google App Engine 并不是使用這個(gè)模型的惟一云計(jì)算平臺(tái)。Amazon 的平臺(tái) SimpleDB 也以同樣的方式工作。您可以在 EC2 上運(yùn)行 MySQL、Postgres 或任何其他數(shù)據(jù)庫(kù),但 SimpleDB 最簡(jiǎn)單易用,并可提供某些可伸縮性方面的優(yōu)勢(shì)(當(dāng)不允許連接時(shí),水平伸縮會(huì)更容易)。Ning 是另一個(gè)專(zhuān)用平臺(tái),也提供類(lèi)似的訪(fǎng)問(wèn)模式?!⊥ㄟ^(guò)使用專(zhuān)用平臺(tái),您能夠獲益良多,但當(dāng)設(shè)計(jì)一個(gè)運(yùn)行于這些專(zhuān)用平臺(tái)之上的應(yīng)用程序時(shí),需要牢記它們各自的特點(diǎn)。因此,使用一個(gè)基礎(chǔ)云計(jì)算平臺(tái)往往更簡(jiǎn)單些。
針對(duì)基礎(chǔ)平臺(tái)的架構(gòu)
基礎(chǔ)平臺(tái),例如 Amazon EC2 或 Joyent Accelerator,允許在其云上運(yùn)行任何軟件。它對(duì)架構(gòu)的限制較少。如果要針對(duì)基礎(chǔ)平臺(tái)進(jìn)行架構(gòu)設(shè)計(jì),可以像處理屬于您自已的平臺(tái)一樣任意處理這個(gè)平臺(tái)。若應(yīng)用程序需要運(yùn)行于自已的數(shù)據(jù)中心或從本地供應(yīng)商租來(lái)的服務(wù)器上,該如何設(shè)計(jì)這個(gè)應(yīng)用程序呢?倘若想在云計(jì)算平臺(tái)上運(yùn)行這個(gè)應(yīng)用程序,可能根本不需要對(duì)設(shè)計(jì)做大量更改。
在基礎(chǔ)平臺(tái)上運(yùn)行 Web 應(yīng)用程序,與在像 Google App Engine 那樣的專(zhuān)用平臺(tái)上運(yùn)行 Web 應(yīng)用程序非常類(lèi)似,但不同的是,可以隨意使用所需要的任何應(yīng)用服務(wù)器或數(shù)據(jù)庫(kù)。當(dāng)然,它的缺點(diǎn)就是您需要建立、安裝、配置并管理所有這些基礎(chǔ)架構(gòu)。在這方面,云平臺(tái)幫不上什么忙。
這里也有一些中間地帶。Aptana Cloud 平臺(tái)提供了很多的靈活性,因?yàn)樗挥?Joyent Accelerator 之上。Aptana 提供了幾個(gè)可供選擇的開(kāi)源基礎(chǔ)架構(gòu),您可以在其上構(gòu)建應(yīng)用程序,這就大大減少了工作量。它還有一些很好的工具,可用來(lái)簡(jiǎn)化部署過(guò)程。成功的關(guān)鍵就是選用了開(kāi)源技術(shù)。
充分利用開(kāi)源技術(shù)
有了基礎(chǔ)平臺(tái),還需要著手選擇應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)等。如何選擇呢?如果要構(gòu)建自已的數(shù)據(jù)中心,可能就想要使用開(kāi)源技術(shù)。這同樣適用于云平臺(tái)。您可以選擇一個(gè) Linux? 或 UNIX? 操作系統(tǒng)、一個(gè)具有恰當(dāng)?shù)木幊陶Z(yǔ)言模塊的 Apache Web 服務(wù)器以及一個(gè) MySQL 或 Postgres 數(shù)據(jù)庫(kù)。這些都是一些極為常用的選擇,甚至可以找到一些預(yù)先配置好的選項(xiàng)。一個(gè)更容易的選擇是使用 Aptana Cloud。Aptana Cloud
Aptana Cloud 將開(kāi)源技術(shù)布置在 Joyent Accelerator 平臺(tái)之上。由于 Joyent 在 OpenSolaris 操作系統(tǒng)上使用了 Xen 虛擬技術(shù),所以 Joyent 與 Aptana 所使用的開(kāi)源技術(shù)相結(jié)合,就產(chǎn)生了一個(gè)真正的純開(kāi)源的平臺(tái)。Aptana 使用 Apache Web 服務(wù)器、Postfix 郵件服務(wù)器及 MySQL 數(shù)據(jù)庫(kù)。它提供了針對(duì) PHP 及 Jaxer 的 Apache 插件,這是一個(gè)開(kāi)源容器,可用于使用服務(wù)器端 JavaScript。在撰寫(xiě)本文時(shí),Aptana 還在 Aptana Cloud 上提供了面向 Ruby on Rails 的私有 beta 版本。
使用 Aptana Cloud 十分簡(jiǎn)單。Aptana 的平臺(tái)被集成進(jìn)了它的旗艦產(chǎn)品 Aptana Studio IDE 中。只需下載這個(gè) Studio 并用它創(chuàng)建應(yīng)用程序,然后將應(yīng)用程序部署到 Aptana Cloud。如果更愿意使用自已喜歡的工具構(gòu)建應(yīng)用程序,也是可以的。只要將它導(dǎo)入到 Aptana Studio 并用 Studio 將應(yīng)用程序部署到云即可。下面,我們將著重看看如何構(gòu)建應(yīng)用程序并將其部署到 Aptana Cloud。構(gòu)建一個(gè)應(yīng)用程序
本文中的示例應(yīng)用程序在 Aptana Cloud 上使用了 PHP。要使用 Aptana Studio 開(kāi)發(fā)應(yīng)用程序,所要做的就是安裝 PHP 插件,如下所示。
圖 1. 為 Aptana Studio 安裝 PHP 插件
安裝完插件后,就可以開(kāi)始編寫(xiě) PHP 了。由于它是一個(gè)完整的 IDE,因此可以運(yùn)行這個(gè) PHP 應(yīng)用程序,對(duì)它進(jìn)行調(diào)試等。它還提供了一個(gè)用來(lái)與數(shù)據(jù)庫(kù)進(jìn)行交互的接口?!∥覀儗檫@個(gè)示例應(yīng)用程序創(chuàng)建一個(gè)定制博客。這種類(lèi)型的應(yīng)用程序適合用于簡(jiǎn)單的平臺(tái),例如 Aptana Cloud。開(kāi)始時(shí),可以用少量的資源以較低的開(kāi)銷(xiāo)先啟動(dòng)這個(gè)應(yīng)用程序。隨著應(yīng)用程序受歡迎程度的增加,再給它增加資源(垂直伸縮)。但是,即使是一個(gè)很小的應(yīng)用程序也有可能出現(xiàn)使用 “暴增” 的情況(它將自動(dòng)地增加 CPU 的使用來(lái)進(jìn)行處理)。如果需要維持大量的用戶(hù),就需要用多個(gè)服務(wù)器來(lái)進(jìn)行水平伸縮,還有可能需要直接使用 Joyent Accelerator 來(lái)處理定制架構(gòu)。
因示例應(yīng)用程序是一個(gè)博客,我們可以走個(gè)捷徑。這個(gè)應(yīng)用程序是在 WordPress 博客軟件基礎(chǔ)上開(kāi)發(fā)的。它是一個(gè)純 PHP 應(yīng)用程序,使用了一個(gè) MySQL 數(shù)據(jù)庫(kù),這使得它很適合 Aptana Cloud。由于它是開(kāi)源的,因此只需下載代碼、定制它并將它部署到服務(wù)器。在這個(gè)示例中,服務(wù)器實(shí)際上是 Aptana Cloud。
對(duì)于任何一個(gè) WordPress 應(yīng)用程序,我們的首要工作之一就是通過(guò)編輯 wp-config.php 腳本對(duì)它進(jìn)行配置,以便設(shè)置數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)和 cookie 安全性。清單 1 給出了一個(gè)典型的示例文件。
清單 1. 配置 WordPress
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define(’DB_NAME’, ’wordpress’);
/** MySQL database username */
define(’DB_USER’, ’wpadmin’);
/** MySQL database password */
define(’DB_PASSWORD’, ’your_password_here’);
/** MySQL hostname */
define(’DB_HOST’, ’localhost’);
/** Database Charset to use in creating database tables. */
define(’DB_CHARSET’, ’utf8’);
/** The Database Collate type. Don’t change this if in doubt. */
define(’DB_COLLATE’, ’’);
/** More stuff omitted. */
?> 上述代碼中有幾點(diǎn)需要引起我們的注意。如果是在本地工作站上做開(kāi)發(fā),那么 MySQL 數(shù)據(jù)庫(kù)很可能也在相同的這個(gè)機(jī)器上。這就需要將 DB_HOST 設(shè)為本地主機(jī)。這種設(shè)置與在 Aptana Cloud 上使用的設(shè)置相同。數(shù)據(jù)庫(kù)將運(yùn)行于與應(yīng)用服務(wù)器相同的一個(gè)機(jī)器上。在將它部署到 Aptana Cloud 時(shí),不必更改運(yùn)行在工作站上的代碼。
WordPress 之所以受歡迎的原因之一就是它是可擴(kuò)展的。它有很多可用的插件。假如,您的公司不僅僅需要一個(gè)可用來(lái)與客戶(hù)進(jìn)行交互的博客,還希望在有新博文發(fā)布時(shí)能通過(guò) Twitter 告知客戶(hù)。此時(shí),您就可以使用 WordPress 的 Twitter Tools 插件。它很簡(jiǎn)單,是一個(gè) PHP 腳本,您可以下載并復(fù)制到 wp-content/plugins 子目錄下。如果這還不能很好地滿(mǎn)足您的要求,您可以修改代碼或編寫(xiě)您自已的 PHP。
此外,通過(guò)創(chuàng)建一個(gè)新的主題(一組 PHP 腳本、CSS 文件和圖像)并將代碼放入 wp-content/themes 子目錄,還可以定制 WordPress 的觀感。定制完代碼后,就可以開(kāi)始將它部署到 Aptana Cloud 了。
部署到 Aptana Cloud
Aptana 的一大優(yōu)點(diǎn)就是它的部署。只需選擇 Aptana > Cloud > Deploy project 即可完成部署,如下所示。
圖 2. 部署到 Aptana Cloud
在首次將一個(gè)項(xiàng)目部署到 Aptana Cloud 時(shí),系統(tǒng)會(huì)提示您輸入一些基礎(chǔ)的注冊(cè)信息。您有 3 周的時(shí)間可以免費(fèi)部署到 Aptana Cloud,所以不必一開(kāi)始就輸入付款信息。輸入完基礎(chǔ)信息后,Aptana 將會(huì)在云上設(shè)置虛擬服務(wù)器。
圖 3. 供應(yīng) Aptana Cloud
在供應(yīng)和設(shè)置好站點(diǎn)后,就可以著手部署代碼了。您可能不想簡(jiǎn)單地將代碼從工作站復(fù)制到云,而是想通過(guò)源代碼控制管理軟件來(lái)進(jìn)行部署。Aptana 又一次為您提供了所需工具并充分利用了開(kāi)源技術(shù)。Aptana 使用 Subversion 并在云上建立一個(gè)源代碼控制存儲(chǔ)庫(kù)。部署代碼,實(shí)際上是將它添加到了 Subversion。
圖 4. 部署代碼 — 添加到 Subversion
一旦 Aptana 將代碼添加到 Subversion 并完成部署,您就可以用它的 Smart Sync 來(lái)更新您對(duì)應(yīng)用程序所做的任何增量修改。Aptana 還提供了一個(gè)用戶(hù)界面,用來(lái)向此應(yīng)用程序添加團(tuán)隊(duì)成員以便他人也可以從 Subversion 獲取代碼并進(jìn)行協(xié)作。如果多人同時(shí)處理一個(gè)應(yīng)用程序,那么它很可能會(huì)變得不太穩(wěn)定。幸運(yùn)的是,除了生產(chǎn)站點(diǎn),Aptana 還在云上創(chuàng)建了一個(gè)準(zhǔn)備站點(diǎn)。在提交給生產(chǎn)站點(diǎn)前,可以在準(zhǔn)備站點(diǎn)中對(duì)更改進(jìn)行測(cè)試。
部署數(shù)據(jù)
源代碼控制管理非常適合于將代碼部署到云,但數(shù)據(jù)又如何部署呢?對(duì)于 WordPress,一般先是要在本地安裝,這會(huì)導(dǎo)致 WordPress 把配置數(shù)據(jù)插入到它的數(shù)據(jù)庫(kù)中。隨著插件、主題和其他配置的逐漸添加,會(huì)有更多的數(shù)據(jù)被寫(xiě)入數(shù)據(jù)庫(kù)。這對(duì)于數(shù)據(jù)驅(qū)動(dòng)應(yīng)用程序非常典型。配置或種子(seed)數(shù)據(jù)是必要的。所幸,用 Aptana 進(jìn)行部署很容易。只需用 mysqldump 命令提取數(shù)據(jù)庫(kù)的轉(zhuǎn)儲(chǔ)。Aptana 有一些管理數(shù)據(jù)庫(kù)的工具,其中包括流行的 phpMyAdmin 開(kāi)源應(yīng)用程序??梢詮?Aptana 訪(fǎng)問(wèn)它,如下所示。
圖 5. 從 Aptana Studio 訪(fǎng)問(wèn) phpMyAdmin
通過(guò) phpMyAdmin 應(yīng)用程序,可以上傳所創(chuàng)建的文件。
圖 6. 上傳 MySQL 轉(zhuǎn)儲(chǔ)
現(xiàn)在可以將您在本地創(chuàng)建的所有數(shù)據(jù)移到云中的數(shù)據(jù)庫(kù)了。這個(gè)過(guò)程主要對(duì)應(yīng)用程序的初始設(shè)置有用。也可以在本地生成 SQL 腳本,然后在準(zhǔn)備和生產(chǎn)數(shù)據(jù)庫(kù)上運(yùn)行這些腳本,正如在自已的硬件上運(yùn)行應(yīng)用程序一樣。
結(jié)束語(yǔ)
在本文中,您了解了 Aptana 是如何簡(jiǎn)化基于 PHP 與 MySQL 的應(yīng)用程序開(kāi)發(fā)的,也學(xué)會(huì)了如何將應(yīng)用程序部署到云。這個(gè) “真實(shí)的開(kāi)放源碼云計(jì)算” 系列文章的下一篇將會(huì)探究部署在云上的應(yīng)用程序的生命周期的其他內(nèi)容。
針對(duì)云設(shè)計(jì)并開(kāi)發(fā)應(yīng)用程序可能需要一些技巧,這主要取決于所使用的云計(jì)算平臺(tái)的類(lèi)型。不過(guò),對(duì)于很多類(lèi)型的應(yīng)用程序,用標(biāo)準(zhǔn)的開(kāi)源技術(shù)可以大大減化您的工作。這種方法在 Aptana Cloud 上得到了很好的體現(xiàn)。
評(píng)論