在雲端上啜飲爪哇

3,179
-1

Published on

The Presentation of JavaTwo 2011 @Taiwan

Published in: Technology, Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,179
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
156
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

在雲端上啜飲爪哇

  1. 1. 在雲端上啜飲爪哇
  2. 2. 在雲端上啜飲爪哇 王建興 qing.chwang at gmail.com
  3. 3. 講者簡介 <ul><li>現職 </li></ul><ul><ul><li>聖藍科技技術長 </li></ul></ul><ul><li>譯作 </li></ul><ul><ul><li>Thinking in Java 4th Edition, 正體中文版 </li></ul></ul><ul><ul><li>Thinking in Java 2nd Edition, 正體中文版 </li></ul></ul><ul><ul><li>Essential C++, 正體中文版 </li></ul></ul><ul><li>專欄 </li></ul><ul><ul><li>iTHome 電腦報程式人專欄 </li></ul></ul>
  4. 4. Agenda <ul><li>雲端計算的好處 </li></ul><ul><li>以 Java 發展雲端應用軟體的選項 </li></ul><ul><li>GAE 簡介 </li></ul><ul><li>Case Study </li></ul><ul><li>結論 </li></ul>
  5. 5. 關於這個講題 <ul><li>雲端計算的觀念及具體的實作逐漸普及 </li></ul><ul><li>對 Java 開發者而言, </li></ul><ul><ul><li>基於什麼原因需要開發雲端上的軟體系統 </li></ul></ul><ul><ul><li>若欲開發雲端上的軟體系統,有什麼選項 </li></ul></ul><ul><ul><li>GAE 是一個適合以 Java 開發的雲端平台,該如何於其中開發雲端軟體系統 </li></ul></ul><ul><ul><li>使用 GAE 時,和典型的 Java Web 應用軟體開發上,會有那些差異需要考量 </li></ul></ul>
  6. 6. 雲端計算帶來的好處 <ul><li>對使用者而言 </li></ul><ul><ul><li>只要能上網,服務隨處隨時可得 </li></ul></ul><ul><li>對服務提供者而言 </li></ul><ul><ul><li>快速部署及獲得服務 </li></ul></ul><ul><ul><li>依實際需求量付費 </li></ul></ul><ul><ul><li>減少 IT 建置及管理的複雜度 </li></ul></ul><ul><ul><li>提高服務的規模可擴充性( scalability ) </li></ul></ul>
  7. 7. Java 在雲端的選項 <ul><li>基於既有的 IaaS 平台 </li></ul><ul><ul><li>例: Amazon EC2 </li></ul></ul><ul><li>基於既有的 PaaS 平台 </li></ul><ul><ul><li>例: GAE </li></ul></ul>
  8. 8. Amazon 的雲端計算平台 <ul><li>EC2: Elastic Compute Cloud </li></ul><ul><ul><li>依需要提供計算能力的服務 </li></ul></ul><ul><li>EBS: Elastic Block Service </li></ul><ul><ul><li>依需要提供備份的服務 </li></ul></ul><ul><li>S3: Simple Storage Service </li></ul><ul><ul><li>資料儲存服務 </li></ul></ul><ul><li>SQS: Simple Queue Service </li></ul><ul><ul><li>分散式的訊息佇列服務 </li></ul></ul><ul><li>SimpleDB </li></ul><ul><ul><li>簡易的結構化資料儲存服務 </li></ul></ul>
  9. 9. Amazon EC2 (1/2) <ul><li>虛擬化的計算環境 </li></ul><ul><li>透過 Web Service API 來管理一組 server instances </li></ul><ul><li>依據用量來收費 </li></ul><ul><ul><li>時數 </li></ul></ul><ul><ul><ul><li>Virtual Cores </li></ul></ul></ul><ul><ul><ul><li>Compute Units </li></ul></ul></ul><ul><ul><ul><li>32/64 bits </li></ul></ul></ul><ul><ul><ul><li>Memory </li></ul></ul></ul><ul><ul><ul><li>Storage </li></ul></ul></ul><ul><ul><li>對外頻寬 </li></ul></ul>
  10. 10. Amazon EC2 (2/2) <ul><li>作業系統,主要是 Unix </li></ul><ul><ul><li>Linux </li></ul></ul><ul><ul><li>OpenSolaris </li></ul></ul><ul><li>AMI </li></ul><ul><ul><li>Amazon Machine Image </li></ul></ul><ul><ul><li>內含你所開發的應用程式、程式庫、資料、以及相關的組態設定 </li></ul></ul>
  11. 11. 使用 EC2 對開發者的好處 <ul><li>簡化設定 </li></ul><ul><li>可以立即依需要取得所需數量的伺服器 </li></ul><ul><ul><li>降低初期投資成本 </li></ul></ul><ul><ul><li>當服務推出成功時,可以快速擴增規模 </li></ul></ul><ul><li>減低伺服器管理成本 </li></ul><ul><ul><li>採購 </li></ul></ul><ul><ul><li>日常系統管理 </li></ul></ul>
  12. 12. 在 EC2 上部署 Java Web 應用程式 *Chris Richardson, “Running Java applications on the Amazon Elastic Compute Cloud”
  13. 13. Cloud Tools <ul><li>開放原始碼專案 </li></ul><ul><li>提供快速便利的 EC2 部署 </li></ul><ul><li>提供 32/64 bits 的 AMI </li></ul><ul><li>CentOS 5.10 </li></ul><ul><li>安裝: </li></ul><ul><ul><li>Apache/Tomcat/MySQL/JMeter/JetS3t </li></ul></ul><ul><li>設定 </li></ul><ul><ul><li>Tomcat/MySQL/Apache </li></ul></ul>*http://code.google.com/p/cloudtools/
  14. 14. Java libraries for AWS <ul><li>JetS3t </li></ul><ul><ul><li>存取 S3 的一套 API </li></ul></ul><ul><ul><li>https://jets3t.dev.java.net/ </li></ul></ul><ul><li>Typica </li></ul><ul><ul><li>提供存取 SQS, EC2, SimpleDB 的 API </li></ul></ul><ul><ul><li>http://code.google.com/p/typica/ </li></ul></ul><ul><li>SimpleJPA </li></ul><ul><ul><li>在 SimpleDB 上實作一部份的 JPA 介面 </li></ul></ul><ul><ul><li>http://code.google.com/p/simplejpa/ </li></ul></ul>
  15. 15. 基於 IaaS 平台的優缺點 <ul><li>優點 </li></ul><ul><ul><li>運用彈性高 </li></ul></ul><ul><ul><li>可量身訂製打造自需的環境及架構 </li></ul></ul><ul><li>缺點 </li></ul><ul><ul><li>需處理較多和系統架構相關的議題 </li></ul></ul><ul><ul><ul><li>規模擴充性 </li></ul></ul></ul><ul><ul><ul><li>容錯 </li></ul></ul></ul><ul><ul><li>需自行管理及設定 </li></ul></ul>
  16. 16. 基於 PaaS 平台開發應用軟體 <ul><li>PaaS 平台提供者,處理大架構上的技術議題 </li></ul><ul><ul><li>規模可擴充性 </li></ul></ul><ul><ul><li>系統容錯能力 </li></ul></ul><ul><ul><li>系統穩定度 </li></ul></ul><ul><ul><li>系統安全性 </li></ul></ul><ul><li>應用系統開發者 </li></ul><ul><ul><li>專注於應用本身 </li></ul></ul>
  17. 17. 規模擴展時的議題 <ul><li>當你需要擴展系統規模時 </li></ul><ul><ul><li>加機器? </li></ul></ul><ul><ul><li>加記憶體? </li></ul></ul><ul><ul><li>加資料庫伺服器? </li></ul></ul><ul><ul><li>調整系統架構? </li></ul></ul><ul><ul><ul><li>增加快取伺服器 </li></ul></ul></ul><ul><ul><ul><li>使用 NoSQL </li></ul></ul></ul><ul><ul><ul><li>… </li></ul></ul></ul>
  18. 18. 這正是為什麼有時候我們需要基於 PaaS 平台來開發的重要原因之一
  19. 19. 什麼是 GAE ? (1/2) <ul><li>Google: Google App Engine 讓你得以在和 Google 自身應用程式所處的相同系統上,開發並且運行 Web 應用程式 </li></ul><ul><li>Wikipedia: Google App Engine 是個在 Google 所管理的資料中心之上開發及運行 Web 應用程式的平台 </li></ul>
  20. 20. 什麼是 GAE ? (2/2) <ul><li>GAE 讓你在 Google 所打造的基礎設施之上運行 Web 應用程式 </li></ul><ul><li>在 GAE 上開發應用程式 </li></ul><ul><ul><li>開發容易 </li></ul></ul><ul><ul><li>維護容易 </li></ul></ul><ul><ul><li>擴充規模也很容易 </li></ul></ul>
  21. 21. 執行環境及程式語言 <ul><li>採用標準 Java 執行環境 </li></ul><ul><ul><li>標準化的 Java 技術 </li></ul></ul><ul><ul><ul><li>JVM </li></ul></ul></ul><ul><ul><ul><li>Java servlets </li></ul></ul></ul><ul><ul><ul><li>Java 程式語言 </li></ul></ul></ul><ul><ul><li>可運行於 JVM 的其他直譯式 / 編譯式語言 </li></ul></ul><ul><ul><ul><li>JavaScript </li></ul></ul></ul><ul><ul><ul><li>Ruby </li></ul></ul></ul><ul><ul><ul><li>Go </li></ul></ul></ul><ul><li>也提供 Python 執行環境 </li></ul>
  22. 22. 成本及預算 <ul><li>用多少付多少 </li></ul><ul><li>沒有設置成本,也沒有循環費用 </li></ul><ul><li>一開始使用可毋需付費 </li></ul><ul><li>提供免費額度的資源,足以支持有每月五百萬次頁面檢視量 </li></ul><ul><ul><li>500 MB 儲存空間 </li></ul></ul><ul><ul><li>足夠的 CPU 計算力 </li></ul></ul><ul><ul><li>足夠的頻寬 </li></ul></ul><ul><li>依據應用程式所動用的資源計費 </li></ul><ul><ul><li>儲存空間 </li></ul></ul><ul><ul><li>頻寬 </li></ul></ul><ul><li>可以控制應用程式資源使用的上限 </li></ul>
  23. 23. 行情 *http://code.google.com/intl/en/appengine/docs/billing.html $0.64 Hourly per instance Backends ( B8   class) $0.32 Hourly per instance Backends ( B4   class) $0.16 Hourly per instance Backends ( B2   class) $0.08 Hourly per instance Backends ( B1   class) $0.30 N/A (daily) Always On $0.0001 recipients Recipients Emailed $0.45 gigabytes per month High Replication Storage $0.15 gigabytes per month Stored Data $0.10 CPU hours CPU Time $0.10 gigabytes Incoming Bandwidth $0.12 gigabytes Outgoing Bandwidth Unit cost Unit Resource
  24. 24. 架構 Request Response Web page transactions Result Browser  URL fetch or E-mail More services Schedule routine Static Storage HTTP / HTTPS * 清大資工鍾葉青教授雲端計算課程講義投影片 Web interface Sandbox Runtime environment Datastore Memcache
  25. 25. GAE 採用 Sandbox 的概念 <ul><li>利用 Sandbox 來做隔離及保護 </li></ul><ul><li>應用程式運行於一方面安全,一方面又受限的環境中 </li></ul><ul><li>所施加的限制,都是為了提供 </li></ul><ul><ul><li>易於擴充規模 </li></ul></ul><ul><ul><li>隔離安全不受干擾侵犯 </li></ul></ul><ul><li>的執行環境 </li></ul>
  26. 26. GAE 上的諸般限制 例一:網路存取 <ul><li>應用程式僅能對外進行兩種網路存取 </li></ul><ul><ul><li>以 URL 形式存取 </li></ul></ul><ul><ul><li>發送電子郵件 </li></ul></ul><ul><li>若欲連結至應用程式,僅能以兩種協定建立連線 </li></ul><ul><ul><li>HTTP ( 80 port ) </li></ul></ul><ul><ul><li>HTTPS( 443 port ) </li></ul></ul><ul><li>無法建立任意 TCP/UDP 連線,連至其他伺服器 </li></ul><ul><li>無法自行建立任何 socket port 供其他應用程式連接 </li></ul><ul><li>這些 限制是基於安全性考量 </li></ul>
  27. 27. GAE 上的諸般限制 例二:檔案系統存取 <ul><li>應用程式無法對檔案系統進行存取 </li></ul><ul><li>應用程式僅能讀取與應用程式一起打包上傳的檔案 </li></ul><ul><li>在 GAE 上,任何資料僅能儲存在 </li></ul><ul><ul><li>Datastore </li></ul></ul><ul><ul><li>memcache </li></ul></ul><ul><li>這些限制是基於規模擴充性及系統安全性 </li></ul>
  28. 28. GAE 上的諸般限制 例三:執行時間及方式 <ul><li>程式碼的執行只能用在三種場合 </li></ul><ul><ul><li>處理來自於 Web 端的請求 </li></ul></ul><ul><ul><li>排程執行的 task </li></ul></ul><ul><ul><li>Backend </li></ul></ul><ul><li>應用程式在處理來自 Web 端的請求時,得在 30 秒內完成回應 </li></ul><ul><li>應用程式不能衍生額外的執行緒 </li></ul><ul><li>這些限制是基於安全性及規模擴充性 </li></ul>
  29. 29. GAE 上的 Java 執行環境 (1/2) <ul><li>Java Runtime Environment </li></ul><ul><ul><li>Java Servlet </li></ul></ul><ul><ul><li>JavaServer Pages (JSPs). </li></ul></ul><ul><li>Java Version </li></ul><ul><ul><li>Java 6 </li></ul></ul><ul><ul><li>使用 Java 5 或 Java 6 皆可 </li></ul></ul><ul><ul><li>Sandbox 上的諸般限制,皆於 JVM 中實作 </li></ul></ul>
  30. 30. GAE 上的 Java 執行環境 (2/2) <ul><li>API </li></ul><ul><ul><li>Java 標準 APIs </li></ul></ul><ul><ul><li>Java Data Objects (JDO)/ Java Persistence API (JPA) </li></ul></ul><ul><ul><li>JavaMail API </li></ul></ul><ul><ul><li>java.net HTTP API </li></ul></ul><ul><ul><li>Google Accounts APIs </li></ul></ul><ul><li>程式語言 </li></ul><ul><ul><li>Java </li></ul></ul><ul><ul><li>JavaScript </li></ul></ul><ul><ul><li>Ruby </li></ul></ul><ul><ul><li>Scala </li></ul></ul><ul><ul><li>Go </li></ul></ul>
  31. 31. GAE 的 Datastore (1/2) <ul><li>GAE 的 Datastore 是一個分散式的資料儲存服務 </li></ul><ul><ul><li>具規模擴充性 </li></ul></ul><ul><ul><li>有 transaction 的能力 </li></ul></ul><ul><li>GAE 的 Datastore 和傳統的關聯式資料庫不同 </li></ul><ul><ul><li>其中的 data object (稱為 entity ),都擁有一組屬性 </li></ul></ul><ul><ul><li>Datastore 的 entity 沒有所謂 schema 的觀念 </li></ul></ul>
  32. 32. GAE 的 Datastore (2/2) <ul><li>可透過 JDO/JPA 的 API 來存取 Datastore </li></ul><ul><li>Datastore 能維持資料的一致性( strong consistent ) </li></ul><ul><li>Datastore 採用樂觀式並行性控制( optimistic concurrency control ) </li></ul>
  33. 33. 處理 Datastore 會是在 GAE 上開發應用系統的最大挑戰
  34. 34. Kind 、 Entity 、 Key 、 Property User 傳統關聯式資料庫 Datastore *Cloud Tu @TWJUG User Sport Null Null Favor2 Movie Null Null Favor3 Music Cloud 1 Music Tom 3 Null John 2 Favor1 Name PK Music Favor Cloud Name 1 Key John Name 2 Key Music , Sport , Movie Favor Tom Name 3 Key Kind Table Key PK Property Field Entity Row
  35. 35. Native Datastore 操作 DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Entity employee = new Entity(&quot;Employee&quot;); employee.setProperty(&quot;firstName&quot;, &quot;Antonio&quot;); employee.setProperty(&quot;lastName&quot;, &quot;Salieri&quot;); Date hireDate = new Date(); employee.setProperty(&quot;hireDate&quot;, hireDate); employee.setProperty(&quot;attendedHrTraining&quot;, true); datastore.put(employee); Kind Entity Key Property *Cloud Tu @TWJUG 在 Entity 的 constructor 中指定。未指定時,系統會自動指派一個 UUID 的 key
  36. 36. 用 JDO 的方式描述資料 (1/2) <ul><li>@PersistenceCapable(identityType = IdentityType.APPLICATION) </li></ul><ul><li>public class Album </li></ul><ul><li>{ </li></ul><ul><li>@PrimaryKey </li></ul><ul><li>@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) </li></ul><ul><li>private Long id; </li></ul><ul><li>@Persistent </li></ul><ul><li>private String albumURL; </li></ul><ul><li>@Persistent </li></ul><ul><li>private String owner; </li></ul><ul><ul><li>… </li></ul></ul>
  37. 37. 用 JDO 的方式描述資料 (2/2) <ul><li>public Album(String _albumURL, String _owner, String _siteProvider) </li></ul><ul><li>{ </li></ul><ul><li>albumURL = _albumURL; </li></ul><ul><li>owner = _owner; </li></ul><ul><li>siteProvider = _siteProvider; </li></ul><ul><li>status = 0; </li></ul><ul><li>submitDate = new Date(); </li></ul><ul><li>} </li></ul><ul><li>public Long getId() </li></ul><ul><li>{ </li></ul><ul><li>return id; </li></ul><ul><li>} </li></ul><ul><li>public String getAlbumURL() </li></ul><ul><li>{ </li></ul><ul><li>return albumURL; </li></ul><ul><li>} </li></ul><ul><ul><li>… </li></ul></ul>
  38. 38. 對 Datastore 進行查詢 <ul><li>Query q = new Query(&quot;Person&quot;); q.addFilter(&quot;lastName&quot;, </li></ul><ul><li>Query.FilterOperator.EQUAL , </li></ul><ul><li>lastNameParam); q.addFilter(&quot;height&quot;, </li></ul><ul><li>Query.FilterOperator.LESS_THAN , </li></ul><ul><li>maxHeightParam); PreparedQuery pq = datastore.prepare(q); pq.asIterable(); </li></ul>
  39. 39. JDO/Query Language public byte[] getPhoto(long id) { PersistenceManager pm = PMF.get().getPersistenceManager(); String query = &quot;select from &quot; + Photo.class.getName() + &quot; where id == &quot;+id; List<Photo> photos = (List<Photo>) pm.newQuery(query).execute(); if( photos.isEmpty() ) { pm.close(); return null; } Photo p = photos.get(0); Blob content = p.getContent(); byte[] b = content.getBytes(); pm.close(); return b; }
  40. 40. EntityGroup <ul><li>擁有相同 ParentKey 的 Entity 即屬於同一 EntityGroup </li></ul><ul><li>對位在同一 EntityGroup 內 Entity 所進行的操作可在同一 transaction 裡 </li></ul><ul><li>適合 One to Many 的資料表示方式 </li></ul>
  41. 41. EntityGroup User *Cloud Tu @TWJUG 自動產生 RootKey ParentKey Cloud Name 1 Key 自動產生 RootKey ParentKey John Name 2 Key 2 ParentKey Mary Name 3 Key 2 ParentKey Mary Name 4 Key 2 ParentKey Joe Name 5 Key A EntityGroup B EntityGroup
  42. 42. 建構 EntityGroup Entity parent = new Entity(&quot;User&quot;); Entity child1 = new Entity(&quot;User&quot;, parent.getKey()); Entity child2 = new Entity(&quot;User&quot;, parent.getKey()); Constructor 未指定其 ParentKey 時,系統會自動產生一個 RootKey <ul><li>child1 、 child2 有相同的 parentkey ,二者可在同一 transaction 進行資料操作 </li></ul><ul><li>可在 parent 刪除時,一併把 children(child1 、 child2) 刪除 ( 註:非系統本身特性,而是在刪除時在程式碼裡註明一併刪除 ) </li></ul><ul><li>一個 transaction 中僅能有一 EntityGroup 進行操作 </li></ul>*Cloud Tu @TWJUG
  43. 43. Google Accounts (1/2) <ul><li>GAE 應用程式能直接運用 Google Account 做為使用者認證的機制 </li></ul><ul><ul><li>對使用者來說,要使用應用程式毋需註冊新帳號 </li></ul></ul><ul><ul><li>對開發者來說,不需要另行實作認證機制 </li></ul></ul><ul><li>GAE 應用程式運用 Google Account 時,能取得一些使用者的資訊,包括 </li></ul><ul><ul><li>Email 位址 </li></ul></ul><ul><ul><li>顯示名稱 </li></ul></ul>
  44. 44. Google Accounts (2/2) <ul><li>系統管理者身份 </li></ul><ul><ul><li>透過 Users API 可以知道目前所服務的使用者,是否為註冊的系統管理員 </li></ul></ul>
  45. 45. GAE 提供的 Service (1/2) <ul><li>URL Fetch </li></ul><ul><ul><li>使用同於 Google infrastructure 的高速網路來存取網路上的資源 </li></ul></ul><ul><li>Mail </li></ul><ul><ul><li>使用 Google infrastructure 來寄送電子郵件 </li></ul></ul>
  46. 46. GAE 提供的 Service (2/2) <ul><li>Memcache </li></ul><ul><ul><li>讓應用程式以 key-value 方式,高效存取 in-memory 的快取資料 </li></ul></ul><ul><li>Image Manipulation </li></ul><ul><ul><li>提供操作影像的各種基本操作,包括尺寸變更、裁剪、旋轉、以及翻轉等 </li></ul></ul><ul><ul><li>支援 JPEG 及 PNG 格式 </li></ul></ul>
  47. 47. Scheduled Tasks <ul><li>依照所設定的排程(例如,每小時 、 每天),來執行對應的工作 </li></ul><ul><li>也就是傳統所說的“ cron jobs” </li></ul>
  48. 48. Backends (1/2) <ul><li>Backends 是在 GAE 中一種特殊的 instance </li></ul><ul><ul><li>沒有執行時間限制 </li></ul></ul><ul><ul><li>有更多的記憶體空間 </li></ul></ul><ul><ul><li>有更高的 CPU 限制 </li></ul></ul><ul><li>適合長期執行的工作任務 </li></ul><ul><li>有兩種類型 </li></ul><ul><ul><li>常駐( resident ) </li></ul></ul><ul><ul><li>動態( dynamic ) </li></ul></ul>
  49. 49. Backends (2/2) <ul><li>無法依 request 量自動 scale </li></ul><ul><ul><li>僅能指定 instance 的量 </li></ul></ul><ul><li>每個 Backend instance 可對應到 unique 的 URL </li></ul><ul><ul><li>http://[instance].[backend].[app].appspot.com </li></ul></ul><ul><ul><li>未指定 instance 則指定至第一個 instance </li></ul></ul>
  50. 50. GAE 中三種類型的程式碼 Request Handler Scheduled Task Backend
  51. 51. 同與異 (1/2) <ul><li>基於 GAE 開發 Web 應用系統和傳統非雲端平台的開發幾乎是相同的 </li></ul><ul><li>同樣的程式語言 </li></ul><ul><li>同樣的標準 API </li></ul><ul><li>同樣的 Web 技術及框架 </li></ul>
  52. 52. 同與異 (2/2) <ul><li>因應雲端平台所需的特性,也有一些差異 </li></ul><ul><li>掌握這些差異,就能順利的遷移至雲端開發 </li></ul><ul><ul><li>Sandbox 中的限制 </li></ul></ul><ul><ul><li>Web 端執行時間的限制 </li></ul></ul><ul><ul><li>操作資料的方式大異於傳統關聯式資料庫的存取 </li></ul></ul>
  53. 53. GAE SDK <ul><li>下載 </li></ul><ul><ul><li>http://code.google.com/intl/zh-TW/appengine/downloads.html </li></ul></ul><ul><li>內含一個 Web server </li></ul><ul><ul><li>在本地端模擬 GAE 的所有 service </li></ul></ul><ul><ul><li>在本地端模擬 sandbox 的行為 </li></ul></ul><ul><ul><li>小細節處略有差異 </li></ul></ul><ul><li>提供在 GAE 上可取用的所有 API 及 library </li></ul>
  54. 54. GAE 開發流程 (1/3) <ul><li>編譯方式 </li></ul><ul><ul><li>Google Plugin for Eclipse </li></ul></ul><ul><ul><li>Ant build tool </li></ul></ul><ul><li>開發 </li></ul><ul><ul><li>使用 GAE SDK 中的 API 及 library 搭配標準的 Java 開發環境 </li></ul></ul><ul><ul><li>部署至本地端的 Web server 進行測試 </li></ul></ul>
  55. 55. GAE 開發流程 (2/3) <ul><li>發行 </li></ul><ul><ul><li>使用 SDK 所附的工具上傳應用程式 </li></ul></ul><ul><ul><li>使用工具上傳時需指定開發者的 Google 帳戶及密碼 </li></ul></ul><ul><li>改版 </li></ul><ul><ul><li>可利用上傳工具上傳新版本 </li></ul></ul><ul><ul><li>進行測試 </li></ul></ul><ul><ul><li>切換至新版運行 </li></ul></ul>
  56. 56. GAE 開發流程 (3/3) <ul><li>系統管理 </li></ul><ul><ul><li>Web 介面進行系統管理的諸般操作 </li></ul></ul><ul><ul><li>提供 Web 介面進行系統管理的諸般操作 </li></ul></ul><ul><ul><ul><li>創建新的應用程式 </li></ul></ul></ul><ul><ul><ul><li>設定應用程式的域名 </li></ul></ul></ul><ul><ul><ul><li>將應用程式的運行版本切換至新版本 </li></ul></ul></ul><ul><ul><ul><li>檢視存取及錯誤的日誌記錄 </li></ul></ul></ul><ul><ul><ul><li>瀏覽應用程式的 datastore </li></ul></ul></ul>
  57. 57. 域名 <ul><li>你可以選擇自有的域名 </li></ul><ul><li>你也可以選擇使用 GAE 服務提供的免費域名 *.appspot.com </li></ul><ul><ul><li>例如: diggirlcloud.appspot.com </li></ul></ul>
  58. 58. 克服各種限制 <ul><li>不能自建 Thread </li></ul><ul><li>回應必須即時( 30 秒) </li></ul><ul><li>沒有檔案系統可運用 </li></ul><ul><li>僅有 HTTP/HTTPS 及 Email 服務可對外存取資源 </li></ul><ul><li>Session 中的物件必須 serializable </li></ul>
  59. 59. 到雲端上喝 Java 咖啡 <ul><li>重新打造全新的應用程式 </li></ul><ul><ul><li>掌握 GAE 上的特性及限制 </li></ul></ul><ul><li>移植舊有的系統至 GAE </li></ul><ul><ul><li>資料模式的轉變 </li></ul></ul><ul><ul><li>非 request/response 處理的程式,需改以排程 Task 或 Backend 來處理 </li></ul></ul><ul><ul><li>面對 30 秒限制 </li></ul></ul>
  60. 60. Case Study <ul><li>Diggirl x Cloud </li></ul><ul><ul><li>移植舊有的網站至 GAE 上 </li></ul></ul><ul><li>Directory Service </li></ul><ul><ul><li>擴展既有的 Directory Service ,改以 GAE 做為輔助 </li></ul></ul>
  61. 61. Diggirl x Cloud
  62. 62. Diggirl x Cloud for iPhone (1/2)
  63. 63. Diggirl x Cloud for iPhone (2/2)
  64. 64. Diggirl 考慮移植至 GAE 的原因 <ul><li>節省基礎建設投資及開支 </li></ul><ul><ul><li>主機 </li></ul></ul><ul><ul><li>頻寬 </li></ul></ul><ul><li>簡化系統管理及維護 </li></ul><ul><li>得到極佳的系統可擴充性及穩定性 </li></ul><ul><li>移植方便 </li></ul><ul><ul><li>標準化的 Java Servlet/JSP 技術 </li></ul></ul><ul><li>立足 Google Infrastructure </li></ul>
  65. 65. 移植過程的變化 <ul><li>資料儲存 </li></ul><ul><ul><li>MySQL -> GAE Datastore </li></ul></ul><ul><ul><li>SQL -> NoSQL (具規模可擴充性) </li></ul></ul><ul><ul><li>使用 JDO 來存取( Object-Oriented ) </li></ul></ul><ul><li>相簿擷取 </li></ul><ul><ul><li>利用 URL Fetch Service 擷取(快) </li></ul></ul><ul><ul><li>利用 Image Service 製作縮圖(快) </li></ul></ul><ul><li>定期的排名計算 </li></ul><ul><ul><li>Cron Job -> Schedule Tasks </li></ul></ul>
  66. 66. 移植過程的困難 <ul><li>資料模型的轉變 </li></ul><ul><ul><li>因為原來的資料模型就很單純,所以轉換沒有太大問題 </li></ul></ul><ul><ul><li>原來的資料存取層採用 Business Façade 模式,所以衝擊都被它隔離了 </li></ul></ul><ul><li>沒有檔案系統 </li></ul><ul><ul><li>改用 Datastore 中的 Blob 來儲存資料 </li></ul></ul><ul><ul><li>用 Datastore 儲存圖片資料是相對昂貴的 </li></ul></ul><ul><ul><li>可改用 Amazon S3 服務來做圖片的儲放及存取 </li></ul></ul>
  67. 67. Directory Service 的原有架構 Internet API
  68. 68. Directory Service 的現有問題 <ul><li>需要全年不間斷的提供服務 </li></ul><ul><ul><li>IT 的維護人力 </li></ul></ul><ul><li>有時還會遭遇 DDoS 攻擊 </li></ul><ul><li>全球建置伺服器的成本 </li></ul><ul><li>資料規模擴充性 </li></ul>
  69. 69. 採 GAE 輔助的新架構 Internet Internet API API
  70. 70. 移植過程的變化 <ul><li>資料模型的轉變 </li></ul><ul><ul><li>MySQL -> GAE Datastore </li></ul></ul><ul><ul><li>SQL -> NoSQL (具規模可擴充性) </li></ul></ul><ul><ul><li>使用 native 的 Datastore API </li></ul></ul><ul><ul><li>Normalized -> Denormalized (提升效率) </li></ul></ul><ul><li>定期的排名計算 </li></ul><ul><ul><li>Cron Job -> Schedule Tasks </li></ul></ul>
  71. 71. Schemaless 的設計變動 <ul><li>Denormaliztion </li></ul><ul><ul><li>減少 table 的數量 </li></ul></ul><ul><ul><li>增加效率 </li></ul></ul><ul><li>目錄中的項目有很多不同的分類,而目錄會依據分類提供項目的排名 </li></ul><ul><ul><li>舊有的方式是個別再建排名表 </li></ul></ul><ul><ul><li>新的方式是每個項目多若干個 property ,用來表示它在某分類的排名 </li></ul></ul><ul><ul><ul><li>例如 Rank_XXX 的值代表它在 XXX 分類下的排名 </li></ul></ul></ul><ul><ul><li>只要用 sort query 針對 Rank_XXX 進行查詢,即可查出 XXX 分類下依據排名的項目清單 </li></ul></ul>
  72. 72. 得道昇天後的好處 <ul><li>穩固 </li></ul><ul><li>快,就是快 </li></ul><ul><li>解決規模擴充性問題 </li></ul><ul><li>節省基礎施設投資 </li></ul>
  73. 73. 結論 <ul><li>Java/JVM 在 PaaS 領域中絕對是扮演舉足輕重的角色 </li></ul><ul><li>基於 Java 的 PaaS 開發應用系統,可以協助解決眾多的議題 </li></ul><ul><li>從小規模到大規模都適合在雲端上開發 </li></ul>
  74. 74. Special Thanks To <ul><li>Itszero </li></ul><ul><ul><li>http://twitter.com/itszero </li></ul></ul><ul><ul><li>http://itszero.org/ </li></ul></ul><ul><li>Cloud Tu </li></ul><ul><ul><li>http://cloudtu.blogspot.com/ </li></ul></ul><ul><li>Gen Tseng </li></ul>
  75. 75. Resources <ul><li>GAE 簡介 </li></ul><ul><ul><li>http://code.google.com/intl/en/appengine/docs/java/overview.html </li></ul></ul>
  76. 76. Thanks!

×