65.9K
CodeProject 正在变化。 阅读更多。
Home

Google Cloud Platform:在 Google Cloud Storage 中存储数据

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014 年 2 月 12 日

CPOL

10分钟阅读

viewsIcon

21138

Google Cloud Platform - 第 7 部分:Google Cloud Storage

第 7 部分:云存储

欢迎回来!如果您正在阅读的这篇文章是关于Google Cloud Platform 的第一篇文章,您可能想查看本系列的介绍,该介绍可在此处找到,但如果您是那种“在比赛中场休息时看超级碗,因为前两节没什么精彩内容”的人,请随意直接开始。稍后您可以在体育频道观看精彩的首次安全球、拦截达阵和其余精彩回放。

正如我们上次提到的,Google 提供了几种不同的数据存储方式:Google Cloud SQL 适用于那些希望以传统关系数据库和关系模型方式存储数据的应用程序。还有Google Cloud Datastore,这是一种非关系型的“NoSQL”数据存储方法,我们上次已经介绍过。最后,还有Google Cloud Storage 客户端,它更适合存储“大型二进制文件”,如图像和视频,我们将在稍后详细介绍。

不过,在此之前,非常重要的一点值得重申:尽管各种技术专家和推广者可能想争辩,但这些方法中没有一种比其他方法“更优越”。那些倾向于死板遵循行业专家所谓的“最佳实践”的人会不喜欢我这么说,但事实是,每种方法都解决了不同类型的问题,有时最佳方法是同时使用它们,这种技术有时被称为“多语言持久化”或“多存储持久化”。或者,正如一位著名作家曾经说过的,“从每个数据库,根据其能力,到每个项目,根据其需求。”

概述

首先,我们要明确一点:Google Cloud Storage 并不是程序员用来存储大多数其他存储选项(包括 Google Cloud SQL 和 Google Cloud Datastore)所存储的传统“对象”或“客户数据”的东西。Google Cloud Storage 更侧重于存储更大的、原子化的(这意味着我们作为程序员不会查看它们内部,而是将它们视为完全不透明的存储块)二进制数据,例如视频、声音、大型图像等等。它不是一个可以读取文件部分或将这些文件分解成组成部分的编程 API。它更像是一个云规模存储区域网络,提供上传、下载、枚举和删除的 API。这一点通过一个事实得到了进一步的加强:在 Google Cloud Storage 上,给定存储的整个生命周期内,它是完全不可变的——它不能被追加、裁剪或以任何其他方式修改。

然而,这并不意味着它不如其他两种存储形式有用。例如,如果正在构建的应用程序需要存储大于几 KB 的任何内容,特别是如果该功能需要对应用程序的最终用户可用,例如允许用户将任意文件作为错误报告的一部分、博客评论的一部分、论坛帖子的一部分,或十几种其他可能性中的任何一种——那么这显然将是一个极其优越的解决方案,特别是因为它是一个“开箱即用”的解决方案,而不是必须编写自定义代码。(虽然其他两种数据存储选项肯定能够存储大型数据文件,但Google Cloud SQL 在尝试存储大型 BLOB 时具有所有关系数据库的典型缺点,而Google Cloud Datastore 由于类似的原因也会遇到类似的问题。)

是的,如果这个功能听起来与亚马逊的 S3 系统相似,那是因为它确实如此;毫不奇怪,Google 提供了一个有用的指南,用于将数据从 S3 迁移到 Google Cloud Storage,网址是https://developers.google.com/storage/docs/migrating。我将留给读者想象迁移的原因,但也有关于将这两个系统用作冗余和备份的合理讨论——这两个主要云平台同时发生故障的几率大致相当于中彩票。连续三个州。同一天。并且被闪电击中。您明白我的意思。

其次,与本系列中其他 Google Cloud Platform 的讨论截然不同的是,Google Cloud Storage API 完全独立于语言,它是完全“RESTful”的 API,使用 HTTP 和 XML 或 JSON(截至本文撰写时仍处于实验阶段)作为开发者与 Google Cloud Storage 交互的方式。这既有优点也有缺点。Google 更容易维护、记录和改进开发者 API,因为他们只需要担心一个入口点。此外,HTTP API 意味着 Web 工具原生就知道如何“说”Google Cloud Storage 的语言;我们稍后将详细介绍这一点。但是,这有时对个人开发者来说更难,因为现在没有语言友好的 API 可以依赖,而且(至少在 Java 的情况下)因此我们失去了任何编译时类型安全,无法阻止我们犯低级错误。

(对于 HTTP 技能不太熟练的人来说,Google 确实有一些实验性的客户端库来包装 HTTP API 调用,但坦率地说,获得的益处似乎微乎其微,而且开发者最终还是会想看到“原始”的 HTTP 调用,即使只是为了调试目的。因此,本文将假设 HTTP API 是首选选项。)

API、URL、HTTP,天哪!

从根本上说,Google Cloud Storage 识别几个核心概念。首先,给定 Google Cloud Storage 系统中的所有数据都范围限定在“项目”内,这与我们在本系列中一直研究的项目相对应。对于开发人员来说,项目本质上是 Google Cloud Storage 的管理单元,因此为了开始使用 Google Cloud Storage,开发人员需要进入控制台(我们一直用于所有其他操作的那个)并“启用”Google Cloud Storage。这也意味着该项目将承担所消耗存储的费用。

