共用方式為


功能標幟

小提示

此內容摘錄自適用於 Azure 的電子書《架構雲端原生 .NET 應用程式》,該書可在 .NET Docs 上閱讀,或以 PDF 格式免費下載並離線閱讀。

Azure 電子書的雲端原生 .NET 應用程式封面縮圖。

在第 1 章中,我們確認雲端原生主要在於速度和敏捷性。 用戶預期快速回應性、創新功能和零停機時間。 Feature flags 是新式部署技術,可協助提高雲端原生應用程式的靈活度。 它們可讓您將新功能部署到生產環境,但會限制其可用性。 透過切換動作,您可以為特定使用者啟用新功能,而不需重新啟動應用程式或部署新的程序代碼。 它們會將新功能的發行與其程序代碼部署分開。

功能旗標是以條件式邏輯為基礎所建置,可控制運行時間使用者功能可見度。 在現代雲端原生系統中,通常會提早將新功能部署到生產環境,但以有限的對象進行測試。 隨著信心的增加,此功能可以逐步地推出給更廣泛的受眾。

功能旗標的其他使用案例包括:

  • 將進階功能限制為願意支付較高訂用帳戶費用的特定客戶群組。
  • 藉由快速停用問題功能來穩定系統,避免復原或立即 Hotfix 的風險。
  • 在尖峰使用期間停用具有高資源耗用量的選擇性功能。
  • 對小型使用者區段進行 experimental feature releases ,以驗證可行性和受歡迎程度。

功能標記也會促進 trunk-based 開發。 這是一種源代碼管理分支模型,在此模型中,開發人員在單一分支上共同協作進行功能開發。 此方法可將大量長時間執行的功能分支合併的風險和複雜度降到最低。 在啟用之前,無法使用功能。

實作功能旗標

功能旗標的核心是對簡單decision object的引用。 它會傳回 onoff 的布爾值狀態。 旗標通常會包裝封裝功能的程式代碼區塊。 旗標的狀態會判斷該程式碼區塊是否針對指定的用戶執行。 圖 10-11 顯示實作。

if (featureFlag) {
    // Run this code block if the featureFlag value is true
} else {
    // Run this code block if the featureFlag value is false
}

圖 10-11 - 簡單功能旗標實作。

請注意此方法如何分隔決策邏輯與功能程序代碼。

在第 1 章中,我們討論了 Twelve-Factor App。 指導建議將組態設定保留在應用程式可執行代碼之外。 如有需要,可以從外部來源讀取設定。 功能旗標組態值也應該與其程式代碼基底無關。 藉由在個別存放庫中外部化旗標組態,您可以變更旗標狀態,而不需修改和重新部署應用程式。

Azure 應用程式組態 提供功能旗標的集中式存放庫。 透過此功能,您可以定義不同類型的特色標誌,並快速且可靠地管理它們的狀態。 您會將應用程式組態用戶端連結庫新增至應用程式,以啟用功能旗標功能。 支援各種程式設計語言架構。

功能旗標可以輕鬆地在 ASP.NET Core 服務中實作。 安裝 .NET 功能管理連結庫和應用程式組態提供者可讓您以宣告方式將功能旗標新增至程序代碼。 它們會啟用 FeatureGate 屬性,讓您不必在程式碼基底上手動撰寫 if 語句。

在 Startup 類別中設定之後,您可以在控制器、動作或中間件層級新增功能旗標功能。 圖 10-12 顯示控制器和動作實作:

[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
    ...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
    return ObjectResult(ProductDto);
}

圖 10-12 - 控制器和動作中的功能旗標實作。

如果停用功能旗標,使用者將會收到 404(找不到)狀態代碼,且沒有回應內容。

功能旗標也可以直接插入 C# 類別。 圖 10-13 顯示功能旗標插入:

public class ProductController : Controller
{
    private readonly IFeatureManager _featureManager;

    public ProductController(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }
}

圖 10-13 - 功能旗標插入類別。

功能管理連結庫會管理幕後的功能旗標生命週期。 例如,若要將對設定儲存庫的大量呼叫降到最低,程式庫會快取旗標狀態以指定的時間持續。 它們可以保證在要求呼叫期間旗標狀態不變。 它們也會提供 Point-in-time snapshot。 您可以重建任何鍵值的歷程,並在過去七天內的任何時刻提供其歷史數值。