Java平台访问开源云存储?

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平台详细使用步骤简介

nbsp;  步骤 2. 在S3服务器上创建存储段

 

    def bucket = s3Service.getOrCreateBucket("bc50i")

    不要被我这个简单的代码示例所蒙蔽。JetS3t 库的扩展性非常强。例如,您可以快速确定拥有多少存储段 —— 只需通过 listAllBuckets 调用请求一个S3 Service 实例即可。该方法返回一个 S3Bucket 实例数组。对于任何存储段实例,您可以询问它的名称和创建日期。更重要的是,您可以通过JetS3t 的 AccessControlList 类型控制与之相关的权限。例如,我可以获取 bc50i 存储段实例,并允许任何人可以公开读取和编写,如清单 3 所示:

    步骤 3. 修改存储段的访问控制列表

    def bucket.acl = AccessControlList.REST_CANNED_PUBLIC_READ_WRITE

    当然,通过 API,您也可以随意删除存储段。Amazon甚至允许您指定创建存储段的地理位置。Amazon简化了存储实际数据的复杂性,但是您可以告诉Amazon要将存储段(及其内部所有的对象)放在美国或欧洲(当前可用选项)。

    向存储段添加对象

    使用JetS3t 的API创建S3对象就像操作存储段一样简单。JetS3t 库也很智能,可以负责处理与S3存储段内文件相关的内容类型。例如,我想向S3上传一段影片nerfwars2.mp4,以便用户能够在有限的时间内观看。创建一个S3对象与创建常见的 java.io.File 类型一样简单,并能将S3Object 类型与存储段关联,如清单 4 所示:

    步骤 4. 创建一个S3对象

    def s3obj = new S3Object(bucket, new File("/path/to/nerfwars2.mp4"))

    使用文件和存储段初始化 S3Object 之后,要做的所有事情就是通过 putObject 方法上传,如清单 5 所示:

    步骤 5. 上传影片

    s3Service.putObject(bucket, s3obj)

    使用清单 5 可以完成上传。现在影片位于Amazon服务器了,影片的键就是它的名称。当然,您可以根据需要重写该名称以调用其他对象。实际上,JetS3t API(以及 AmazonS3RESTful API)公开了许多信息,供您创建对象时使用。我们知道,您还可以提供访问控制列表。S3中的任何对象都可以保存API允许您创建的其他元数据。之后可以通过该元数据的S3API(以及派生的 JetS3t)查询任何对象。

   创建对象的URL

    到现在为止,我的S3实例有一个包含影片的存储段。实际上,我的影片可以通过以下URI获取:http://bc50i.s3.amazonaws.com/nerfwars2.mp4 。但是,只有我才能获取。(在本例中,我只能通过编程方式访问它,因为与所有内容关联的默认访问控制被设置为拒绝任何未授权访问)。我的目的是为选择的用户提供一种方式查看新影片(在有限的时间内),直到我开始收取访问费用(S3也会提供帮助)。

    创建一个公共 URL 是S3提供的一个便捷功能;实际上,使用 S3,您可以创建一个公共 URL,但只在一段时间内有效(例如,24 小时内)。对于我刚刚存储在S3服务器上的影片,我将创建一个 48 小时内有效的 URL 。然后我将向选定的用户提供该 URL,以便他们下载并观看(假定他们在两天内下载)。

    处理带有效期的文件

    要创建一个针对S3对象的时间敏感型URL,您可以使用 JetS3t 的createSignedGetUrl 方法,这是一个 S3Service 类型的静态方法。该方法采用一个存储段名称、一个对象键(在本例中是影片名,还记得吗?)、一些凭证(以 JetS3t 的AWSCredentials 对象的形式)、截止日期。如果您了解所需的存储段和对象键,则可以通过清单 6 中的 Groovy 代码快速获取 URL:

    步骤 6. 创建一个时间敏感型URL

    def now = new Date()

    def url = S3Service.createSignedGetUrl(

    bucket.getName(), s3obj.key, awsCredentials, now + 2)

    使用 Groovy,我可以通过 + 2 语法轻松指定一个 48 小时的限定日期。得到的 URL 如下所示(只有一行):

    https://bc50i.s3.amazonaws.com/nerfwars2.mp4?AWSAccessKeyId=1asd06A5MR2&Expires=1234738280&Signature=rZvk8Gkms=

    如果您的带宽和存储需求不稳定,则S3能提供很多帮助。例如,想想我演示的业务模型 — 影片在一年中特定的时间发布。在传统的存储模型中,您需要在某处机架上购买许多空间(或提供通向它的硬件和管道),很可能下载量很大,但随后会相对降低。但是,您不能根据需要付费。使用 S3,该模型将根据需要付费 — 公司仅在需要时为存储和带宽付费。更重要的是,S3的安全特性可以帮助您进一步指定人们何时可以下载视频,甚至可以指定谁可以下载。

    使用S3实现这些需求非常容易。在高水平上,创建一个受限的影片公共下载需要 4 个步骤:

    1.登录S3。

    2.创建存储段。

    3.向存储段添加所需的视频(或对象)。

    4.创建一个指向该视频的时间敏感型 URL 。

    就是这样!

    使用后记:便利的按需付费模式

    与传统存储模型相比,S3的随需付费模型有很多明显的优势。例如,在自己的硬盘上存储音乐收藏,我必须预先花 130 美元购买一个 500GB 的存储单元。我没有500GB 的数据可以存储,因此我为自己不需要的空间花费了 25 美分 /GB(虽然很便宜)。我还需要维护设备并支付电费。如果我使用 Amazon,我不需要预先为不重要的资产支付 130 美元。我只需要支付 10 美分 /GB,无需为管理和维护存储硬件付费。

    现在想想在整个企业范围内实现这些服务的好处。以 Twitter 为例,在S3上为100 万个用户帐户存储图片。通过按照使用付费的方式,Twitter 不需要花费大量资金购买硬件基础设施来存储和提供图片服务,也不需要支出人力和部件成本来配置和维护图片。

    云的好处还不止这些。您还可以实现低延迟和高可用性。假设存储在Amazon云中的资产遍布全世界,那么为各个位置提供内容的速度将会更快。更重要的是,由于您的资产分布在各种机器上,您的数据在一些机器(或部分网络)瘫痪时也能保持高可用性。

    一言以蔽之,AmazonS3的好处很简单:低成本、高可用性、安全。除非您是一个 SAN 专家,喜欢维护硬件资产来存储数据内容,但是Amazon可能比您做的更好。在资金紧张的时候,为什么还要将自己的资金提前预支在硬件上呢(不要忘了,硬件会随时间贬值)?

