功能旗幟
在第 1 章中,我們確認雲端原生與速度和靈活度有關。 使用者期待快速回應、創新功能和零停機時間。 Feature flags
是一種新式部署技術,可協助提高雲端原生應用程式的靈活度。 可讓您將新功能部署到實際執行環境,但是會限制其可用性。 透過切換,您可以為特定使用者啟動新功能,而不需重新啟動應用程式或部署新的程式碼。 會將新功能的發行與程式碼部署分開。
功能旗標是以條件式邏輯為基礎所建置,可在執行階段控制使用者的功能可見度。 在新式雲端原生系統中,通常會提早將新功能部署到實際執行環境,但是以有限的對象進行測試。 隨著信賴度增加,此功能可以累加方式推出給更廣泛的對象。
功能旗標的其他使用案例包括:
- 將進階功能限定給願意支付較高訂閱費用的特定客戶群組。
- 藉由快速停用問題功能來穩定系統,避免復原或立即 Hotfix 的風險。
- 在尖峰使用期間停用具有高資源耗用量的選擇性功能。
- 對小型使用者區段進行
experimental feature releases
,以驗證可行性和熱門程度。
功能旗標也會提升 trunk-based
開發。 其為原始檔控制分支模型,開發人員可在單一分支中對功能共同作業。 此方法可將大量長時間執行功能分支合併的風險和複雜度降到最低。 在啟用之前,無法使用功能。
實作功能旗標
功能旗標的核心是簡單 decision object
的參考。 會傳回 on
或 off
的布林值狀態。 旗標通常會包裝封裝功能的程式碼區塊。 旗標的狀態會判斷該程式碼區塊是否為指定使用者執行。 圖 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
。 您可以重新建構任何索引鍵/值的歷程記錄,並提供其在過去七天內任何時間的過去值。