新的 Azure 存储功能:REST API、附加 Blob、文件服务更改

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

我写了一篇关于 Azure 存储的博文已经有一段时间了。本月早些时候,Azure 存储团队发布了新版本的存储服务,其中包含许多很棒的优点!在这篇博文中,我将尝试总结这些。

让我们开始吧!

新存储服务 REST API 版本/客户端库

所有新更改都被整合到新版本的 REST API 中。新版本是“ 2015-02-21 ”。这个新版本有一些重大变化,所以如果你想使用新的东西,请确保你使用最新版本的 REST API。

此版本包括一个名为“Append Blob”的新 blob 类型以及 Azure 文件服务中的大量新功能。

除了新的 REST API,Azure 存储团队还发布了新版本的存储客户端库——5.0.0 版。此版本实现了最新版本的 REST API 中可用的所有功能。您可以从 Nuget 在您的项目中获取此库: https ://www.nuget.org/packages/WindowsAzure.Storage/。

追加 Blob

Append Blob 是这个街区的最新成员。以前,Azure 存储中有两种可用的 blob——块 Blob 和页 Blob。现在是三个。

顾名思义,在 Append Blob 中,内容始终附加到 Blob。它非常适合存储日志记录或遥测数据。尽管您也可以使用 Block blob 实现这种功能,但是附加 blob 使您可以非常轻松地收集日志数据。

让我们考虑一个场景,您想要从 Web 应用程序收集日志记录数据并将其存储在 blob 存储中。此外,假设您每天只需要一个文件。使用 Append Blob 执行此操作的方法是首先创建一个空的附加 blob,当数据进入时,您只需将其写入 blob。 Append Blob 将确保现有数据不会被覆盖,并且您发送的新内容将写入 blob 的末尾。

为了管理 Append Blob,在 .Net Storage Client 库中创建了一个新类 – CloudAppendBlob [抱歉,MSDN 文档尚未更新]。使用 CloudAppendBlob 的方式与使用 CloudBlockBlob 或 CloudPageBlob 的方式非常相似。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

Append Blob 支持其他 blob 类型支持的所有操作。您可以复制附加 blob、拍摄快照、查看/更新元数据、查看/更新属性、下载等。

一些重要说明:

  • 附加 Blob 仅在“2015-02-21”版本的 REST API 中受支持。因此,如果您想使用附加 Blob,则必须使用最新版本的 REST API。
  • 假设您有一个 blob 容器,其中包含块、页面和追加 blob。您必须使用最新版本的 REST API。如果您使用旧版本的 REST API,Blob 枚举将在 REST API 级别本身失败。

共享访问签名 (SAS) 更改

如果您使用 REST API 创建 SAS,那么在构造要签名的字符串时,“规范化资源”的创建方式会发生重大变化。在最新版本中,您必须将服务名称(blob、表、队列或文件)添加到规范化资源之前。例如,如果要为其创建 SAS 的 URL 是“https://myaccount.blob.core.windows.net/music”:

在以前的版本中,规范化资源将是:


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

但在新版本中,它将是:


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

您可以在此处了解有关共享访问签名的更多信息:https: //msdn.microsoft.com/en-us/library/azure/dn140255.aspx

文件服务变更

这就是乐趣的开始。文件服务进行了许多更改。让我们来谈谈他们吧!

但请注意,文件服务仍处于预览阶段,因此默认情况下不会在您的存储帐户/订阅中启用。您需要通过访问帐户管理门户在您的订阅中启用文件服务。

CORS

您可能已经知道,其他存储服务(Blob、队列和表)长期以来一直支持 CORS(这与 SAS 一起成为 Cloud Portam 的基础)。现在文件服务也支持CORS了!

文件服务的 CORS 与其他服务的工作方式相同:

  • CORS 规则应用于服务级别。
  • 文件服务最多可以有 5 个 CORS 规则。
  • 每个 CORS 规则都将包含一个允许的来源列表、HTTP 动词、一个允许的(请求)和公开的(响应)标头列表以及以秒为单位的最大期限。

让我们举例说明如何为文件服务设置 CORS 规则。在此示例中,我将使用 Cloud Portam 所需的 CORS 规则。对于 Cloud Portam,我们需要以下 CORS 规则集:

允许的来源 https://app.cloudportam.com 允许的动词 Get、Header、Post、Put、Delete、Trace、Options、Connect 和 Merge 允许的 Headers * Exposed Headers * Max Age 360​​0


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

下面是一个示例,说明您将如何阅读当前为文件服务设置的 CORS 规则。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

份额配额

现在您可以为共享定义配额。配额将限制该共享的最大大小。共享配额的值必须介于 1 MB 和 5 GB 之间。

