檢閱應用程式設定概念
針對分散式環境建立微服務會帶來重大的挑戰。 雲端裝載的微服務通常會在位於不同區域的多個容器中執行。 實作能將每個服務的程式碼從設定中分離的解決方案,以簡化在所有環境上對問題進行分級的工作。
在本單元中,探索如何將 ASP.NET Core 和 Docker 設定功能與 Azure 應用程式組態整合,來有效地解決這個挑戰。
您將檢閱:
- ASP.NET Core 設定基礎結構。
- Kubernetes 設定抽象概念 — ConfigMap。
- Azure 應用程式組態服務。
- .NET 功能管理程式庫。
- 應用程式中實作的功能旗標元件。
ASP.NET Core 設定
ASP.NET Core 專案中的設定包含在一或多個 .NET 設定提供者 內。 設定提供者是針對特定設定來源的抽象概念,例如 JSON 檔案。 設定來源的值會以機碼值組的集合表示。
ASP.NET Core 應用程式可以註冊多個設定提供者,以從各種不同的來源讀取設定。 使用預設的應用程式主機時,會自動註冊數個設定提供者。 下列設定來源會以所列順序提供:
- JSON 檔案 (appsettings.json)
- JSON 檔案 (appsettings.{environment}.json)
- 使用者祕密
- 環境變數
- 命令列
每個設定提供者都可以貢獻自己的機碼值。 此外,針對在註冊順序中排列較前之提供者的值,任何後續的提供者都可加以覆寫。 以上述清單中的註冊順序為例,UseFeatureManagement
命令列參數會覆寫 UseFeatureManagement
環境變數。 同樣地,appsettings.json 內的 UseFeatureManagement
機碼可以由儲存在 appsettings.Development.json 中的 UseFeatureManagement
機碼加以覆寫。
設定機碼名稱可以描述階層。 例如,標記法 eShop:Store:SeasonalSale 是指 eShop 應用程式市集微服務內的 SeasonalSale 功能。 此結構也可以將設定值對應到物件圖或陣列。
重要
某些平台不支援在環境變數名稱中使用冒號。 為了確保跨平台相容性,會使用雙底線 (__
) 取代冒號 (:
) 來將機碼分隔。 例如,eShop__Store__SeasonalSale
是 eShop:Store:SeasonalSale
的跨平台對等標記法。
ASP.NET Core 會使用 ConfigurationBinder 來將設定值對應到物件與陣列。 針對機碼名稱的對應會以不區分大小寫的方式進行。 例如,ConnectionString
和 connectionstring
會視為對等機碼。 如需詳細資訊,請參閱機碼和值。
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
檔案程式碼片段會定義:
- 儲存在 YAML 檔案
environment
區段中的變數,如上述程式碼片段中所醒目提示。 - 以環境變數的形式呈現給容器化應用程式。
- 在微服務應用程式中保存 .NET 設定值的機制。
環境變數是跨平台機制,用來為裝載在 Docker 容器中的應用程式提供執行階段設定。
Azure 應用程式設定
集中式的設定服務在微服務應用程式與其他分散式應用程式中特別有用。 此課程模組會介紹 Azure 應用程式組態作為用來集中管理設定值的服務,特別是用於功能旗標。 此服務可簡化針對為應用程式部署設定所導致錯誤的疑難排解工作。
應用程式組態是完全受控服務,其能針對待用及傳輸中的機碼值進行加密。 使用其所儲存的設定值可以即時更新,而不需要重新部署或重新啟動應用程式。
在 ASP.NET Core 應用程式中,Azure 應用程式組態會註冊為設定提供者。 除了提供者註冊之外,應用程式將不會知道應用程式組態存放區的存在。 可以透過 .NET 的設定抽象概念,也就是 IConfiguration
介面來從其中擷取設定值。
功能管理程式庫
「功能管理」程式庫能提供標準化的 .NET API,以供在應用程式內管理功能旗標。 程式庫是以名為 Microsoft.FeatureManagement
與 Microsoft.FeatureManagement.AspNetCore
兩種不同套件的形式透過 NuGet 進行散發。 後者套件會提供標籤協助程式,以用於 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 專案中,您可以分析 ConfigureAppConfiguration
內的 configBuilder.Sources
屬性來存取已註冊提供者的清單。