共用方式為


功能旗幟

提示

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

Cloud Native .NET apps for Azure eBook cover thumbnail.

在第 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 應用程式組態為功能旗標提供集中式存放庫。 您可以使用 Azure 應用程式組態來定義不同類型的功能旗標,並放心地快速操作其狀態。 您可以將應用程式組態用戶端程式庫新增至應用程式,以啟用功能旗標功能。 支援各種程式設計語言架構。

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

在啟動類別中設定之後,您可以在控制器、動作或中介軟體層級新增功能旗標功能。 圖 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。 您可以重新建構任何索引鍵/值的歷程記錄,並提供其在過去七天內任何時間的過去值。