在 Azure 上部署和缩放 Orleans 应用

在本快速入门中,你将在 Azure 容器应用上部署和缩放 Orleans URL 缩短器应用。 通过该应用,用户可以将完整的 URL 提交到应用,这将返回他们可以与其他人共享的缩短版本,将他们引导到初始站点。 Orleans 和 Azure 提供了托管高流量应用(如 URL 缩短器)所需的可伸缩性功能。 Orleans 还与支持 .NET 的任何其他托管服务兼容。

在本快速入门结束时,你将在 Azure 中运行一个可缩放的应用,以提供 URL 缩短器功能。 在此过程中,你将了解如何:

  • 拉取并部署 Azure Developer CLI 模板
  • 将 Orleans 应用部署到 Azure
  • 将应用缩放到多个实例

先决条件

获取并部署示例应用程序

示例应用程序可用作 Azure Developer CLI 模板。 通过本快速入门,你可以拉取模板应用程序,将模板和示例代码部署到 Azure,更改模板以实现首选持久性粒度,部署必要的资源,然后部署最终应用程序。

  1. 在空目录中打开终端。

  2. 使用 azd auth login 向 Azure Developer CLI 进行身份验证。 按照该工具指定的步骤,使用首选 Azure 凭据向 CLI 进行身份验证。

    azd auth login
    
  3. 使用 AZD 模板 orleans-url-shortenerazd init 命令获取示例应用程序。

    azd init --template orleans-url-shortener
    
  4. 在初始化期间,配置唯一的环境名称。

    提示

    环境名称也将用作目标资源组名称。 对于本快速入门,请考虑使用 msdocs-orleans-url-shortener

  5. 使用 azd up 部署 Azure Cosmos DB for NoSQL 帐户。 Bicep 模板还部署示例 Web 应用程序。

    azd up
    
  6. 在预配过程中,选择订阅和所需位置。 等待预配和部署过程完成。 此过程可能需要大约 5 分钟

  7. 预配 Azure 资源后,输出中将包含指向正在运行的 Web 应用程序的 URL。

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. 使用控制台中的 URL 在浏览器中导航到 Web 应用程序。

    正在运行的 URL 缩短 Web 应用程序的屏幕截图。

  9. 在浏览器地址栏中,通过添加 URL 路径(例如 /shorten?url=https://www.microsoft.com)来测试 shorten 终结点。 应重新加载页面,并在末尾以缩短后的路径提供新 URL。 将新 URL 复制到剪贴板。

    {
      "original": "https://www.microsoft.com",
      "shortened": "http://<container-app-name>.<deployment-name>.<region>.azurecontainerapps.io:<port>/go/<generated-id>"
    }
    
  10. 将缩短的 URL 粘贴到地址栏中,然后按 Enter 键。 页面应重新加载并重定向到指定的 URL。

部署额外服务

原始部署仅部署了托管 URL 缩短器应用所需的最少服务。 若要使用 Azure 数据服务实现粒度持久化,必须先配置模板以部署首选服务。

  1. 使用终端运行 azd env set 以配置 DEPLOY_AZURE_TABLE_STORAGE 环境变量,从而启用 Azure Cosmos DB for NoSQL 的部署。

    azd env set DEPLOY_AZURE_TABLE_STORAGE true
    
  1. 使用终端运行 azd env set 以配置 DEPLOY_AZURE_COSMOS_DB_NOSQL 环境变量,从而启用 Azure Cosmos DB for NoSQL 的部署。

    azd env set DEPLOY_AZURE_COSMOS_DB_NOSQL true
    
  1. 运行 azd provision 以使用新配置重新部署应用程序体系结构。 等待预配过程完成。 此过程可能需要大约两分钟

    azd provision
    

    提示

    或者,也可以再次运行 azd up,这样既可以预配体系结构,还可以重新部署应用程序。

安装 NuGet 包

在使用粒度之前,必须安装相应的 Microsoft.Orleans.Clustering.*Microsoft.Orleans.Persistence.* NuGet 包。 这些服务使用基于角色的访问控制进行无密码身份验证,因此还必须导入 Azure.Identity NuGet 包。

  1. 将当前工作目录更改为 ./src/web/

    cd ./src/web
    
  2. 使用 dotnet add package 从 NuGet 导入 Azure.Identity 包。

    dotnet add package Azure.Identity --version 1.*
    
  3. 导入 Microsoft.Orleans.Clustering.AzureStorageMicrosoft.Orleans.Persistence.AzureStorage 包。

    NuGet 包
    群集 Microsoft.Orleans.Clustering.AzureStorage
    持久性 Microsoft.Orleans.Persistence.AzureStorage
    dotnet add package Microsoft.Orleans.Clustering.AzureStorage --version 8.*
    dotnet add package Microsoft.Orleans.Persistence.AzureStorage --version 8.*
    
  1. 使用 dotnet add package 从 NuGet 导入 Azure.Identity 包。

    dotnet add package Azure.Identity --version 1.*
    
  2. 导入 Microsoft.Orleans.Clustering.CosmosMicrosoft.Orleans.Persistence.Cosmos 包。

    NuGet 包
    群集 Microsoft.Orleans.Clustering.Cosmos
    持久性 Microsoft.Orleans.Persistence.Cosmos
    dotnet add package Microsoft.Orleans.Clustering.Cosmos --version 8.*
    dotnet add package Microsoft.Orleans.Persistence.Cosmos --version 8.*
    

配置并重新部署示例应用

当前示例应用配置为创建 localhost 群集,并将粒度长期保存在内存中。 在 Azure 中托管时,Orleans 可配置为通过 Azure 中的数据服务来使用更具可缩放性的集中状态。

  1. 然后,添加以下 using 指令:

    using Azure.Identity;
    using Orleans.Configuration;
    
  2. 查找并删除 src/web/Program.cs 文件中的当前 builder 配置代码

    builder.Host.UseOrleans(static siloBuilder =>
    {
        siloBuilder
            .UseLocalhostClustering()
            .AddMemoryGrainStorage("urls");
    });
    
  1. builder 配置替换为此处的示例,可实现以下关键概念:

    • 添加了条件环境检查,确保应用在本地开发和 Azure 托管方案中正确运行。
    • UseAzureStorageClustering 方法将 Orleans 群集配置为使用 Azure 表存储,并使用 DefaultAzureCredential 类进行身份验证。
    • 使用 Configure 方法为 Orleans 群集分配 ID。
      • ClusterID 是群集的唯一 ID,可允许客户端和接收器相互通信。
      • 可以在部署中更改 ClusterID
      • ServiceID 是 Orleans 在内部使用的应用程序的唯一 ID,应在部署中保持一致。
    if (builder.Environment.IsDevelopment())
    {
        builder.Host.UseOrleans(static siloBuilder =>
        {
            siloBuilder
                .UseLocalhostClustering()
                .AddMemoryGrainStorage("urls");
        });
    }
    else
    {
        builder.Host.UseOrleans(siloBuilder =>
        {
            var endpoint = new Uri(builder.Configuration["AZURE_TABLE_STORAGE_ENDPOINT"]!);
            var credential = new DefaultAzureCredential();
    
            siloBuilder
                .UseAzureStorageClustering(options =>
                {
                    options.ConfigureTableServiceClient(endpoint, credential);
                })
                .AddAzureTableGrainStorage(name: "urls", options =>
                {
                    options.ConfigureTableServiceClient(endpoint, credential);
                })
                .Configure<ClusterOptions>(options =>
                {
                    options.ClusterId = "url-shortener";
                    options.ServiceId = "urls";
                });
        });
    }
    
  1. builder 配置替换为此处的示例,可实现以下关键概念:

    • 添加了条件环境检查,确保应用在本地开发和 Azure 托管方案中正确运行。
    • UseCosmosClustering 方法将 Orleans 群集配置为使用 Azure Cosmos DB for NoSQL,并使用 DefaultAzureCredential 类进行身份验证。
    • 使用 Configure 方法为 Orleans 群集分配 ID。
      • ClusterID 是群集的唯一 ID,可允许客户端和接收器相互通信。
      • 可以在部署中更改 ClusterID
      • ServiceID 是 Orleans 在内部使用的应用程序的唯一 ID,应在部署中保持一致。
    if (builder.Environment.IsDevelopment())
    {
        builder.Host.UseOrleans(static siloBuilder =>
        {
            siloBuilder
                .UseLocalhostClustering()
                .AddMemoryGrainStorage("urls");
        });
    }
    else
    {
        builder.Host.UseOrleans(siloBuilder =>
        {
            var endpoint = builder.Configuration["AZURE_COSMOS_DB_NOSQL_ENDPOINT"]!;
            var credential = new DefaultAzureCredential();
    
            siloBuilder
                .UseCosmosClustering(options =>
                {
                    options.ConfigureCosmosClient(endpoint, credential);
                })
                .AddCosmosGrainStorage(name: "urls", options =>
                {
                    options.ConfigureCosmosClient(endpoint, credential);
                })
                .Configure<ClusterOptions>(options =>
                {
                    options.ClusterId = "url-shortener";
                    options.ServiceId = "urls";
                });
        });
    }
    
  1. 运行 azd deploy,将应用程序代码重新部署为 Docker 容器。 等待部署过程完成。 此过程可能需要大约一分钟

    azd deploy
    

    提示

    或者,也可以再次运行 azd up,这样既可以预配体系结构,还可以重新部署应用程序。

验证应用行为

再次使用已部署的应用程序并检查数据存储位置,以验证更新的代码是否正常运行。

  1. 在浏览器地址栏中,通过添加 URL 路径(例如 /shorten?url=https://learn.microsoft.com/dotnet/orleans)再次测试 shorten 终结点。 应重新加载页面,并在末尾以缩短后的路径提供新 URL。 将新 URL 复制到剪贴板。

    {
      "original": "https://learn.microsoft.com/dotnet/orleans",
      "shortened": "http://<container-app-name>.<deployment-name>.<region>.azurecontainerapps.io:<port>/go/<generated-id>"
    }
    
  2. 将缩短的 URL 粘贴到地址栏中,然后按 Enter 键。 页面应重新加载并重定向到指定的 URL。

(可选)可以验证群集和状态数据是否按预期存储在创建的存储帐户中。

  1. 在 Azure 门户中,导航到本快速入门中部署的资源组。

    重要

    本快速入门前面指定的环境名称也是目标资源组名称。

  1. 导航到 Azure 存储帐户的概述页。

  2. 在导航中,选择“存储浏览器”

  3. 展开“表”导航项以发现 Orleans 创建的两个表:

    • OrleansGrainState:此表存储应用程序用于处理 URL 重定向的持久性状态粒度数据。

    • OrleansSiloInstances:此表跟踪 Orleans 群集的基本孤岛数据。

  4. 选择 OrleansGrainState 表。 该表可保存应用在测试期间保留的每个 URL 重定向的行条目。

    显示 Azure 表存储中 Orleans 数据的屏幕截图。

  1. 导航到 Azure Cosmos DB for NoSQL 帐户的概述页。

  2. 在导航中,选择“数据资源管理器”

  3. 观察本指南前面创建的以下容器:

    • OrleansStorage:此表存储应用程序用于处理 URL 重定向的持久状态粒度数据。

    • OrleansCluster:此表跟踪群集 Orleans 的基本孤岛数据。

缩放应用

Orleans 专用于分散式应用程序。 即使是像 URL 缩短器这样简单的应用,也可以受益于 Orleans 的可伸缩性。 可以使用以下步骤在多个实例中缩放和测试应用:

  1. 导航回本快速入门中部署的资源组。

  2. 导航到 Azure 容器应用的概述页。

  3. 在导航中,选择“缩放”

  4. 选择“编辑和部署”,然后切换到“缩放”选项卡。

  5. 使用滑块控件将副本的最小值和最大值设置为 4。 此值可确保应用在多个实例上运行。

  6. 选择“创建”以部署新修订。

    显示了如何缩放“Azure 容器应用”应用的屏幕截图。

  7. 部署完成后,重复上一部分中的测试步骤。 该应用在多个实例中继续按预期工作,现在可以处理更多的请求。

下一步