如何实现Java平台访问开源云存储?
尽管云计算这一术语并不新鲜(Amazon在2006年就开始提供它的云服务),但从2008年起它才开始真正成为流行词,这期间,Google和Amazon的云服务逐渐获得了公众的关注。Google的App Engine使用户能够在Google基础设施上构建和托管Web应用程序。
连同S3,AmazonWeb Services还包括Elastic Cloud Compute (EC2)计算Web服务,该服务可以在Amazon的基础设施上托管应用程序。其他公司也开始蠢蠢欲动,准备与Amazon和Google一决高下,其 中就包括Microsoft?的Azure,甚至Sun Microsyste...全部
尽管云计算这一术语并不新鲜(Amazon在2006年就开始提供它的云服务),但从2008年起它才开始真正成为流行词,这期间,Google和Amazon的云服务逐渐获得了公众的关注。Google的App Engine使用户能够在Google基础设施上构建和托管Web应用程序。
连同S3,AmazonWeb Services还包括Elastic Cloud Compute (EC2)计算Web服务,该服务可以在Amazon的基础设施上托管应用程序。其他公司也开始蠢蠢欲动,准备与Amazon和Google一决高下,其 中就包括Microsoft?的Azure,甚至Sun Microsystems(其云计算还没有正式推向市场)也想分一杯羹。
例如IBM最近宣布,它将提供某些产品供开发人员在AmazonEC2 环境中使用。
AmazonSimple Storage Service (S3)是一个公开的服务,Web应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。
S3提供一个 RESTful API以编程方式实现与该服务的交互。通过本文,您将了解如何使用开源的JetS3t库利用Amazon的S3云服务存储和检索数据。
面向开源的S3云平台介绍
云是一个抽象的概念,表示松散连接在一起的计算机组,这些计算机共同执行某项任务或者服务,就像是使用一个单独的实体完成一样。
此概念背后的架 构也很抽象:每个云提供者都可以根据各自情况随意设计它的产品。软件即服务(Software as a Service,SaaS)是一个与云相关的概念,表示云向用户提供某种服务。云模型可以降低用户成本,因为他们无需购买软件和硬件也可以运行 — 服务提供者已经为用户提供了必要的组件。
以Amazon的S3产品为例。顾名思义,这是一个公开的服务,使Web开发人员能够存储数字资产(如图片、视频、音乐和文档等),以便在应用程序中使用。使用S3时,它就像一个位于 Internet 的机器,有一个包含数字资产的硬盘驱动。
实际上,它涉及到许多机器(位于各个地理位置),其中包含数字资产(或者数字资产的某些部分)。Amazon还处 理所有复杂的服务请求,可以存储数据并检索数据。您只需要付少量的费用(大约每月 15 美分 /GB)就可以在Amazon的服务器上存储数据,1 美元即可通过Amazon服务器传输数据。
Amazon的S3服务没有重复开发,它公开了RESTful API,使您能够使用任何支持HTTP通信的语言访问S3。JetS3t项目是一个开源Java库,可以抽象出使用S3的RESTful API的细节,将API公开为常见的Java方法和类。
编写的代码越少越 好,难道不是吗?充分利用其他人的成果也是不错的。在本文中您将看到,JetS3t使S3和Java语言的工作变得更加简单,从根本上提高了效率。
S3开源应用模式介绍
理论上,S3是一个全球存储区域网络(SAN),它表现为一个超大的硬盘,您可以在其中存储和检索数字资产。
但是,从技术上讲,Amazon的 架构有一些不同。您通过S3存储和检索的资产被称为对象。对象存储在存储段(bucket)中。您可以用硬盘进行类比:对象就像是文件,存储段就像是文件 夹(或目录)。
与硬盘一样,对象和存储段也可以通过统一资源标识符(Uniform Resource Identifier,URI)查找。
例如,在我的硬盘中,我有一个名为whitepaper。pdf的文件,它位于主目录中名为documents的文件夹中。
相应的,该pdf文件的URI为/home/aglover/documents/whitepaper。pdf 。在S3中,URI有一点不同。首先,存储段只能是顶级的 — 无法像嵌套硬盘中的文件夹(或目录)一样进行嵌套。
其次,存储段必须遵循Internet命名法则;句点旁边没有斜杠,名称不包括下划线等等。最后,由于存储段名称已经是Amazon域内的 (s3。amazonaws。com) 公共URI的一部分,存储段名称必须在所有S3中是惟一的。
(好消息是每个帐户只能包含100个存储段,因此不用担心别人占用了所有的好名字)。
存储段在S3中是URI的根。也就是说,存储段的名称将是指向S3中某个对象的URI的一部分。例如,如果我有一个名为agdocs的存储段以及一个名为whitepaper。
pdf的对象,URI将是:http://agdocs。s3。amazonaws。com/whitepaper。pdf 。
S3还提供了指定存储段和对象的所有者和权限的能力,就像对待硬件的文件和文件夹一样。
在S3中定义对象或存储段时,您可以指定一个访问控制策 略,注明谁可以访问您的S3资产以及如何访问(例如,读和写权限)。相应地,您可以通过许多方式提供对您的对象的访问,使用RESTful API只是其 中一种。
这里Amazon有一个神奇的DNS魔术,用户不用担心S3资产的 URL 。通过Domain Name System (DNS)和CNAME(canonical name的缩写)记录,您可以将自定义程度更高的URL映射到S3的 URL 。
这样一来,您就隐藏了您(或您的应用程序)依赖S3的事实!
开始使用开源S3和JetS3t
要开始使用S3,您需要一个帐户。S3不是免费的,因此在创建帐户时您必须向Amazon提供一种支付手段(比如信用卡号码)。
不用担心:不收 初装费;您只需要为使用付费。对于本文的示例,只需要支付不到 1 美元的费用。
在创建帐户的过程中,您还需要创建凭据:访问密钥和秘密密钥(就像用户名和密码)。(您还可以获取 x。
509 证书;但是,只有在使用Amazon的SOAPAPI时才需要使用该证书)。和任何访问信息一样,都必须保管好您的秘密密钥。因为任何人使用您的凭据访问S3时,您都将为此付费。因此,每当创 建存储段或对象时,默认的行为是让所有内容都私有;您必须显式获取对外部世界的访问。
有了访问密钥和秘密密钥,您可以下载JetS3t并使用它通过RESTful API与S3交互。
使用编程手段通过JetS3t登录S3可以分为两步。首先,必须创建一个AWSCredentials对象,然后将它传递到S3Service对象。
AWSCredentials 对象非常简单。它将访问密钥和秘密密钥视为String。S3Service对象实际上是一个接口类型。因为S3同时提供RESTful API和一个SOAP API,JetS3t库可以提供两种实现类型:RestS3Service和SoapS3Service。
就本文而言(包括大部分S3事务),RESTful API的简洁性让它成为一个很好的选择。
创建一个连接的RestS3Service 实例很简单,如清单 1 所示:
步骤 1。 创建一个JetS3t的RestS3Service实例
以下是引用片段:
def awsAccessKey = “blahblah”
def awsSecretKey = “blah-blah”
def awsCredentials = new AWSCredentials(awsAccessKey, awsSecretKey)
def s3Service = new RestS3Service(awsCredentials)
现在可以执行一些有趣的操作了:例如,创建存储段、添加一个影片,然后获取一个有时间限制的URL 。
实际上,这听起来像一个业务流程,不是吗?这是一个与发布有限资产(比如影片)有关的业务流程。
创建存储段
对于虚构的电影业务,我将创建一个称为bc50i的存储段。借助JetS3t,该流程很简单。
通过S3Service类型,您有几个选项。我更喜欢使用getOrCreateBucket调用,如清单 2 所示。顾名思义,调用该方法可能返回一个存储段实例(表示为S3Bucket类型的实例)或在S3中创建代码段。
S3平台详细使用步骤简介
步骤 2。 在S3服务器上创建存储段
以下是引用片段:
def bucket = s3Service。getOrCreateBucket(”bc50i”)
不要被我这个简单的代码示例所蒙蔽。
JetS3t库的扩展性非常强。例如,您可以快速确定拥有多少存储段 —— 只需通过listAllBuckets 调用请求一个S3 Service实例即可。该方法返回一个S3Bucket实例数组。
对于任何存储段实例,您可以询问它的名称和创建日期。更重要的是,您可以通过JetS3t的AccessControlList类型控制与之相关的权限。收起