其次,存储在 Google Cloud Storage 中的所有数据都将存储在“存储桶”中,顾名思义,存储桶是命名的容器,其中包含命名的“对象”,对象包含实际数据。换句话说,“存储桶”是目录,“对象”是文件。非常直接,不是吗?存储桶可以放置在地理位置上,以便使数据尽可能靠近目标用户(以减少下载对象时的延迟),并且给定项目可以包含无限数量的存储桶,因此对于跨越全球的项目,可以随意创建名称唯一的存储桶,这些存储桶本质上是彼此重复的,只是地理位置不同。(本质上,这将在一定程度上复制 CDN 的效果。)存储桶不能嵌套,但存储桶的名称没有真正限制,因此创建模仿目录路径的命名方案(例如,“images-accident-12232013-seattle”)是很常见的,最多可达 63 个字符。

对象,就像文件一样,既有数据也有与之关联的元数据,概念上类似于文件系统上与文件关联的元数据,形式为键值对,类似于 HTTP 处理标头参数的方式。

API 本身相当直接;https://developers.google.com/storage/docs/reference-methods 提供了所有 API 的完整列表,但快速摘要如下:

  • GET /:返回已验证用户可以看到的所有存储桶列表
  • PUT /:在 Host HTTP 标头中指定的名称创建一个存储桶
  • GET /:获取在 Host HTTP 标头中指定的名称的存储桶中的项目
  • GET (bucket):获取 URL 请求行中指定的名称的存储桶中的项目
  • GET (object):从 URL 请求行中指定的名称的存储桶中获取对象,该存储桶在 Host HTTP 标头中指定
  • PUT (object):将一个对象上传到 Host HTTP 标头中指定的存储桶,并为其指定 URL 请求行中指定的名称

请注意,其中大多数还需要将一系列 HTTP 标头包含在请求中,包括在 Google Cloud Storage 请求之前获得的 Authorization 字符串,通常是通过针对 Google Cloud Platform 执行 OAuth 请求来实现的。

示例

想象一下,正在开发的应用程序是一个集换式卡牌游戏,类似于《万智牌》,只不过它是完全在线和基于 Web 的。集换式卡牌游戏通常因每张卡的插画而闻名(并被购买);预先下载所有这些图像可能会非常昂贵,如果游戏允许玩家上传自定义创建的卡牌(这会是一个很酷的功能,您必须承认),那么这些图像将需要存储在在线某处,并作为游戏的一部分进行引用。那个地方,当然是Google Cloud Storage

上传新图像(无论是开发人员还是玩家上传)都将是一个 PUT 操作到“card-images”存储桶,如下所示:

    PUT /meatshieldfighter.jpg HTTP/1.1
    Host: coolcardgame.storage.googleapis.com
    Date: Sat, 20 Feb 2010 16:31:08 GMT
    Content-Type: image/jpg
    Content-MD5: iB94gawbwUSiZy5FuruIOQ==
    Content-Length: 552346
    Authorization: OAuth 1/zVNpoQNsOSxZKqOZgckhpQ

请注意 HTTP 请求的 Host 参数;“coolcardgame”是存储桶的名称,对象“meatshieldfighter.jpg”(显然是 Meat Shield Fighter 卡的插画)将存储到该存储桶中。然后,游戏稍后可以简单地包含一个 GET URL,可能直接作为“img”标签的一部分,如下所示:

GET /meatshieldfighter.jpg HTTP/1.1
    Host: coolcardgame.storage.googleapis.com
    Content-Length: 0
    Authorization: OAuth 1/zVNpoQNsOSxZKqOZgckhpQ

这是直接使用 HTTP API 的强大功能之一——通过使用指向 Google Cloud Storage 系统的直接 URL;开发人员可以让他们用户的浏览器充分利用 Web 基础设施的其余部分,包括他们浏览器和Google Cloud Platform 服务器之间的所有缓存服务器。出于同样的原因,Google Cloud Storage 支持 POST 形式的 PUT 命令来上传对象,该命令专门设计用于允许 Web 表单将图像(在本例中)直接 POST 到云端。

当然,还有更多功能,包括使用 HEAD 获取对象元数据和 DELETE 删除对象和/或清空存储桶的功能,但要使用这些功能的 HTTP 是从上面的内容可以推断出来的。还有一个可以设置在单个对象和存储桶上的访问控制系统,以及一个将某些对象标记为“公共”的机制(意味着检索它们不需要 Authorization 标头),所有这些都在 Google Cloud Storage 在线文档中有详细说明。

摘要

实际上,关于 Google Cloud Storage 没有太多可说的了:它支持上传、下载、枚举和删除大型二进制对象。通过使用基于 HTTP 的 API(开发人员越来越倾向于称之为“Web API”),Google 使从浏览器以及必要时从应用程序服务器执行所有这些操作变得非常简单。

更重要的是,正如我们所见,Google Cloud Platform 是一个功能非常齐全的“自带电池”的云平台,它具有开发人员期望从云 API 环境中获得的所有核心功能,以及其他云平台所缺乏的一些功能。总的来说,它是一个强大的平台,开发人员需要仔细评估它作为他们下一个要构建的基于 Web 或移动设备的应用程序的选择。

随着Google Cloud Platform 的进一步发展,我们将审视出现的各种部件,但目前,我们已经涵盖了核心部分,祝您好运,尽情享受云计算,编码愉快!

© . All rights reserved.