时间: 2024-10-14 09:08:32

Java平台访问开源云存储?的相关文章

如何用Java平台访问开源云存储?

尽管云计算这一术语并不新鲜(Amazon在2006年就开始提供它的云服务),但从2008年起它才开始真正成为流行词,这期间,Google和 Amazon的云服务逐渐获得了公众的关注. Google的App Engine使用户能够在Google基础设施上构建和托管 Web 应用程序. 连同S3,AmazonWeb Services还包括Elastic Cloud Compute (EC2)计算Web服务,该服务可以在Amazon的基础设施上托管应用程序.其他公司也开始蠢蠢欲动,准备与Amazon和

开源云存储怎么被访问

云计算这一术语就目前而言已经并不新鲜,(Amazon在2006年就开始提供它的云服务),它真正成为流行词是2008年开始的,在这段期间,Google和 Amazon的云服务慢慢地得到了公众的关注. Google的App Engine能够让用户在Google基础设施上,构建和托管 出Web 应用程序. 连同S3,AmazonWeb Services还包括Elastic Cloud Compute (EC2)计算Web服务,该服务可以在Amazon的基础设施上托管应用程序.其他公司也开始蠢蠢欲动,准

开源云存储服务ownCloud预告5.0版本

为了提供免费的替代给用户,3年前Frank Karlitschek 启动了对开源版的文件存储.同步及共享软件包ownCloud的开发.而到现在为止,这个软件包已经正式推出了4个版本,一共支持42种语言.而且在具备 Dropbox 或 Box.net 所具有的基本功能之外,ownCloud 还支持通讯录.日历等功能.日前,ownCloud 又发布了 5.0 的 beta 版,预计将会在几周后正式推出. 用户可以利用ownCloud来搭建一个可以完全由自己控制的云服务器.软件包可以安装在用户指定的任

