簡介:“雲計算”是目前熱門的技術方向,本文從 Google 的雲計算平台 App Engine 入手,簡單介 紹了 Google 面向 Java 開發人員的雲計算平台。從一個實際的電子書分享應用構建出發,講述了如何在 Google App Engine 平台上構建這個應用程序。
“雲計算”基本概念的介紹
根據維基百科上的定義,雲計算是一種動態易擴展,而且通常是通過互聯網提供的虛擬化的資源計算 方式,用戶不需要了解雲內部的細節,也不必具有雲內部的專業知識,或者直接控制基礎設施。雲計算包 括基礎設施即服務(IaaS)、平台即服務(PaaS)和軟件即服務(SaaS)以及其它依賴於互聯網滿足客戶 計算需求的技術趨勢。雲計算服務通常提供通用的通過浏覽器訪問的在線商業應用,軟件和數據存儲在服 務器上。本文的介紹主要在“平台即服務”這個層次上。在這個層次上,Google 所提供的技術即 Google App Engine 。
Google 的“雲計算”平台
Google 作為一個搜索引擎,在其發展過程中不斷地追求更高的可伸縮型和性能,逐漸發展出一套以自 由技術為基礎的良好的解決方案,其中包括 Google File System、BigTable 以及 Map Reduce 等。基於 這些技術,Google 發展出了稱之為 App Engine 的平台,可以允許開發人員在它之上開發應用,同時也 利用上了 Google 所提供的基礎設施,在可擴展性等非功能性的需求上獲得好處,從而可以更加集中精力 地解決業務的需求。
Google App Engine 最早於 2008 年 4 月發布,最初支持的開發語言是 Python 。今年 4 月, Google App Engine 已經宣布了對 Java 語言的支持。下圖是 Google App Engine for Java 支持的概覽 。
圖 1. Google App Engine for Java 支持的概覽
在 Web 應用開發上,Google App Engine 支持 JSP 和 Servlet 技術;在數據存儲上,Google App Engine 支持 JDO 和 JPA 兩套機制,開發人員在面向對象的層次考慮數據的持久化,不需要考慮關系數 據庫。此外,Google App Engine 還提供一系列常用的服務,例如郵件收發、圖像處理和緩存等。
本文將通過一個簡單的實例來展示如何在 Google App Engine for Java 平台上構建 Web 應用。
准備開發環境
Google App Engine 支持兩種開發方式:基於集成開發工具 Eclipse 和不基於 Eclipse 。由於 Eclipse 是廣大 Java 開發人員使用最多的工具,本文將介紹基於 Eclipse 安裝 Google App Engine SDK 並開發部署應用到 Google App Engine 上。下面是簡要的過程:
安裝 JDK 1.5 或者 1.6
安裝 Eclipse 3.3 或者 3.4
下載 3.3 以上版本的 Eclipse 中的一款即可。
安裝 Google App Engine 的 SDK
運行 Eclipse 之後,在 Help > Software Updates 中獲取 Google App Engine 的插件。
圖 2. 安裝 Google App Engine Eclipse 插件
構建一個 Hello World 應用
安裝成功之後,就可以構建一個 Google App Engine 的應用了。選擇 File>New>Web Application Project。
圖 3. 新建 Web 項目
輸入項目名稱 Hello World 。
圖 4. 輸入項目名稱
運行該應用。
圖 5. 運行
應用運行起來之後,訪問 http://localhost:8080 。
圖 6. 運行結果
將應用部署到 Google App Engine 上
恭喜您,到這裡,你已經構建出了第一個 Google App Engine 上的應用,您可以將它部署到 Google 的 App Engine 平台上了。您需要做的就是申請一個帳號。
構建一個電子書分享網站
到這裡,讀者對 Google App Engine for Java 已經有了直接的印象。下面將通過一個更復雜的例子 ,講述利用 Google App Engine 中的編程時的核心概念。
用例介紹
一個電子書分享網站,最基礎的需要滿足的功能是允許用戶上傳文件和搜索文件。對於用戶的浏覽需 求,列出最近上傳的文件也是一個基本的需求。用例圖如下圖所示。
圖 7. 用例圖
存儲對象模型
存儲模型是一個應用開發的核心之一,在 Google 的 App Engine 的平台,開發人員看不到數據庫的 概念,不需要創建數據庫。Google 的 App Engine 提供了基於 JPA 和 JDO 的兩種技術給開發人員。這 裡我們利用 JDO 技術來做數據的存取。下面是電子書分享網站的 JDO 的對象模型。
圖 8. JDO 對象模型
示例演示:上傳電子書的用例
下面針對用戶上傳一個文檔這個用例,講述如何實現這個功能。
構建上傳文件頁面
在工程的 war 目錄下,添加一個新的文件 upload.html,在該文件中包含如下的代碼。
<form method="post" action="upload" enctype="multipart/form-data">
<table>
<tbody>
<tr><td><strong>*Please select a file</strong></td></tr>
<tr><td><input name="efile" type="file" id="fileNode"></td></tr>
<tr><td><strong>*Please set the file's title</strong></td></tr>
<tr><td><input name="filename" type="text" size=60></td></tr>
<tr><td><strong>File tags</strong></td></tr>
<tr><td><input name="tags" type="text" size=60>
<label>seperate by whitespace, like
<i><b>Google appengine</b></i>
</label></td>
</tr>
<tr><td><strong>File description</strong></td></tr>
<tr><td>
<textarea name="description" rows="5" cols="50"></textarea>
</td></tr>
<tr><td><strong>your name</strong></td></tr>
<tr><td><input name="username" type="text" size=60></td></tr>
<tr><td><strong>your email</strong></td></tr>
<tr><td><input name="useremail" type="text" size=60></td></tr>
</tbody>
</table>
<input type="submit" value="upload">
</form>
構建文件上傳處理的 servlet
利用 apache 的 commons 的文件上傳的庫,該 servlet 將上傳的內容解析成 File 對象。
圖 9. Servlet 模型
持久化改文件
應為 File 類已經添加了 JDO 需要的注釋,如下。
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class File {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String username;
@Persistent
private String useremail;
@Persistent
private Date uploadDate;
@Persistent
private String filename; //could be a filename or a url...
@Persistent
private String description; //could be a filename or a url...
@Persistent
private String mimeType; //pdf,ppt, chm etc.
@Persistent
private com.google.appengine.api.datastore.Blob file;
@Persistent
private Set<Key> tags = new HashSet<Key>(); // associated tags
利用 JDO 的規范提供的 API,可以持久化該對象到 Google 的 App Engine 的存儲設施上。
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(file);
} finally {
pm.close();
}
注意,這裡需要首先在在項目的 classpath 的 META-INF 目錄下有 jdoconfig.xml,其內容如下。
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.store.appengine.jdo.
DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns"
value="true"/>
</persistence-manager-factory>
</jdoconfig>
小結
本文介紹了雲計算領域的一個重要廠商 Google 的 Appengine for Java 的開發平台。通過一個實際 的例子講述了如何使用該平台開發 Web 應用。
本文配套源碼