<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

 

    现在,谈云计算的可多了,不过,一般比较关注的是Google和Amazon的云服务。从大范围来看,也只有这两家获得了公众的更多关注。比如,我个人很感兴趣的,就是Google的App Engine使用户能够在Google基础设施上构建和托管 Web 应用程序。至于Amazon,它的AmazonWeb Services还包括Elastic Cloud Compute (EC2)计算Web服务,该服务可以在Amazon的基础设施上托管应用程序。至于Microsoft®的 AzureSun Microsystems,我们大家等着看热闹吧。以Amazon的S3产品为例。AmazonSimple Storage Service (S3)是一个公开的服务,Web应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。S3提供一个 RESTful API以编程方式实现与该服务的交互。顾名思义,这是一个公开的服务,使 Web 开发人员能够存储数字资产(如图片、视频、音乐和文档等),以便在应用程序中使用。使用S3时,它就像一个位于 Internet 的机器,有一个包含数字资产的硬盘驱动。

 

1.一个Java的演示例子

    下面,做一个测试的例子,体验一下“云”的感觉,看到底会不会发晕!

    理论上,S3是一个全球存储区域网络(SAN),它看上去像一个超大的硬盘。存储段在S3中是URI的根。也就是说,存储段的名称将是指向S3中某个对象的URI的一部分。例如,如果我有一个名为 agdocs 的存储段以及一个名为 whitepaper.pdf 的对象,URI将是:http://agdocs.s3.amazonaws.com/whitepaper.pdf 。使用编程手段通过 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 类型控制与之相关的权限。例如,我可以获取 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,可以轻松指定一个 48 小时的限定日期。

2.一个PHP下的测试

执行下面介绍的练习,同样需要建立一个帐户。建立好帐户后,需要对凭证进行管理。Amazon提供了一个访问密匙和秘密密匙。在使用 S3 时,PHP 页面需要这些值。管理这些信息的一种方法就是将这些值放到代码里。

步骤1: 在 PHP 代码中存储凭证

				
// Credentials for Amazon - Don't do this!

$awsKey = "0123456789ABCDEFGHIJ";
$awsSecret = "0123456789abcdefghiABCDEFGHI1234567890AB";

这种方法是有效的,但是必须将代码放入到每一个有需要的 PHP 文件中。更好的做法是将这些值放入到一个 PHP .ini 文件,该文件类似清单 2 所示。

步骤2. 在 PHP .ini 文件中存储凭证

				
; Configuration file to hold secret keys, account numbers and other useful
; strings for Amazon and other cloud accounts.

[amazon]
accessKey=0123456789ABCDEFGHIJ
secretKey=0123456789abcdefghiABCDEFGHI1234567890AB
ownerId=123456789012

[nirvanix]
username=jane_doe
password=XXXXXXXX
appKey=01234567-89ab-cdef-0123-456789abcdef
            

一个简单的 PHP 类可以轻松地处理这些值。

步骤3. 用于检索凭证的简单 PHP 类

				
<?php
// Simple class to retrieve credentials from an .ini file

class Credentials
{
  var $key_array;

  function Credentials() {
    $this->key_array = parse_ini_file("../conf/cloud.ini", true);
  }

  function getCredential($group, $key) {
    return $this->key_array[$group][$key];
  }
}
?>

该类使用 PHP parse_ini_file() 函数读取 .ini 文件格式的值。此函数的第一个参数为文件的名称,第二个参数告诉 PHP 将文件解析为不同的部分。这意味着数组 $key_array 是一个 2-D 数组。数组键为第一维的 amazonnirvanix,以及第二维的 accessKeysecretKeyappKey 等。Credentials 类提供了 getCredential() 方法来从 .ini 文件检索值。与将凭证硬编码到每一个 PHP 文件相反,我们将对示例使用类似如下所示的代码:

步骤4. 创建和使用一个 Credentials 对象

				
<?php
require_once 'Credentials.php';

$creds = new Credentials;
$s3 = new Zend_Service_Amazon_S3($creds->getCredential('amazon', 'accessKey'),
                                 $creds->getCredential('amazon', 'secretKey'));

使用这种方法需要花多一点时间来设置代码,但是一旦完成了此项工作,就可以在一个位置一次性定义凭证。如果需要修改它们,就不必在每个 PHP 文件中进行修改。

先到这里吧,感觉需要付费,就没再玩下去了。

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