开源云存储ownCloud将推出5.0 beta版

为了给用户提供免费的替代,3年前,Frank Karlitschek开发了开源版的文件存储.同步及共享软件包ownCloud.目前,该软件包已经正式推出了4个版本,支持42种语言.除了具备Dropbox或Box.net的基本功能以外,ownCloud还支持通讯录.日历等功能.现在,ownCloud又发布了5.0的beta版,预计将会在几周后正式推出. 用户可以利用ownCloud来搭建一个可以完全由自己控制的云服务器.软件包可以安装在用户指定的任何地方,其访问控制策略完全由用户自定义.安装了ow

Openstack Swift开源云存储技术解析

Swift 最初是由 Rackspace 公司开发的高可用分布式对象存储服务,并于 2010 年贡献给 OpenStack http://www.aliyun.com/zixun/aggregation/13856.html">开源社区作为其最初的核心子项目之一,为其 Nova 子项目提供虚机镜像存储服务.Swift 构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,

如何使用云存储中的磁带

云存储是云计算里的一种技术,人们对其也并不是十分陌生,许多人都认为云存储是磁盘.高性能磁盘或Tier-1磁盘和重复数据删除的代名词.有这种想法的不在少数,其实这完全是人们的误解,云存储根本不是那么回事,但正是由于这种误解,也就可以理解为何最近谷歌将Gmial账户数据利用磁带存储受到的争议和惊讶了.当然,就算人们有那种错误的想法,磁带还是将在云存储.云备份和云归档方面继续发挥着至关重要的作用.至于为什么会出现这种情况,我们必须要先了解云服务供应商克服磁带在在线高可用环境下的关键障碍的重要性.云计算

基于Hadoop平台的云存储应用实践

云计算(Cloud Computing)是一种基于因特网的超级计算模式,在远程的数据中心里,成千上万台电脑和服务器连接成一片电脑云.用户通过电脑.笔记本.手机等方式接人数据中心,按自己的需求进行运算.目前,对于云计算仍没有普遍一致的定义.结合上述定义,可以总结出云计算的一些本质特征,即分布式计算和存储特性.高扩展性.用户友好性.良好的管理性. 1云存储架构图 橘色的作为存储节点(Storage Node)负责存放文件,蓝色作为控制节点((Control Node)则是负责文件索引,并负责监控存储

百度推可视化云存储编辑工具 强化LBS“云平台”概念

百度 LBS 开放平台刚刚启用新域名,开始强化"平台"概念,集中开放定位.地图以及搜索三个领域的服务. 相较于现在的开放平台,以前的百度 LBS 云对于开发者来说偏向简单的 API 工具.开发者的业务数据没法很好地和地理数据整合到一起,而是独立分割,缺乏确切的经纬度或详细地址信息时,需要结合地理编码等接口进行处理.并且一旦数据海量涌入,会导致地图渲染过慢,限制计算能力. 因此更新域名后,百度将地图引擎全面开放给开发者,包括地图绘制引擎以及搜索引擎,首次支持开发者自身业务数据的云端检索.

当今不断发展的云存储技术和产品有哪些

在过去的几年中,云计算的发展可谓是空前的,云存储的选择方式也发生了很大的变化.在几年前,云存储只是被开发者放在一些项目的数据仓库中,跨国企业中传统的IT团队现今致力于其生产系统的需要,以云为导向.这样的转变让我们看到了云存储技术的发展方向和时间阶段. 在Jeff Byrne最新的存储杂志专栏中,让我们了解到了推动云技术背后的三种主要的技术种类以及云存储的两大核心内容:数据内容和I/O.尽管Jeff Byrne并不能保证那些技术会是最为成功的,但有一点还是十分自信的,那就是对于不断增长的云市场将会