教學課程:在 Azure Functions 應用程式中使用動態設定

應用程式組態 .NET 組態提供者支援由應用程式活動動態驅動的組態快取和重新整理。 本教學課程會示範如何在程式碼中實作動態設定更新。 本文以快速入門中介紹的 Azure Functions 應用程式為基礎。 繼續進行之前,請先完成使用 Azure 應用程式組態建立 Azure Functions 應用程式

在本教學課程中,您會了解如何:

  • 設定您的 Azure Functions 應用程式,使其在應用程式組態存放區發生變更時更新其組態。
  • 將最新的組態插入您的 Azure Functions 呼叫中。

必要條件

從應用程式設定重新載入資料

Azure Functions 支援執行內含式隔離程序。 這兩個模式之間應用程式組態使用方式的主要差異在於重新整理組態的方式。 在內含式模式中,您必須在每個函式中進行呼叫以重新整理組態。 在隔離程序模式中,支援中介軟體。 應用程式組態中介軟體 Microsoft.Azure.AppConfiguration.Functions.Worker 可讓呼叫在執行每個函式之前自動重新整理組態。

  1. 更新連線至應用程式組態的程式碼,並新增資料重新整理條件。

    開啟 Startup.cs,並更新 ConfigureAppConfiguration 方法。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                    // Load all keys that start with `TestApp:` and have no label
                    .Select("TestApp:*")
                    // Configure to reload configuration if the registered sentinel key is modified
                    .ConfigureRefresh(refreshOptions =>
                        refreshOptions.Register("TestApp:Settings:Sentinel", refreshAll: true));
        });
    }
    

    ConfigureRefresh 方法會在應用程式內觸發重新整理時,註冊要檢查是否有變更的設定。 refreshAll 參數會指示應用程式組態提供者在每次已註冊的設定中偵測到變更時,都要重新載入整個設定。

    註冊進行重新整理的所有設定都有 30 秒的預設快取到期時間,之後才會嘗試進行新的重新整理。 您可以呼叫 AzureAppConfigurationRefreshOptions.SetCacheExpiration 方法來更新。

    提示

    更新應用程式組態中的多個索引鍵/值時,通常不希望應用程式在進行所有變更之前重新載入組態。 您可以註冊 Sentinel 索引鍵,並只能所有其他設定變更完成時加以更新。 這有助於確保應用程式中的設定一致性。

    您也可以執行下列動作,將不一致的風險降到最低:

    • 設計您的應用程式為可容忍暫時性的設定不一致
    • 先準備好您的應用程式再將其上線 (服務要求)
    • 讓您的應用程式具備預設設定,並在設定驗證失敗時使用此設定
    • 選擇對應用程式造成最小影響的設定更新策略,例如在低流量的時間點。
  1. 更新 Configure 方法,使 Azure 應用程式組態服務可透過相依性插入來使用。

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
    }
    
  2. 開啟 Function1.cs,並新增下列命名空間。

    using System.Linq;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    更新此函式,透過相依性插入取得 IConfigurationRefresherProvider 的執行個體,您可以從中取得 IConfigurationRefresher 的執行個體。

    private readonly IConfiguration _configuration;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider)
    {
        _configuration = configuration;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  3. 在 Functions 呼叫開始時使用 TryRefreshAsync 方法,以更新重新整理組態的 Run 方法和信號。 如果未達到快取到期時間範圍,這就不會有任何作用。 如果您想要在不封鎖目前函式呼叫的情況下重新整理組態,請移除 await 運算子。 在此情況下,較新的函式呼叫將會取得更新的值。

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync(); 
    
        string keyName = "TestApp:Settings:Message";
        string message = _configuration[keyName];
    
        return message != null
            ? (ActionResult)new OkObjectResult(message)
            : new BadRequestObjectResult($"Please create a key-value with the key '{keyName}' in App Configuration.");
    }
    

在本機測試函式

  1. 設定名為 ConnectionString 的環境變數,並將其設定為應用程式設定存放區的存取金鑰。 如果您使用 Windows 命令提示字元,請執行下列命令,然後重新啟動命令提示字元以讓變更生效:

    setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    如果您使用 Windows PowerShell,請執行下列命令:

    $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

    如果您使用 macOS 或 Linux,請執行下列命令:

    export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. 若要測試您的函式,請按 F5。 如果出現提示,請接受 Visual Studio 所發出要下載及安裝 Azure Functions Core (CLI) 工具的要求。 您可能也需要啟用防火牆例外狀況,工具才能處理 HTTP 要求。

  3. 從 Azure Functions 執行階段輸出複製函式的 URL。

    Quickstart Function debugging in VS

  4. 將 HTTP 要求的 URL 貼到您的瀏覽器位址列。 下圖顯示瀏覽器中對於函式傳回之本機 GET 要求所做出的回應。

    Quickstart Function launch local

  5. 登入 Azure 入口網站。 選取 [所有資源],然後選取您在快速入門中建立的應用程式組態存放區。

  6. 選取 [組態總管],然後更新下列索引鍵的值:

    機碼
    TestApp:Settings:Message Azure 應用程式設定的值 - 已更新

    然後建立 Sentinel 索引鍵;如果值已存在,請修改其值,例如

    機碼
    TestApp:Settings:Sentinel v1
  7. 重新整理瀏覽器數次。 當快取設定在 30 秒後過期時,此頁面將會以更新的值顯示 Functions 呼叫的回應。

    Quickstart Function refresh local

注意

本教學課程中使用的範例程式碼,可從應用程式組態 GitHub 存放庫下載取得。

清除資源

如果您不想繼續使用本文中建立的資源,請刪除在此處建立的資源群組,以避免產生費用。

重要

刪除資源群組是無法回復的動作。 資源群組和其中的所有資源都將被永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您是在包含需保留其他資源的資源群組內部,建立本文的資源,則可以從每個資源各自的窗格中個別刪除每個資源,而不必刪除整個資源群組。

  1. 登入 Azure 入口網站,然後選取 [資源群組]
  2. 在 [依名稱篩選] 方塊中,輸入您資源群組的名稱。
  3. 在結果清單中,選取資源群組名稱以查看概觀。
  4. 選取 [刪除資源群組]
  5. 系統將會要求您確認是否刪除資源群組。 輸入您資源群組的名稱以進行確認,然後選取 [刪除]

不久後,系統便會刪除該資源群組及其所有的資源。

下一步

在本教學課程中,您已啟用 Azure Functions 應用程式,以動態方式從應用程式組態重新整理組態設定。 若要了解如何使用 Azure 受控服務識別來簡化對應用程式組態的存取,請繼續進行下一個教學課程。