级别: 初级 Doug Tidwell, 云计算推介者,Software Group Strategy, IBM
2009 年 11 月 09 日 最近发布的 Simple Cloud API 为各种云服务提供了一个共用的 API。在 Zend、GoGrid、IBM®、Microsoft®、Nirvanix 和 Rackspace 的合作努力下,API 使您能够编写出可移植的并可与多个云供应商进行互操作的的代码。最好的一点是,API 使您能够根据需要使用特定于一个具体供应商的服务。
云计算的灵活性和经济效益产生了巨大的利益。开发人员使用这个技术时,一个明显关心的问题是供应商壁垒。编写一个充分利用云计算的应用程序是一件很棒的事情。但是如果该应用程序把您局限于一个单一的供应商的话该怎么办呢?Simple Cloud API 是多个供应商共同努力创建的单一 API,能够与来自多个供应商的云服务一起使用(请参见 参考资料)。本文是 API 及其目标的高级概览。
 |
云计算空间
您是否希望随时获取最新的云计算消息?是否想得到云计算相关的技术知识?developerWorks 云计算空间就是这样一个云计算信息资源的门户,在这里您可以了解来自 IBM 和业界其他媒体的最新信息,并且得到如何在云环境中使用 IBM 软件的入门知识。
IBM 在 Amazon EC2 云计算环境中提供了 DB2、Informix、Lotus、WebSphere 等方面的 AMI 镜像资源。您只需按使用量支付少量费用,就可以使用到云上的数据、门户、Web 内容管理、情景应用等服务。欢迎您随时访问 云计算空间,获取更多信息。
|
|
前沿技术
云计算可能会极大地改变 IT 技术的面貌,就像 Web 兴起以来的许多技术一样。如果您是一名开发人员或架构师,即使现在没有使用云计算,至少也该正在对它进行评估。这的确令人兴奋,但还是应该保持警惕。就如其他任何新技术一样,您应该对云技术的优缺点有所了解并只在适当的时候使用。
使用任何新技术的最大风险之一就是创建重要的应用程序时可能会受到一个特定供应商的控制。云计算有着显著的经济效益,但是如果使用云要受到供应商的价格策略的摆布,那就是一个主要问题。即使您对您的云供应商非常满意,您的合作伙伴、客户和供货商仍可能使用不同的云供应商。您的应用程序要能够与尽可能多的供应商和服务一起使用,这一点很重要。
Simple Cloud API 的设计目的是为多个云服务和多个云供应商提供一个单一、简单、可互操作的 API。
API 的级别
编写使用多个云服务的代码有几种方法。为把 Simple Cloud API 放在上下文中,我们将从 4 个级别检查这个 API :
- 连接
- 特定于语言的工具包
- 特定于服务的工具包
- 中立于服务的工具包
接下来我们将详细考虑这些级别。
连接
在这个级别,您考虑的是通过从应用程序到云的连接传送的实际字节。对于 SOAP 服务来说,应用程序必须建立含有适当内容和标题的 <SOAP:Envelope>。对于 REST 服务来说,应用程序必须创建正确的 HTTP 标题和建立一个包含了适当参数的 URL。例如,要 Nirvanix Internet Media File System(IMFS)列出 /dougtidwell 目录中的所有项目的 REST 请求如清单 1 所示。
清单 1. 示例 REST 请求的连接格式
GET /ws/IMFS/ListFolder.ashx?sessionToken=8da051b0-a60f-4c22-a8e0-d9380edafa6f&...HTTP/1.1
Host: services.nirvanix.com
Date: Wed, 20 Oct 2009 12:00:00 GMT |
这是一个要求列出 /dougtidwell 目录中的所有文件夹的请求。这个请求包括验证信息(上面的 sessionToken 参数),以及如路径名、页数和页面大小之类的参数。清单 1 中完整的 URL 包括 FolderPath=/dougtidwell&PageNumber=1&PageSize=5。
特定于语言的工具包
一个特定于语言的工具包提供了一些使用方便的类,用来创建 SOAP 和 REST 数据结构。作为一名开发人员,您仍然专注于在应用程序和云之间传递的数据结构,无需直接创建数据结构。例如,Zend_Soap 库包含了一些类,可用来简化 SOAP 服务的调用。调用一个 SOAP 服务就如清单 2 所示。
清单 2. 使用 Zend_Soap_Client 调用 SOAP 服务
$params = array(..., 'FolderPath' => '/dougtidwell', 'PageNumber' => 1, ...);
$soapClient->call('listFolder', $params, $namespace); |
要使用 REST 服务,curl 库是一个强大有用的方法。使用 REST 提取数据的请求如清单 3 所示。
清单 3. 使用 curl 调用 REST 服务
$curl_proc = curl_init('http://services.nirvanix.com/ws/IMFS/ListFolder.ashx');
$curl_post_data = array('sessionToken' => '8da051b0-a60f-4c22-a8e0...',
'folderPath' => '/dougtidwell',
'pageNumber' => 1,
'pageSize' => 5);
curl_setopt($curl_proc, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_proc, CURLOPT_POST, true);
curl_setopt($curl_proc, CURLOPT_POSTFIELDS, $curl_post_data);
$response = curl_exec($curl_proc); |
在这两个样例中,应用程序并不考虑解析 XML 或检查 HTTP 返回代码或类似问题。工具包处理大部分的细节问题。另一方面,应用程序不是专注于业务对象。
特定于服务的工具包
在这个级别,您专注于业务对象。使用封装云服务的高级对象意味着您不用再考虑连接中的数据格式。使用这个级别的时候,您无法知道基础服务是 SOAP 或 REST,仅仅是调用服务。Nirvanix 和 Amazon S3 的 Zend Framework 类是特定于服务的工具包的两个示例。下面是列出 Nirvanix 目录中所有项目的方法。
清单 4. 列出 Nirvanix 目录中的所有项目
$auth = array('username' => 'your-username',
'password' => 'your-password',
'appKey' => 'your-appkey');
$nirvanix = new Zend_Service_Nirvanix($auth);
$imfs = $nirvanix->getService('IMFS');
$args = array('folderPath' => '/dougtidwell',
'pageNumber' => 1,
'pageSize' => 5);
$stuff = $imfs->ListFolder($args); |
Nirvanix 提供了几个服务。这里的示例使用 IMFS。调用 getService() 方法返回一个对象,可用来与一个特定的服务交互。传递参数到 ListFolder 的方法返回文件夹中的一组项目。
与 Nirvanix 的目录结构明显不同的是,Amazon 的 S3 使用了存储桶。由于存储桶不能包含其他的存储桶,因此并不支持 Nirvanix 文件系统的层次结构。较简单的 S3 数据模型体现在列出 S3 存储桶中所有项目的代码中。
清单 5. 列出 S3 存储桶中的所有项目
$s3 = new Zend_Service_Amazon_S3($accessKey, $secretKey);
$stuff = $s3->getObjectsByBucket($bucketName); |
这个示例代码提取特定存储桶中所有项目的元信息。$stuff 组有每个项目的元数据,如项目名称、大小、内容类型和时间戳。
中立于服务的工具包
特定于服务的工具包提高了生产力。然而,一个特定于服务的 API 把您局限在一个特定的服务或供应商。Simple Cloud API 的目标是提供一个高级的类集,您可以用它来编写能够与多个服务和供应商一起使用的代码。查看 Nirvanix 和 S3 类后会发现,列出一个目录或存储桶的内容各自需要 ListFolder() 和 getObjectsByBucket() 方法。在 Simple Cloud API 中,ListItems() 方法是为两个服务工作的。
Simple Cloud API
Simple Cloud API 是为了可互操作的代码而设计的。许多云服务都支持在 Simple Cloud API 中定义操作。最终目标是编写的与一个云服务一起使用的代码要能与所有类似的云服务一起使用。Simple Cloud API 的 PHP 实现使用了 Factory 和 Adapter 设计模式。要使用一个特定的云服务,您可以使用一组配置参数调用适当的工厂方法(如用于文件存储的 Zend_Cloud_Storage_Factory)。工厂方法返回的类用于一个特定于服务的适配器。适配器把 Simple Cloud API 调用映射到每个云供应商所需的特定于服务的调用中。
为三种类型的云服务定义 Simple Cloud API:
- 文件存储(File Storage)
- 文档存储(Document Storage)
- 简单队列(Simple Queues)
文件存储 指的是传统云存储系统,如 S3 和 Nirvanix。使用文件存储服务,您要对了解已经存储在云中的数据并对此负责。您能够获得一个目录/存储桶的清单和每个目录/存储桶中的文件清单,但是要不要对每个文件表示的意思进行跟踪,这取决于您。在这个 API 中,典型的方法有 fetchItem()、listItems()、deleteItem(),以及 fetchMetadata()。
文档存储 包括更为结构化的系统,如 Amazon 的 SimpleDB。与简单的文件存储不一样,文档存储提供队列功能帮您查找信息。在一些用例中,基本的服务是有着模式支持的相关数据库。在其他的用例中,它会是一个类型简单许多的服务。在这个 API 中,典型的方法有 listCollections()、listDocuments()、insertDocument(),以及 query()。
简单队列 是队列系统,如 Amazon 的 Simple Queue Service。用于简单队列 API 的典型方法有 sendMessage()、listQueues() 和 peekMessage()。
一个简单示例
注意:Simple Cloud API 还在不断发展完善,细节上可能会有变化。这里的示例应用程序在本文发表时使用 Amazon S3 和 Nirvanix IMFS 的适配器。
为了说明 Simple Cloud API 提供的可互操作性,我们将建立一个简单的 PHP 页面来使用 Amazon S3 和 Nirvanix IMFS。这段代码首先使用 Zend_Config_Ini 类从一个 .ini 文件创建一组证书。(Simple Cloud API 中的工厂类要求一组证书作为参数。)本示例中使用的两个配置文件是 s3.ini 和 nirvanix.ini。如果一个配置文件的名称没有作为一个参数传递,代码将默认使用 s3.ini。
清单 6. 创建一组证书
require_once 'Zend/Cloud/Storage/Factory.php';
require_once 'Zend/Http/Client/Adapter/Socket.php';
require_once 'Zend/Config/Ini.php';
if (array_key_exists('configfile', $_POST))
$configFile = $_POST['configfile'];
else
$configFile = '../conf/s3.ini';
$credentials = new Zend_Config_Ini($configFile); |
Amazon S3 适配器的示例配置文件如清单 7 所示。
清单 7. Amazon S3 的配置文件
http_adapter = "Zend_Http_Client_Adapter_Socket"
storage_adapter = "Zend_Cloud_Storage_Adapter_S3"
bucket_name = "developerworks"
aws_accesskey = "12345678901234567890"
aws_secretkey = "ABcdEFghIJklMNopQRstUVwxYZ01234567890abc" |
storage_adapter 值是 PHP 类的名称,用来实现 StorageService 接口。对于 S3 来说,类是 Zend_Cloud_Storage_Adapter_S3。除了用户名和密码以外,Nirvanix 配置文件还需要一个应用程序名称(目前由参数 auth_accesskey 表示)和一个目录名称。
清单 8. Nirvanix IMFS 的配置文件
storage_adapter = "Zend_Cloud_Storage_Adapter_Nirvanix"
auth_accesskey = "12345678-90ab-cdef-1234-567890abcdef"
auth_username = "nobody"
auth_password = "xxxxxxxx"
remote_directory = "/dougtidwell" |
配置文件含有 Zend_Cloud_Storage_Factory 类创建适当的适配器所需的详细信息。下面是用来从云存储服务中获取项目清单的代码。
清单 9. 使用工厂类
<ul style='font-size: 125%; font-family: monospace; font-weight: bold;'>
<?php
$stuff = Zend_Cloud_Storage_Factory::getAdapter($credentials)->listItems();
foreach ($stuff as $nextItem) {
echo "<li>".$nextItem."</li>";
}
?>
</ul> |
使用默认配置文件意味着使用了来自 s3.ini 的信息,这将显示在配置文件中命名的 S3 存储桶的内容。
图 1. 含有默认配置文件的存储桶或目录清单
屏幕底部的有两个按钮,可用来重新加载含有特定配置文件的页面。单击 Create adapter using nirvanix.ini 会运行完全一样的代码,但使用了不一样的配置参数。结果显示的是在配置文件中命名的 Nirvanix 目录内容。
图 2. 使用不同配置文件的存储桶和目录清单
这两组结果都是由完全一样的代码生成。配置文件变了,但应用程序自身没有发生变化。
结束语
Simple Cloud API 是几个主要的云供应商合作的结晶,用来创建一个能够与许多云服务和供应商一起使用的单一、简单并可互操作的 API。支持更多云服务和云供应商的工作正在进行中,而且除了 PHP 以外,多语言 API 的实现也正在进行中。没有开放性和灵活性,云计算就不可能充分发挥其潜力。对于保持云的开放性和您的应用程序到灵活性来说,Simple Cloud API 是一个很重要的工具。
参考资料 学习
获得产品和技术
讨论
关于作者  | 
|  | Doug Tidwell 是 IBM 的 Emerging Technology 小组的一名高级软件工程师。作为 1997 年首届 XML 会议的发言者之一,他从事标记语言、Web 服务和 SOA 技术多年。作为技术宣传人员,他的工作是解释云计算的标准和技术,并帮助客户把它们整合到他们的总体业务架构和策略中。他在 developerWorks 上发表过许多文章,还是 O’Reilly’s book on XSLT(ISBN 0-596-52721-7)的作者。在任何场合,这本书都会被视作是一个考虑周到的礼物。他与他的妻子、女儿和狗住在北卡罗莱纳的 Chapel Hill。 |
对本文的评价
|