App Configuration 補充筆記

  • 233
  • 0

針對 App Configuration 主題還有一些在之前文章主題之外的一些補充筆記。主要有兩個補充的部分,一個是針對設定自動重新重整新設定,另一個是在「使用 App Configuration 的 Feature manager 功能來實做 Feature Toggle/Flag 機制」主要說明都是使用到內建的 Filter,如果是完全自訂的話就要另外實做自訂的 Filter 來使用。

實做

設定重新整理參數

在程式如果沒有特別設定,就只會在程式執行的時候去讀取 App Configuration,這樣在 ASP.Net 程式的時候假設修改參數,就得重新啟用站台而導致網站會暫時中斷,這時候就可已設定註冊監控一個參數,當參數值有變化的時候,程式就會重新讀取參數了,而只設定一個參數的好處是當我們有修改多個參數的時候,可能有些會有相依性,就可以在全部都調整好之後,最後再設定監控的參數值來觸發重新讀取全部參數,避免參數還沒完全調整完導致程式產生錯誤。

首先新增一個參數 Version 作為程式版號以及監控參數的值,這樣就可以在程式佈版完成之後設定新的版號來觸發重新讀取參數。

接下來在 Program.cs 連接設定的地方透過加上 ConfigureRefresh 這個設定值來設定監控和快取的時間。

builder.Host.ConfigureAppConfiguration(builder =>
            {
                builder.AddAzureAppConfiguration(options => options
                    .Connect(appConfigConnectionString)
                    .ConfigureRefresh(refreshOptions =>
                    {
                        refreshOptions.Register("Version", refreshAll: true);
                        refreshOptions.SetCacheExpiration(TimeSpan.FromSeconds(1));
                    })
                    .UseFeatureFlags());
            });

底下這一行就是設定要監控的參數,並且設定當有變動的時候就全部參數都重新讀取。

refreshOptions.Register("Version", refreshAll: true);

另一航程式則為設定參數快取的時間,預設是 30 秒,每隔 30 秒就會去確認監控的參數是否有更新,底下範例則為設定為每秒,但是不建議設定時間這麼短,因為會讓程式讀取參數頻率變高,而費用計算又是用呼叫次數,這樣就容易產生較高的費用。

refreshOptions.SetCacheExpiration(TimeSpan.FromSeconds(1));

如果前面沒有注入 AzureAppConfiguration 的話也要加上去。

builder.Services.AddAzureAppConfiguration();

後面也要加上使用 AzureAppConfiguration 的 Middleware。

app.UseAzureAppConfiguration();

這樣就都設定好了,之後需要觸發重新讀取參數的時候只要去修改 Version 的值就可以了。

自訂 FeatureFilter

假設內建的 FeatureFilter 還是不夠我們使用,想要有更大的彈性來使用,就可以完全的來自訂 FeatureFilter,首先新增一個 Feature,並在 FeatureFilter 選擇 Custom,並且設定一個參數名稱為 Para1。

接下來新增一個 CustomFeatureFilter 並且繼承 IFeatureFilter,接下來實做 EvaluateAsync 方法,簡單的去讀取參數並且判斷值是特定的字串,最後回傳是否啟用的 bool 參數即可。

[FilterAlias("AnYunCustom")]
public class CustomFeatureFilter : IFeatureFilter
{
    public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext context)
    {
        var isEnabled = false;
        var para1 = context.Parameters.GetValue<string>("Para1");

        if (para1 == "AnYun")
            isEnabled = true;

        return Task.FromResult(isEnabled);
    }
}

接下來在 Program.cs 中設定注入。

builder.Services.AddFeatureManagement().AddFeatureFilter<CustomFeatureFilter>();

這樣在程式裡面就可以使用這一個 FeatureFilter 了。

其它 Controller 和 View 的修改就和前面文章介紹一樣,可就不多做說明,可以到 GitHub 看完整範例。

結論

陸續寫了好幾篇的 App Configuration 主題,應該把主要實務上常會用到的功能跟情境都介紹了,剩下就是看需求來使用這一個 Azure 好用的服務了。

參考資料