熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

如何用Java平台訪問開源雲存儲?

2013-11-15 11:37:41  來源: JSP教程 

  盡管雲計算這一術語並不新鮮(Amazon在年就開始提供它的雲服務)但從年起它才開始真正成為流行詞這期間Google和Amazon的雲服務逐漸獲得了公眾的關注 Google的App Engine使用戶能夠在Google基礎設施上構建和托管 Web 應用程序

  連同SAmazonWeb Services還包括Elastic Cloud Compute (EC)計算Web服務該服務可以在Amazon的基礎設施上托管應用程序其他公司也開始蠢蠢欲動准備與Amazon和Google一決高下其中就包括 Microsoft?的 Azure甚至 Sun Microsystems(其雲計算還沒有正式推向市場)也想分一杯羹例如IBM最近宣布它將提供某些產品供開發人員在AmazonEC 環境中使用

  AmazonSimple Storage Service (S)是一個公開的服務Web應用程序開發人員可以使用它存儲數字資產包括圖片視頻音樂和文檔S提供一個 RESTful API以編程方式實現與該服務的交互通過本文您將了解如何使用開源的JetSt庫利用Amazon的S雲服務存儲和檢索數據

  面向開源的S雲平台介紹

  雲是一個抽象的概念表示松散連接在一起的計算機組這些計算機共同執行某項任務或者服務就像是使用一個單獨的實體完成一樣此概念背後的架構也很抽象每個雲提供者都可以根據各自情況隨意設計它的產品軟件即服務(Software as a ServiceSaaS)是一個與雲相關的概念表示雲向用戶提供某種服務雲模型可以降低用戶成本因為他們無需購買軟件和硬件也可以運行 — 服務提供者已經為用戶提供了必要的組件

  以Amazon的S產品為例顧名思義這是一個公開的服務使 Web 開發人員能夠存儲數字資產(如圖片視頻音樂和文檔等)以便在應用程序中使用使用S它就像一個位於 Internet 的機器有一個包含數字資產的硬盤驅動實際上它涉及到許多機器(位於各個地理位置)其中包含數字資產(或者數字資產的某些部分)Amazon還處理所有復雜的服務請求可以存儲數據並檢索數據您只需要付少量的費用(大約每月 美分 /GB)就可以在Amazon的服務器上存儲數據 美元即可通過Amazon服務器傳輸數據

  Amazon的S服務沒有重復開發它公開了RESTful API使您能夠使用任何支持 HTTP 通信的語言訪問S JetSt項目是一個開源Java庫可以抽象出使用S的RESTful API的細節將API公開為常見的Java方法和類編寫的代碼越少越好難道不是嗎?充分利用其他人的成果也是不錯的在本文中您將看到JetSt使S和Java語言的工作變得更加簡單從根本上提高了效率

  S開源應用模式介紹

  理論上S是一個全球存儲區域網絡(SAN)它表現為一個超大的硬盤您可以在其中存儲和檢索數字資產但是從技術上講Amazon的架構有一些不同您通過S存儲和檢索的資產被稱為對象對象存儲在存儲段(bucket)中您可以用硬盤進行類比對象就像是文件存儲段就像是文件夾(或目錄)與硬盤一樣對象和存儲段也可以通過統一資源標識符(Uniform Resource IdentifierURI)查找

  例如在我的硬盤中我有一個名為 whitepaperpdf 的文件它位於主目錄中名為 documents 的文件夾中相應的該pdf文件的URI為/home/aglover/documents/whitepaperpdf 在SURI有一點不同首先存儲段只能是頂級的 — 無法像嵌套硬盤中的文件夾(或目錄)一樣進行嵌套其次存儲段必須遵循 Internet 命名法則;句點旁邊沒有斜槓名稱不包括下劃線等等最後由於存儲段名稱已經是Amazon域內的 () 公共URI的一部分存儲段名稱必須在所有S中是惟一的(好消息是每個帳戶只能包含 個存儲段因此不用擔心別人占用了所有的好名字)

  存儲段在S中是URI的根也就是說存儲段的名稱將是指向S中某個對象的URI的一部分例如如果我有一個名為 agdocs 的存儲段以及一個名為 whitepaperpdf 的對象URI將是

  S還提供了指定存儲段和對象的所有者和權限的能力就像對待硬件的文件和文件夾一樣在S中定義對象或存儲段時您可以指定一個訪問控制策略注明誰可以訪問您的S資產以及如何訪問(例如讀和寫權限)相應地您可以通過許多方式提供對您的對象的訪問使用RESTful API只是其中一種

  這裡Amazon有一個神奇的DNS魔術用戶不用擔心S資產的 URL 通過 Domain Name System (DNS) 和 CNAME(canonical name的縮寫)記錄您可以將自定義程度更高的 URL 映射到S的 URL 這樣一來您就隱藏了您(或您的應用程序)依賴S的事實!

  開始使用開源S和JetSt

  要開始使用S您需要一個帳戶S不是免費的因此在創建帳戶時您必須向Amazon提供一種支付手段(比如信用卡號碼)不用擔心不收初裝費;您只需要為使用付費對於本文的示例只需要支付不到 美元的費用

  在創建帳戶的過程中您還需要創建憑據訪問密鑰和秘密密鑰(就像用戶名和密碼)(您還可以獲取 x 證書;但是只有在使用Amazon的 SOAPAPI時才需要使用該證書)和任何訪問信息一樣都必須保管好您的秘密密鑰因為任何人使用您的憑據訪問S您都將為此付費因此每當創建存儲段或對象時默認的行為是讓所有內容都私有;您必須顯式獲取對外部世界的訪問

  有了訪問密鑰和秘密密鑰您可以下載 JetSt並使用它通過RESTful API與S交互

  使用編程手段通過 JetSt 登錄S可以分為兩步首先必須創建一個 AWSCredentials 對象然後將它傳遞到 SService 對象AWSCredentials 對象非常簡單它將訪問密鑰和秘密密鑰視為 StringSService 對象實際上是一個接口類型因為S同時提供RESTful API和一個 SOAP APIJetSt 庫可以提供兩種實現類型RestSService 和 SoapSService就本文而言(包括大部分S事務)RESTful API的簡潔性讓它成為一個很好的選擇

  創建一個連接的 RestSService 實例很簡單如清單 所示

  步驟 創建一個 JetSt 的 RestSService 實例

  def awsAccessKey = blahblah

  def awsSecretKey = blahblah

  def awsCredentials = new AWSCredentials(awsAccessKey awsSecretKey)

  def sService = new RestSService(awsCredentials)

  現在可以執行一些有趣的操作了例如創建存儲段添加一個影片然後獲取一個有時間限制的URL 實際上這聽起來像一個業務流程不是嗎?這是一個與發布有限資產(比如影片)有關的業務流程

  創建存儲段

  對於虛構的電影業務我將創建一個稱為 bci 的存儲段借助 JetSt該流程很簡單通過 SService 類型您有幾個選項我更喜歡使用 getOrCreateBucket 調用如清單 所示顧名思義調用該方法可能返回一個存儲段實例(表示為 SBucket 類型的實例)或在S中創建代碼段

  S平台詳細使用步驟簡介

  步驟 在S服務器上創建存儲段

  def bucket = sServicegetOrCreateBucket(bci)

  不要被我這個簡單的代碼示例所蒙蔽JetSt 庫的擴展性非常強例如您可以快速確定擁有多少存儲段 —— 只需通過 listAllBuckets 調用請求一個S Service 實例即可該方法返回一個 SBucket 實例數組對於任何存儲段實例您可以詢問它的名稱和創建日期更重要的是您可以通過JetSt 的 AccessControlList 類型控制與之相關的權限例如我可以獲取 bci 存儲段實例並允許任何人可以公開讀取和編寫如清單 所示

  步驟 修改存儲段的訪問控制列表

  def bucketacl = AccessControlListREST_CANNED_PUBLIC_READ_WRITE

  當然通過 API您也可以隨意刪除存儲段Amazon甚至允許您指定創建存儲段的地理位置Amazon簡化了存儲實際數據的復雜性但是您可以告訴Amazon要將存儲段(及其內部所有的對象)放在美國或歐洲(當前可用選項)

  向存儲段添加對象

  使用JetSt 的API創建S對象就像操作存儲段一樣簡單JetSt 庫也很智能可以負責處理與S存儲段內文件相關的內容類型例如我想向S上傳一段影片nerfwarsmp以便用戶能夠在有限的時間內觀看創建一個S對象與創建常見的 javaioFile 類型一樣簡單並能將SObject 類型與存儲段關聯如清單 所示

  步驟 創建一個S對象

  def sobj = new SObject(bucket new File(/path/to/nerfwarsmp))

  使用文件和存儲段初始化 SObject 之後要做的所有事情就是通過 putObject 方法上傳如清單 所示

  步驟 上傳影片

  sServiceputObject(bucket sobj)

  使用清單 可以完成上傳現在影片位於Amazon服務器了影片的鍵就是它的名稱當然您可以根據需要重寫該名稱以調用其他對象實際上JetSt API(以及 AmazonSRESTful API)公開了許多信息供您創建對象時使用我們知道您還可以提供訪問控制列表S中的任何對象都可以保存API允許您創建的其他元數據之後可以通過該元數據的SAPI(以及派生的 JetSt)查詢任何對象

  創建對象的URL

  到現在為止我的S實例有一個包含影片的存儲段實際上我的影片可以通過以下URI獲取 但是只有我才能獲取(在本例中我只能通過編程方式訪問它因為與所有內容關聯的默認訪問控制被設置為拒絕任何未授權訪問)我的目的是為選擇的用戶提供一種方式查看新影片(在有限的時間內)直到我開始收取訪問費用(S也會提供幫助)

  創建一個公共 URL 是S提供的一個便捷功能;實際上使用 S您可以創建一個公共 URL但只在一段時間內有效(例如 小時內)對於我剛剛存儲在S服務器上的影片我將創建一個 小時內有效的 URL 然後我將向選定的用戶提供該 URL以便他們下載並觀看(假定他們在兩天內下載)

  處理帶有效期的文件

  要創建一個針對S對象的時間敏感型URL您可以使用 JetSt 的createSignedGetUrl 方法這是一個 SService 類型的靜態方法該方法采用一個存儲段名稱一個對象鍵(在本例中是影片名還記得嗎?)一些憑證(以 JetSt 的AWSCredentials 對象的形式)截止日期如果您了解所需的存儲段和對象鍵則可以通過清單 中的 Groovy 代碼快速獲取 URL

  步驟 創建一個時間敏感型URL

  def now = new Date()

  def url = SServicecreateSignedGetUrl(

  bucketgetName() sobjkey awsCredentials now + )

  使用 Groovy我可以通過 + 語法輕松指定一個 小時的限定日期得到的 URL 如下所示(只有一行)

  Signature=rZvkGkms=

  如果您的帶寬和存儲需求不穩定則S能提供很多幫助例如想想我演示的業務模型 — 影片在一年中特定的時間發布在傳統的存儲模型中您需要在某處機架上購買許多空間(或提供通向它的硬件和管道)很可能下載量很大但隨後會相對降低但是您不能根據需要付費使用 S該模型將根據需要付費 — 公司僅在需要時為存儲和帶寬付費更重要的是S的安全特性可以幫助您進一步指定人們何時可以下載視頻甚至可以指定誰可以下載

  使用S實現這些需求非常容易在高水平上創建一個受限的影片公共下載需要 個步驟

  登錄S

  創建存儲段

  向存儲段添加所需的視頻(或對象)

  創建一個指向該視頻的時間敏感型 URL

  就是這樣!

  使用後記便利的按需付費模式

  與傳統存儲模型相比S的隨需付費模型有很多明顯的優勢例如在自己的硬盤上存儲音樂收藏我必須預先花 美元購買一個 GB 的存儲單元我沒有GB 的數據可以存儲因此我為自己不需要的空間花費了 美分 /GB(雖然很便宜)我還需要維護設備並支付電費如果我使用 Amazon我不需要預先為不重要的資產支付 美元我只需要支付 美分 /GB無需為管理和維護存儲硬件付費

  現在想想在整個企業范圍內實現這些服務的好處以 Twitter 為例在S上為 萬個用戶帳戶存儲圖片通過按照使用付費的方式Twitter 不需要花費大量資金購買硬件基礎設施來存儲和提供圖片服務也不需要支出人力和部件成本來配置和維護圖片

  雲的好處還不止這些您還可以實現低延遲和高可用性假設存儲在Amazon雲中的資產遍布全世界那麼為各個位置提供內容的速度將會更快更重要的是由於您的資產分布在各種機器上您的數據在一些機器(或部分網絡)癱瘓時也能保持高可用性

  一言以蔽之AmazonS的好處很簡單低成本高可用性安全除非您是一個 SAN 專家喜歡維護硬件資產來存儲數據內容但是Amazon可能比您做的更好在資金緊張的時候為什麼還要將自己的資金提前預支在硬件上呢(不要忘了硬件會隨時間貶值)?


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19323.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.