共用方式為


將 Orleans 應用程式部署並擴展至 Azure

在此快速入門指南中,您將在 Azure 容器應用上部署和擴展一個 URL 縮短器應用程式。 此應用程式允許使用者提交完整的網址,應用程式將返回一個短網址,使用者可以與他人分享,以便將他們引導至原始網站。 Orleans 和 Azure 提供必要的擴展性功能,以支援像 URL 縮址這類高流量應用程式的託管。 Orleans 也與任何支援 .NET 的其他主機服務相容。

在本快速入門結束時,您會有可在 Azure 中執行的可調整應用程式,以提供 URL 縮短程式功能。 在這個過程中,你會學到:

  • 拉取和 Azure 開發者 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 模板還會部署一個範例網頁應用程式。

    azd up
    
  6. 在配置過程中,選擇您的訂閱和所需位置。 等候布建和部署程式完成。 該過程可能需要大約五分鐘

  7. 當您的 Azure 資源配置完成後,將在輸出中包含一個指向正在運行的網頁應用程式的 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 縮短器網頁應用程式的截圖。

  9. 在瀏覽器的地址欄中,通過添加URL路徑(例如shorten) 來測試/shorten?url=https://www.microsoft.com端點。 頁面應重新加載,並提供一個新的 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 套件

在使用 grain 之前,必須安裝對應的 Microsoft.Orleans.Clustering.*Microsoft.Orleans.Persistence.* NuGet 套件。 這些服務會使用角色型訪問控制進行無密碼驗證,因此您也必須匯入 Azure.Identity NuGet 套件。

  1. 將您的當前工作目錄更改為./src/web/

    cd ./src/web
    
  2. 從 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. 從 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. 請找到並移除builder當前的配置代碼,在src/web/Program.cs檔案中。

    builder.Host.UseOrleans(static siloBuilder =>
    {
        siloBuilder
            .UseLocalhostClustering()
            .AddMemoryGrainStorage("urls");
    });
    
  1. builder 配置替換為此處的範例,此範例會實作下列重要概念:

    • 為了確保應用程式在本地開發和 Azure 託管環境中能正常運行,已新增條件環境檢查。
    • 方法會將 UseAzureStorageClusteringOrleans 叢集設定為使用 Azure Table 儲存,並使用 DefaultAzureCredential 類別進行驗證。
    • 使用Configure方法來分配Orleans叢集的標識碼。
    • ClusterID是叢集的唯一識別碼,可讓客戶端和數據庫彼此進行通訊。
    • ClusterID 可以在不同的部署之間發生變更。
    • ServiceID 是供 Orleans 內部使用的應用程式唯一標識碼,並且應在所有部署中保持一致。
    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 叢集,以使用適用於 NoSQL 的 Azure Cosmos DB,並使用 DefaultAzureCredential 類別進行驗證。
    • 使用Configure方法來分配Orleans叢集的標識碼。
    • ClusterID是叢集的唯一識別碼,可讓客戶端和數據庫彼此進行通訊。
    • ClusterID 可以在不同的部署之間發生變更。
    • ServiceID 是供 Orleans 內部使用的應用程式唯一標識碼,並且應在所有部署中保持一致。
    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,再次測試/shorten?url=https://learn.microsoft.com/dotnet/orleans端點。 頁面應重新加載,並提供一個新的 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 Table Storage 中 Orleans 資料的螢幕截圖。

  1. 請前往 Azure Cosmos DB 的 NoSQL 帳戶概覽頁面。

  2. 在導航中,選擇Data Explorer

  3. 請觀察本指南中您先前創建的以下容器:

    • OrleansStorage:此數據表會儲存應用程式用來處理 URL 重新導向的持續性狀態粒紋數據。

    • OrleansCluster:這個表格會追蹤Orleans叢集的關鍵儲存數據。

確保應用程式的可擴展性

Orleans 專為分散式應用程式所設計。 即使是像URL縮短器一樣簡單的應用程式,也可以受益於的 Orleans延展性。 您可以使用下列步驟,跨多個實例調整及測試應用程式:

  1. 返回至本快速入門指南中部署的資源群組。

  2. 導航至 Azure 容器應用程式的概覽頁面。

  3. 在導覽中,選取 比例

  4. 選擇編輯並部署,然後切換到調整大小標籤。

  5. 使用滑桿控制件將最小和最大複本值設定為 4。 這個值確保該應用程式正在多個實例上執行。

  6. 選擇建立以部署新修訂。

    顯示如何調整 Azure Container Apps 應用程式的螢幕快照。

  7. 部署完成後,請重複執行前一部分的測試步驟。 應用程式在多個實例中持續正常運作,現在可以處理更多的請求。

下一步