你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:适用于 .NET 的 Azure Cosmos DB for Apache Cassandra 客户端库

适用于 .NET 的 Azure Cosmos DB for Apache Cassandra 客户端库入门,用于存储、管理和查询非结构化数据。 按照本指南中的步骤创建新帐户、安装 .NET 客户端库、连接到帐户、执行常见作以及查询最终示例数据。

API 参考文档 | 库源代码 | 包 (NuGet)

先决条件

  • Azure 订阅服务

    • 如果没有 Azure 订阅,请在开始之前创建一个免费帐户
  • .NET SDK 9.0 或更高版本

设置

首先,为本指南设置帐户和开发环境。 本部分将指导你完成创建帐户、获取其凭据以及准备开发环境的过程。

创建帐户

首先,创建用于 Apache Cassandra 帐户的 API。 创建帐户后,创建密钥空间和表资源。

  1. 如果还没有目标资源组,请使用 az group create 命令在订阅中创建新的资源组。

    az group create \
        --name "<resource-group-name>" \
        --location "<location>"
    
  2. 使用az cosmosdb create命令来创建一个具有默认设置的适用于Apache Cassandra的新Azure Cosmos DB帐户。

    az cosmosdb create \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --locations "regionName=<location>" \
        --capabilities "EnableCassandra"
    
  3. 使用 az cosmosdb cassandra keyspace create 命名的 cosmicworks 创建新的密钥空间。

    az cosmosdb cassandra keyspace create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --name "cosmicworks"
    
  4. 使用多行 Bash 命令创建新的 JSON 对象来表示架构。 然后,使用 az cosmosdb cassandra table create 命令创建一个名为 products 的新表。

    schemaJson=$(cat <<EOF
    {
      "columns": [
        {
          "name": "id",
          "type": "text"
        },
        {
          "name": "name",
          "type": "text"
        },
        {
          "name": "category",
          "type": "text"
        },
        {
          "name": "quantity",
          "type": "int"
        },
        {
          "name": "price",
          "type": "decimal"
        },
        {
          "name": "clearance",
          "type": "boolean"
        }
      ],
      "partitionKeys": [
        {
          "name": "id"
        }
      ]
    }
    EOF
    )
    
    az cosmosdb cassandra table create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --keyspace-name "cosmicworks" \
        --name "product" \
        --schema "$schemaJson"
    

获取凭据

现在,获取用于创建与最近创建的帐户的连接的客户端库的密码。

  1. 使用 az cosmosdb show 获取帐户的联系点和用户名。

    az cosmosdb show \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --query "{username:name,contactPoint:documentEndpoint}"
    
  2. 记录上述命令输出中的 contactPoint 值和 username 属性。 这些属性的值分别是“联系点”和“用户名”,将在本指南的后续步骤中使用它们通过库连接到该帐户。

  3. 使用 az cosmosdb keys list 来获取帐户的 密钥

    az cosmosdb keys list \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --type "keys"
    
  4. 记录来自上一个命令输出的属性 primaryMasterKey 的值。 此属性的值是稍后在本指南中使用的 密码 ,用于使用库连接到帐户。

准备开发环境

然后,使用新项目和客户端库配置开发环境。 在转到本指南的其余部分之前,此步骤是最后一个必需的先决条件。

  1. 从空目录中开始。

  2. 创建新的 .NET 控制台应用程序

    dotnet new console
    
  3. 从 NuGet 添加 CassandraCSharpDriver 包。

    dotnet add package CassandraCSharpDriver
    
  4. 构建项目。

    dotnet build
    

对象模型

DESCRIPTION
Cluster 表示与群集的连接状态
ISession 保持与群集的特定连接的线程安全实体
Mapper 用于运行查询的 Cassandra 查询语言 (CQL) 客户端

代码示例

对客户端进行身份验证

