檢閱應用程式設定概念

已完成

為分散式環境建立微服務是一項重大挑戰。 雲端裝載的微服務通常會在各種區域中的多個容器中執行。 實作將每個服務程式代碼與組態分開的解決方案,可簡化跨所有環境的問題分級。

在此單元中,探索如何將 ASP.NET Core 和 Docker 組態功能與 Azure 應用程式組態整合,以有效的方式解決這項挑戰。

您將檢閱:

  • ASP.NET 核心組態基礎結構。
  • Kubernetes 組態抽象概念: ConfigMap。
  • Azure 應用程式組態服務。
  • .NET 功能管理連結庫。
  • 在應用程式中實作的功能旗標元件。

ASP.NET 核心組態

ASP.NET Core 專案中的組態包含在一或多個 .NET 組態提供者中。 組 態提供者 是特定組態來源的抽象概念,例如 JSON 檔案。 組態來源的值會以索引鍵/值組的集合表示。

ASP.NET Core 應用程式可以註冊多個組態提供者,以讀取各種來源的設定。 使用預設應用程式主機時,會自動註冊數個設定提供者。 下列組態來源會依列出的順序提供:

  1. JSON 檔案 (appsettings.json
  2. JSON 檔案 (appsettings.{environment}.json
  3. 使用者秘密
  4. 環境變數
  5. 命令列

每個設定提供者都可以貢獻自己的索引鍵值。 此外,任何提供者都可以覆寫先前在鏈結中註冊的提供者的值,而不是本身。 鑒於上述清單中的註冊順序, UseFeatureManagement 命令行參數會 UseFeatureManagement 覆寫環境變數。 同樣地, UseFeatureManagement 中的索引鍵 appsettings.json 也可以由 UseFeatureManagement 儲存在 中的 appsettings.Development.json密鑰覆寫。

組態索引鍵名稱可以描述階層。 例如,表示法 eShop:Store:SeasonalSale 是指 eShop 應用程式市集微服務內的SeasonalSale 功能。 這個結構也可以將組態值對應至物件圖形或 陣列

這很重要

某些平台不支持環境變數名稱中的冒號。 為了確保跨平臺相容性,會使用雙底線 (__) 而不是冒號 (:) 來分隔索引鍵。 例如, eShop__Store__SeasonalSale 是的 eShop:Store:SeasonalSale跨平臺對等表示法。

ASP.NET Core 會使用 ConfigurationBinder 將組態值對應至物件和陣列。 索引鍵名稱的對應會以不區分大小寫的方式發生。 例如,ConnectionStringconnectionstring 會視為對等機碼。 如需詳細資訊,請參閱 索引鍵和值

Docker 組態

在 Docker 中,以索引鍵/值組集合方式處理組態的一個抽象概念是容器 YAML 檔案的環境變數區段。 下列代碼段是應用程式檔案的 docker-compose.yml 摘錄:

services: 

  frontend:
    image: storeimage
    build:
      context: .
      dockerfile: DockerfileStore
    environment: 
      - ProductEndpoint=http://backend:8080
      - ConnectionStrings:AppConfig=Endpoint=https://eshop-app-features.azconfig.io;Id=<ID>;Secret=<SECRET>
    ports:
      - "32000:8080"
    depends_on: 
      - backend

檔案代碼段會定義:

  • 儲存在 environment YAML 檔案區段中的變數,如上述代碼段所醒目提示。
  • 以環境變數的形式呈現給容器化應用程式。
  • 在微服務應用程式中保存 .NET 組態值的機制。

環境變數是一種跨平台機制,可提供運行時間設定給裝載在 Docker 容器中的應用程式。

Azure 應用程式組態

集中式設定服務在微服務應用程式和其他分散式應用程式中特別有用。 本課程模組介紹 Azure 應用程式組態即服務,以集中管理組態值,特別是功能旗標。 此服務可簡化使用應用程式部署設定時所發生的錯誤疑難解答。

應用程式組態是一項完全受控的服務,可加密待用和傳輸中的密鑰值。 儲存的組態值可以即時更新,而不需要重新部署或重新啟動應用程式。

在 ASP.NET Core 應用程式中,Azure 應用程式組態會註冊為設定提供者。 除了提供者註冊之外,應用程式還不知道應用程式組態存放區。 您可以透過 從中擷取組態值。NET 的組態抽象概念— IConfiguration 介面。

功能管理連結庫

功能管理連結庫提供標準化的 .NET API,用於管理應用程式內的功能旗標。 連結庫會透過 NuGet 散發,形式為名為 和Microsoft.FeatureManagement.AspNetCore的兩個不同套件Microsoft.FeatureManagement。 後者套件提供標籤協助程式,以用於 ASP.NET Core 專案的 Razor 檔案。 當不需要標籤協助程式或未搭配 ASP.NET Core 專案使用時,前一個套件就已足夠。

連結庫建置在之上 IConfiguration。 因此,它與任何 .NET 組態提供者相容,包括 Azure 應用程式組態的提供者。 因為連結庫與 Azure 應用程式組態分離,因此可以透過組態提供者整合這兩者。 將此連結庫與 Azure 應用程式組態結合,可讓您動態切換功能,而不需要實作支援的基礎結構。

與 Azure 應用程式組態整合

若要瞭解 Azure 應用程式組態與功能管理連結庫的整合,請參閱 ASP.NET Core 專案檔案中的 Program.cs 下列摘錄:

string connectionString = builder.Configuration.GetConnectionString("AppConfig");

// Load configuration from Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options => {
  options.Connect(connectionString)
    .UseFeatureFlags();
});

在上述代碼段中:

  • 呼叫應用程式的 builder.Configuration 方法,以註冊 Azure 應用程式組態存放區的設定提供者。 組態提供者是透過 對 AddAzureAppConfiguration的呼叫來註冊。
  • Azure 應用程式組態提供者的行為會使用下列選項進行設定:
    • 透過傳遞至方法呼叫的 Connect 連接字串向對應的 Azure 服務進行驗證。 連接字串是從變數擷 connectionString 取。 已註冊的組態來源可透過 builder.Configuration取得。
    • 透過呼叫 UseFeatureFlags啟用功能旗標支援。
  • Azure 應用程式組態提供者會取代所有其他已註冊的設定提供者,因為它會在任何其他設定提供者之後註冊。

小提示

在 ASP.NET Core 專案中,您可以藉由分析 configBuilder.Sources 中的 ConfigureAppConfiguration屬性來存取已註冊的提供者清單。