您可以在创建共享时设置共享的配额。您也可以稍后通过更改共享的属性来更新配额。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

请注意,如果您在创建共享时未设置配额,则其配额将设置为 5 GB(即最大值)。

但是,如果您在共享上调用“SetProperties()”但不提供配额值,则它的值不会更改。

分享使用

存储中引入的另一个巧妙功能是能够查看共享使用情况,即已使用了多少共享配额。请注意,这只是一个近似值。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

共享访问策略

到目前为止,文件服务还缺少另一个重要功能。在当前版本之前,无法匿名访问文件服务共享和文件。为了对文件服务执行任何操作,您需要帐户密钥。

随着共享访问策略和共享访问签名支持的引入,现在可以在不使用帐户密钥的情况下对共享和文件执行某些操作。

共享访问策略的工作方式与 Blob 容器访问策略相同:

  • 每个共享最多可以有 5 个访问策略。
  • 每个访问策略都必须有一个唯一的标识符,并且可以选择有一个开始/结束日期和权限(读、写、列表和删除)。
  • 使用访问策略创建共享访问签名时,只需指定缺少的参数。例如,如果访问策略定义了开始日期,则您无法在共享访问签名中指定开始日期。

让我们看看如何在共享上创建共享访问策略。在此示例中,我们正在创建一个具有所有权限(读取、写入、列出和删除)和从当前日期/时间起 24 小时到期的访问策略。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

共享访问签名

访问策略附带共享访问签名 (SAS)。这是文件服务所做的另一项重要改进。现在您可以为文件服务共享和文件创建 SAS URL。

用于文件服务的 SAS 与用于 Blob 容器和 Blob 的 SAS 非常相似:

  • 您可以创建不带访问策略的 SAS (ad-hoc SAS) 或带访问策略的 SAS。
  • 对于 SAS,您定义开始日期/时间(可选)、结束日期/时间以及读取、写入、列表或删除权限中的至少一项。如果您使用访问策略来定义 SAS,那么您只需指定该访问策略中不存在的参数。
  • 在共享上创建 SAS 时,以下权限适用:读取、写入、列出和删除,但是在共享中的文件上创建 SAS 时,列表权限不适用。

让我们看看如何在共享上创建 SAS。在此示例中,我们将创建一个仅具有“列表”权限的临时 SAS,该权限将从当前日期/时间起 24 小时后到期。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

现在让我们看看如何在共享中的文件上创建 SAS。在此示例中,我们将创建一个仅具有“读取”权限的临时 SAS,该权限将从当前日期/时间起 24 小时后到期。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

目录元数据

在以前的版本中,Storage Service 允许您在共享和文件而不是目录上定义元数据。在此版本中,他们启用了此功能。现在您可以以键/值对的形式在目录上定义自定义元数据。您可以在创建目录时设置元数据并在以后更新它。

目录元数据的规则与共享和文件的规则相同:

  • 元数据键必须是有效的 C# 标识符。
  • 元数据的大小不能超过 8KB。

让我们看看如何在目录上设置元数据。


 static void CreateEmptyAppendBlob()
        {
            var account = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var blobClient = account.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference("logs-container");
            container.CreateIfNotExists();
            var logBlob = container.GetAppendBlobReference(DateTime.UtcNow.Date.ToString("yyyy-MM-dd") + ".log");
            logBlob.CreateOrReplace();
            container.DeleteIfExists();
        }

复制文件

这是最新 API 中引入的另一个重要特性。从本质上讲,此功能提供了服务器端异步复制功能,用于在存储帐户内或跨存储帐户的不同共享之间复制文件。不仅如此,您现在还可以将文件从文件服务共享复制到 Blob 容器,反之亦然。

不幸的是,我并没有使用它来包含一些示例,但是随着我对这个功能的了解越来越多,我会用更多的细节来更新这篇文章。

愿望清单

尽管引入的新功能令人印象深刻,但我认为 API 中仍然缺少一些东西。我的愿望清单中的一些项目是:

  • 递归列出文件的能力——目前,文件服务仅列出共享或目录中的文件和目录。我希望存储团队包含一项功能,我可以在其中列出共享中的所有文件,而不管嵌套目录层次结构如何。
  • 删除非空文件夹的能力——目前要删除一个文件夹,它必须是完全空的。我希望存储团队包含一项功能,我可以在其中删除非空文件夹。
  • 复制文件夹的能力——目前复制功能仅适用于文件。我希望存储团队包括复制文件夹功能。

这些是我的愿望清单中的一些项目。如果您有愿望清单,请通过在下方发表评论来分享。

概括

这篇文章就是这样。我希望你发现这篇文章很有用。如果您发现帖子有任何问题,请告诉我,我会尽快解决。