首先,使用本指南前面收集的凭据对客户端进行身份验证。

  1. 在集成开发环境(IDE)中打开 Program.cs 文件。

  2. 删除文件中的任何现有内容。

  3. 为以下命名空间添加 using 指令:

    • System.Security.Authentication
    • Cassandra
    • Cassandra.Mapping
    using System.Security.Authentication;
    using Cassandra;
    using Cassandra.Mapping;
    
  4. 为本指南前面收集的凭据创建字符串常量变量。 为变量 username命名, password以及 contactPoint

    const string username = "<username>";
    const string password = "<password>";
    const string contactPoint = "<contact-point>";
    
  5. 创建一个新 SSLoptions 对象,以确保使用传输层安全性 (TLS) 1.2 协议,检查证书吊销,并且不执行任何额外的客户端认证验证。

    SSLOptions sslOptions = new(
        sslProtocol: SslProtocols.Tls12,
        checkCertificateRevocation: true,
        remoteCertValidationCallback: (_, _, _, _) => true);
    
  6. 使用 fluent Cluster.Builder() 语法构造新Cluster对象。 使用在前面的步骤中创建的凭据和配置变量。

    Cluster cluster = Cluster.Builder()
        .WithCredentials(username, password)
        .WithPort(10350)
        .AddContactPoint(contactPoint)
        .WithSSL(sslOptions)
        .Build();
    
  7. 使用ConnectAsync传入目标键空间名称的方法创建新session变量(cosmicworks)。

    using ISession session = await cluster.ConnectAsync("cosmicworks");
    
  8. 通过使用Mapper类构造函数并传递最近创建的session变量来创建一个新的mapper变量。

    Mapper mapper = new(session);
    

警告

本指南中禁用了完整的传输层安全性(TLS)验证,以简化身份验证。 对于生产部署,请完全启用验证。

更新插入数据

接下来,将新数据插入或更新到表中。 Upserting 可确保根据表中是否已存在相同的数据,适当地创建或替换数据。

  1. 定义一个名为 Product 的新记录类型,其中的字段对应于本指南前面创建的表。

    类型
    Id string
    Name string
    Category string
    Quantity int
    Price decimal
    Clearance bool
    record Product
    {
        public required string Id { get; init; }
    
        public required string Name { get; init; }
    
        public required string Category { get; init; }
    
        public required int Quantity { get; init; }
    
        public required decimal Price { get; init; }
    
        public required bool Clearance { get; init; }
    }
    

    小窍门

    在 .NET 中,可以在另一个文件中创建此类型,也可以在现有文件的末尾创建它。

  2. 创建一个Product类型的新对象。 将对象存储在名为 .. 的 product变量中。

    Product product = new()
    {
        Id = "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        Name = "Yamba Surfboard",
        Category = "gear-surf-surfboards",
        Quantity = 12,
        Price = 850.00m,
        Clearance = false
    };
    
  3. 异步调用 InsertAsync 方法,并且传入变量 product,该变量是在上一步中创建的。

    await mapper.InsertAsync(product);
    

读取数据

然后,读取以前插入到表中的数据。

  1. 创建一个名为 CQL 查询的新字符串变量 readQuery ,该查询与具有相同 id 字段的项匹配。

    string readQuery = "SELECT * FROM product WHERE id = ? LIMIT 1";
    
  2. 创建与本指南前面创建的产品相同的值的字符串变量 id

    string id = "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb";
    
  3. SingleAsync<>使用泛型方法运行存储的readQuery查询,将id变量作为参数传入,并将输出映射到Product类型。 将此作的结果存储在类型的 Product变量中。

    Product matchedProduct = await mapper.SingleAsync<Product>(readQuery, [id]);
    

查询数据

最后,使用查询查找与表中特定筛选器匹配的所有数据。

  1. 创建名为 findQuerycategory 的字符串变量,包括 CQL 查询和必需参数。

    string findQuery = "SELECT * FROM product WHERE category = ? ALLOW FILTERING";
    string category = "gear-surf-surfboards";
    
  2. 使用两个字符串变量和 FetchAsync<> 泛型方法异步查询多个结果。 将此查询的结果存储在类型为IEnumerable<Product>,名为queriedProducts的变量中。

    IEnumerable<Product> queriedProducts = await mapper.FetchAsync<Product>(findQuery, [category]);
    
  3. 使用foreach循环迭代查询结果。

    foreach (Product queriedProduct in queriedProducts)
    {
        // Do something here with each result
    }
    

运行代码

使用应用程序目录中的终端运行新创建的应用程序。

dotnet run

清理资源

如果不再需要此帐户,请通过删除资源来从 Azure 订阅中删除该帐户

az cosmosdb delete \
    --resource-group "<resource-group-name>" \
    --name "<account-name>"

后续步骤