使用 Xamarin 和 Azure Cosmos DB 生成移动应用程序

大多数移动应用需要在云中存储数据,而 Azure Cosmos DB 正是适用于移动应用的云数据库。 该产品提供移动开发人员所需的一切功能。 它是一个完全托管的数据库即服务,可按需缩放。 它能够以应用程序完全可见的方式存放中国各地用户的数据。 使用 Azure Cosmos DB .NET Core SDK,可让 Xamarin 移动应用直接与 Azure Cosmos DB 交互,无需中间层。

本文提供有关使用 Xamarin 和 Azure Cosmos DB 生成移动应用的教程。 可在 GitHub 上的 Xamarin 和 Azure Cosmos DB 中找到本教程的完整源代码,其中包括如何管理用户和权限。

移动应用的 Azure Cosmos DB 功能

Azure Cosmos DB 为移动应用开发人员提供以下重要功能:

移动应用的 Azure Cosmos DB 功能

  • 针对无架构数据的丰富查询。 Azure Cosmos DB 将数据以无架构 JSON 文档的形式存储在异构集合中。 它提供丰富的快速查询,无需担心架构或索引问题。
  • 快速吞吐量。 使用 Azure Cosmos DB 时,只需几毫秒就能读取和写入文档。 开发人员可以指定所需的吞吐量,Azure Cosmos DB 对所有单区域帐户和具有松散一致性的所有多区域帐户采用 99.99% 的可用性 SLA,对所有多区域数据库帐户采用 99.999% 的读取可用性。
  • 无限规模。 Azure Cosmos DB 集合随着应用的增长而增长。 一开始可以处理较小规模的数据和每秒几百个请求的吞吐量。 集合或数据库可以增长到 PB 量级的数据和每秒几亿个请求的任意大的吞吐量。
  • 多区域分布。 移动应用用户的特点是经常在中国不同的地点漫游。 Azure Cosmos DB 是多区域分布式数据库。 单击地图即可让用户访问数据。
  • 内置丰富授权。 有了 Azure Cosmos DB,无需使用复杂的自定义授权代码,就能轻松实现常用的模式,例如,每个用户的数据,或者多个共享用户的数据。
  • 地理空间查询。 许多移动应用现在可以提供区分地理环境的体验。 凭借对地理空间类型的一流支持,Azure Cosmos DB 可轻松创建这些体验。
  • 二进制附件。 应用数据通常包含二进制 Blob。 Azure Cosmos DB 原生支持附件,因此可以更轻松地用作应用数据的一站式存储库。

Azure Cosmos DB 和 Xamarin 教程

以下教程介绍如何使用 Xamarin 和 Azure Cosmos DB 生成移动应用程序。 可在 GitHub 上的 Xamarin 和 Azure Cosmos DB 中找到该教程的完整源代码。

入门

Azure Cosmos DB 入门容易。 转到 Azure 门户,并创建新的 Azure Cosmos DB 帐户。 单击“快速入门”选项卡。下载已连接到 Azure Cosmos DB 帐户的 Xamarin Forms 待办事项列表示例。

适用于移动应用的 Azure Cosmos DB 快速入门

或者,如果已有一个 Xamarin 应用,则可以添加 Azure Cosmos DB NuGet 包。 Azure Cosmos DB 支持 Xamarin.IOS、Xamarin.Android 和 Xamarin Forms 共享库。

处理数据

数据记录以无架构 JSON 文档的形式存储在 Azure Cosmos DB 的异构集合中。 可在同一个集合中存储具有不同结构的文档:

    var result = await client.CreateDocumentAsync(collectionLink, todoItem);

在 Xamarin 项目中,可以针对无架构数据使用语言集成的查询:

    var query = await client.CreateDocumentQuery<ToDoItem>(collectionLink)
                    .Where(todoItem => todoItem.Complete == false)
                    .AsDocumentQuery();

    Items = new List<TodoItem>();
    while (query.HasMoreResults) {
        Items.AddRange(await query.ExecuteNextAsync<TodoItem>());
    }

添加用户

与许多入门示例一样,下载的 Azure Cosmos DB 示例使用已在应用代码中硬编码的主密钥向服务进行身份验证。 除非在本地模拟器上运行应用,否则这种默认行为不是最佳做法。 如果未经授权的用户获取了主密钥,整个 Azure Cosmos DB 帐户中的所有数据可能会泄露。 应用最好是只能访问已登录用户的记录。 Azure Cosmos DB 允许开发人员向应用程序授予对某个集合、按分区键分组的一组文档或某个特定文档的读取或读/写权限。

遵循以下步骤将待办事项列表应用修改为多用户待办事项列表应用:

  1. 使用 Facebook、Active Directory 或其他任何提供程序将登录名添加到应用。

  2. 创建使用 /userId 作为分区键的 Azure Cosmos DB UserItems 集合。 为集合指定分区键可让 Azure Cosmos DB 随着应用用户的增多而无限缩放,同时可持续提供快速查询。

  3. 添加 Azure Cosmos DB 资源令牌代理。 这是一个简单的 Web API,可对用户进行身份验证,并向只有权访问其自己分区中的文档的已登录用户颁发短期生存的令牌。 在此示例中,资源令牌代理托管在应用服务中。

  4. 将应用修改为使用 Facebook 对资源令牌代理进行身份验证,请求已登录的 Facebook 用户的资源令牌。 然后,可在 UserItems 集合中访问其数据。

可在 GitHub 上的资源令牌代理中找到此模式的完整代码示例。 下图演示了该解决方案:

Azure Cosmos DB 用户和权限代理

如果希望两个用户能够访问同一个“待办事项列表”,可将其他权限添加到资源令牌代理中的访问令牌。

按需缩放

Azure Cosmos DB 是托管型数据库即服务。 随着用户群体的扩大,不用担心是否要预配 VM 或增加核心, 只需告诉 Azure Cosmos DB 应用所需的每秒操作次数(吞吐量)。 可以通过“缩放”选项卡,使用一个名为每秒请求单位数 (RU) 的吞吐量度量值来指定吞吐量。 例如,针对 1-KB 文档执行一次读取操作需要 1 个 RU。 还可以针对吞吐量指标添加警报,用于监视流量的增长以及在警报触发时以编程方式更改吞吐量。

Azure Cosmos DB 可按需缩放吞吐量

达到多区域规模

在应用受到广泛欢迎后,可以吸收中国的用户。 或许需要针对一些不可预见的事件做好准备。 转到 Azure 门户,并打开 Azure Cosmos DB 帐户。 单击地图即可将数据持续复制到中国任意数目的区域。 此功能可向任意位置的用户提供数据。 还可以添加故障转移策略,针对意外状况做好准备。

Azure Cosmos DB 可跨地理区域缩放

祝贺。 现已完成本解决方案,并使用 Xamarin 和 Azure Cosmos DB 生成了一个移动应用。 按照类似的步骤,使用 Azure Cosmos DB JavaScript SDK 生成 Cordova 应用,使用 Azure Cosmos DB REST API 生成本机 iOS/Android 应用。

后续步骤