在 Azure 上部署和缩放 Orleans 应用
在本快速入门中,你将在 Azure 容器应用上部署和缩放 Orleans URL 缩短器应用。 通过该应用,用户可以将完整的 URL 提交到应用,这将返回他们可以与其他人共享的缩短版本,将他们引导到初始站点。 Orleans 和 Azure 提供了托管高流量应用(如 URL 缩短器)所需的可伸缩性功能。 Orleans 还与支持 .NET 的任何其他托管服务兼容。
在本快速入门结束时,你将在 Azure 中运行一个可缩放的应用,以提供 URL 缩短器功能。 在此过程中,你将了解如何:
- 拉取并部署 Azure Developer CLI 模板
- 将 Orleans 应用部署到 Azure
- 将应用缩放到多个实例
先决条件
- 具有活动订阅的 Azure 帐户。 免费创建帐户。
- Azure 开发人员 CLI
- .NET 8
- Docker
获取并部署示例应用程序
示例应用程序可用作 Azure Developer CLI 模板。 通过本快速入门,你可以拉取模板应用程序,将模板和示例代码部署到 Azure,更改模板以实现首选持久性粒度,部署必要的资源,然后部署最终应用程序。
在空目录中打开终端。
使用
azd auth login
向 Azure Developer CLI 进行身份验证。 按照该工具指定的步骤,使用首选 Azure 凭据向 CLI 进行身份验证。azd auth login
使用 AZD 模板
orleans-url-shortener
和azd init
命令获取示例应用程序。azd init --template orleans-url-shortener
在初始化期间,配置唯一的环境名称。
提示
环境名称也将用作目标资源组名称。 对于本快速入门,请考虑使用
msdocs-orleans-url-shortener
。使用
azd up
部署 Azure Cosmos DB for NoSQL 帐户。 Bicep 模板还部署示例 Web 应用程序。azd up
在预配过程中,选择订阅和所需位置。 等待预配和部署过程完成。 此过程可能需要大约 5 分钟。
预配 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.
使用控制台中的 URL 在浏览器中导航到 Web 应用程序。
在浏览器地址栏中,通过添加 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>" }
将缩短的 URL 粘贴到地址栏中,然后按 Enter 键。 页面应重新加载并重定向到指定的 URL。
部署额外服务
原始部署仅部署了托管 URL 缩短器应用所需的最少服务。 若要使用 Azure 数据服务实现粒度持久化,必须先配置模板以部署首选服务。
使用终端运行
azd env set
以配置DEPLOY_AZURE_TABLE_STORAGE
环境变量,从而启用 Azure Cosmos DB for NoSQL 的部署。azd env set DEPLOY_AZURE_TABLE_STORAGE true
使用终端运行
azd env set
以配置DEPLOY_AZURE_COSMOS_DB_NOSQL
环境变量,从而启用 Azure Cosmos DB for NoSQL 的部署。azd env set DEPLOY_AZURE_COSMOS_DB_NOSQL true
运行
azd provision
以使用新配置重新部署应用程序体系结构。 等待预配过程完成。 此过程可能需要大约两分钟。azd provision
提示
或者,也可以再次运行
azd up
,这样既可以预配体系结构,还可以重新部署应用程序。
安装 NuGet 包
在使用粒度之前,必须安装相应的 Microsoft.Orleans.Clustering.*
和 Microsoft.Orleans.Persistence.*
NuGet 包。 这些服务使用基于角色的访问控制进行无密码身份验证,因此还必须导入 Azure.Identity
NuGet 包。
将当前工作目录更改为 ./src/web/。
cd ./src/web
使用
dotnet add package
从 NuGet 导入Azure.Identity
包。dotnet add package Azure.Identity --version 1.*
导入
Microsoft.Orleans.Clustering.AzureStorage
和Microsoft.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.*
使用
dotnet add package
从 NuGet 导入Azure.Identity
包。dotnet add package Azure.Identity --version 1.*
导入
Microsoft.Orleans.Clustering.Cosmos
和Microsoft.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 中的数据服务来使用更具可缩放性的集中状态。
然后,添加以下
using
指令:using Azure.Identity; using Orleans.Configuration;
查找并删除 src/web/Program.cs 文件中的当前
builder
配置代码。builder.Host.UseOrleans(static siloBuilder => { siloBuilder .UseLocalhostClustering() .AddMemoryGrainStorage("urls"); });
将
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"; }); }); }
将
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"; }); }); }
运行
azd deploy
,将应用程序代码重新部署为 Docker 容器。 等待部署过程完成。 此过程可能需要大约一分钟。azd deploy
提示
或者,也可以再次运行
azd up
,这样既可以预配体系结构,还可以重新部署应用程序。
验证应用行为
再次使用已部署的应用程序并检查数据存储位置,以验证更新的代码是否正常运行。
在浏览器地址栏中,通过添加 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>" }
将缩短的 URL 粘贴到地址栏中,然后按 Enter 键。 页面应重新加载并重定向到指定的 URL。
(可选)可以验证群集和状态数据是否按预期存储在创建的存储帐户中。
在 Azure 门户中,导航到本快速入门中部署的资源组。
重要
本快速入门前面指定的环境名称也是目标资源组名称。
导航到 Azure 存储帐户的概述页。
在导航中,选择“存储浏览器”。
展开“表”导航项以发现 Orleans 创建的两个表:
OrleansGrainState:此表存储应用程序用于处理 URL 重定向的持久性状态粒度数据。
OrleansSiloInstances:此表跟踪 Orleans 群集的基本孤岛数据。
选择 OrleansGrainState 表。 该表可保存应用在测试期间保留的每个 URL 重定向的行条目。
导航到 Azure Cosmos DB for NoSQL 帐户的概述页。
在导航中,选择“数据资源管理器”。
观察本指南前面创建的以下容器:
OrleansStorage:此表存储应用程序用于处理 URL 重定向的持久状态粒度数据。
OrleansCluster:此表跟踪群集 Orleans 的基本孤岛数据。
缩放应用
Orleans 专用于分散式应用程序。 即使是像 URL 缩短器这样简单的应用,也可以受益于 Orleans 的可伸缩性。 可以使用以下步骤在多个实例中缩放和测试应用:
导航回本快速入门中部署的资源组。
导航到 Azure 容器应用的概述页。
在导航中,选择“缩放”。
选择“编辑和部署”,然后切换到“缩放”选项卡。
使用滑块控件将副本的最小值和最大值设置为 4。 此值可确保应用在多个实例上运行。
选择“创建”以部署新修订。
部署完成后,重复上一部分中的测试步骤。 该应用在多个实例中继续按预期工作,现在可以处理更多的请求。