外部組態存放區模式

Azure 應用程式組態
Azure Blob 儲存體

將組態資訊從應用程式部署套件移至集中式位置。 這可以提供更容易管理和控制設定數據的機會,以及跨應用程式和應用程式實例共用設定數據的機會。

內容和問題

大部分的應用程式運行時間環境都包含在與應用程式一起部署的檔案中保留的組態資訊。 在某些情況下,您可以編輯這些檔案,以在部署應用程式之後變更應用程序行為。 不過,對設定所做的變更需要重新部署應用程式,通常會導致無法接受的停機時間和其他系統管理負荷。

本機組態檔也會將組態限制為單一應用程式,但有時在多個應用程式之間共用組態設定會很有用。 範例包括資料庫連接字串、UI 佈景主題資訊,或一組相關應用程式所使用的佇列與儲存體 URL。

跨多個執行中的應用程式執行個體來管理本機設定變更是極具挑戰的,特別是雲端主控的案例。 它可能會導致在部署更新之際,執行個體會使用不同的組態設定。

此外,應用程式和元件的更新可能需要變更元件架構。 許多設定系統不支援不同版本的設定資訊。

解決方案

將組態資訊儲存在外部記憶體中,並提供介面,可用來快速且有效率地讀取和更新組態設定。 外部存放區的類型取決於應用程式的裝載和執行階段環境。 在雲端裝載的案例中,通常是雲端式記憶體服務或專用組態服務,但可能是裝載的資料庫或其他自定義系統。

您為設定資訊選擇的備份存放區,應具有存取方式一致且易於使用的介面。 它應該以正確型別和結構化的格式來公開資訊。 實作可能也需要授權使用者的存取權,才能保護組態數據,並具有足夠的彈性,以允許儲存多個版本的組態(例如開發、預備或生產環境,包括每個版本的多個版本)。

許多內建組態系統會在應用程式啟動時讀取數據,並快取記憶體中的數據以提供快速存取,並將對應用程式效能的影響降到最低。 根據所使用的備份存放區類型,以及此存放區的延遲,在外部組態存放區內實作快取機制可能很有説明。 如需詳細資訊,請參閱快 取指引。 此圖概要說明具有選擇性本機快取的外部設定存放區模式。

具有選擇性本機快取的外部組態存放區模式概觀

問題和考慮

決定如何實作此模式時,請考慮下列幾點:

選擇支援存放區,以提供可接受的效能、高可用性、強固性,並可備份為應用程式維護和管理程式的一部分。 在雲端裝載的應用程式中,使用雲端儲存機制或專用組態平臺服務通常是符合這些需求的好選擇。

設計備份存放區的架構,以在可以保存的信息類型中提供彈性。 請確定它提供所有組態需求,例如具類型的數據、設定集合、多個設定版本,以及應用程式使用它所需的任何其他功能。 架構應該很容易擴充,以在需求變更時支援其他設定。

請考慮備份存放區的實體功能、它與儲存組態資訊的方式以及效能的影響有關。 例如,儲存包含組態資訊的 XML 檔需要組態介面或應用程式來剖析檔,才能讀取個別的設定。 這會讓更新設定變得更複雜,不過快取設定有助於抵消較慢的讀取效能。

請考慮組態介面如何允許控制組態設定的範圍和繼承。 例如,可能需要在組織、應用程式和計算機層級設定設定範圍。 它可能需要支援對不同範圍的存取權委派,以及防止或允許個別應用程式覆寫設定。

請確定組態介面可以使用所需的格式公開組態數據,例如具類型的值、集合、索引鍵/值組或屬性包。

請考慮當設定包含錯誤或不存在於備份存放區時,組態存放區介面的行為。 可能適合傳回預設設定和記錄錯誤。 也請考慮設定索引鍵或名稱的區分大小寫、二進位數據的儲存和處理,以及處理 Null 或空白值的方式等層面。

請考慮如何保護組態數據,以只允許存取適當的用戶和應用程式。 這可能是組態存放區介面的功能,但也必須確保備份存放區中的數據無法直接存取,而不需要適當的許可權。 確保嚴格區分讀取和寫入組態數據所需的許可權。 也請考慮您是否需要加密部分或所有組態設定,以及如何在組態存放區介面中實作此設定。

在運行時間期間變更應用程序行為的集中儲存組態非常重要,而且應該使用部署應用程式程式代碼相同的機制來部署、更新及管理。 例如,必須使用完整測試和分段部署方法來執行可能會影響多個應用程式的變更,以確保變更適用於使用此組態的所有應用程式。 如果系統管理員編輯設定以更新一個應用程式,可能會對其他使用相同的設定的應用程式造成負面影響。

如果應用程式快取組態資訊,則如果設定變更,應用程式必須發出警示。 您可以透過快取的組態數據實作到期原則,以便定期自動重新整理這項資訊,以及挑選任何變更(並採取行動)。

雖然快取設定數據有助於解決應用程式運行時間外部組態存放區暫時性連線問題,但如果應用程式第一次啟動時,外部存放區關閉,通常無法解決問題。 如果您的應用程式啟動時無法擷取即時值,請確定您的應用程式部署管線可以提供組態檔中最後一組已知的組態值作為後援。

使用此模式的時機

此模式適用於:

  • 在多個應用程式和應用程式實例之間共用的組態設定,或必須在多個應用程式和應用程式實例之間強制執行標準組態。

  • 不支援所有必要組態設定的標準組態系統,例如儲存映像或複雜數據類型。

  • 做為應用程式某些設定的互補存放區,或許允許應用程式覆寫部分或所有集中儲存的設定。

  • 為了簡化多個應用程式的管理,並選擇性地記錄部分或所有類型的組態存放區存取,以監視組態設定的使用方式。

工作負載設計

架構設計人員應該評估外部組態存放區模式如何用於其工作負載的設計,以解決 Azure 架構良好架構支柱涵蓋的目標和原則。 例如:

要素 此模式如何支援支柱目標
營運卓越可透過標準化的流程和小組凝聚力,協助提供工作負載品質 應用程式組態與應用程式程式代碼的分離支援環境特定設定,並將版本設定套用至組態值。 外部組態存放區也是管理功能旗標以啟用安全部署做法的常見位置。

- OE:10 自動化設計
- OE:11 保管庫 部署做法

如同任何設計決策,請考慮對其他可能以此模式導入之目標的任何取捨。

自訂備份儲存區範例

在 Microsoft Azure 託管應用程式中,外部儲存組態資訊的可能選擇是使用 Azure 儲存體。 這是具復原性、提供高效能,而且會使用自動故障轉移來復寫三次以提供高可用性。 Azure 資料表記憶體提供索引鍵/值存放區,讓您能夠針對這些值使用彈性架構。 Azure Blob 記憶體提供階層式容器型存放區,可在個別命名的 Blob 中保存任何類型的數據。

實作此模式時,您必須負責擷取 Azure Blob 記憶體,並在應用程式內公開您的設定,包括檢查運行時間的更新,以及解決如何回應這些更新。

下列範例示範如何透過 Blob 記憶體來設想簡化的組態存放區,以儲存和公開組態資訊。 類別 BlobSettingsStore 可以抽象化 Blob 記憶體來保存組態資訊,並實作簡單的 ISettingsStore 介面。

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

此介面會定義擷取組態存放區中保留的組態設定的方法,並包含可用來偵測最近是否修改任何組態設定的版本號碼。 類別 BlobSettingsStore 可以使用 ETag Blob 的 屬性來實作版本控制。 ETag屬性會在每次寫入 Blob 時自動更新。

根據設計,這個簡單的圖例會將所有組態設定公開為字串值,而不是具類型的值。

然後,類別 ExternalConfigurationManager 可以提供 實例周圍的 BlobSettingsStore 包裝函式。 應用程式可以使用這個類別來擷取組態資訊。 此類別可能會使用類似 Microsoft 回應式擴充功能的內容,在系統執行時發佈對設定所做的任何變更。 它也會負責實作設定的 Cache-Aside 模式 ,以提供新增的復原能力和效能。

使用方式可能如下所示。

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
    …
}

使用 Azure 應用程式組態

雖然在某些情況下可能需要建置自定義組態存放區,但許多應用程式可以改用 Azure 應用程式組態。 Azure 應用程式組態 支援可命名空間的索引鍵/值組。 索引鍵會輸入並個別設定版本。 Azure 應用程式組態 也支援設定的時間點快照集,以便您可以輕鬆地檢查或甚至回復到先前的設定值。 您可以匯出組態值,讓設定複本可以隨附於您的應用程式,以防應用程式啟動時無法連線到服務。

用戶端程式庫

其中許多功能都是透過用戶端連結庫公開的,這些連結庫會與應用程式運行時間整合,以利擷取和快取值、重新整理變更值,甚至處理 應用程式組態 服務的暫時性中斷。

執行階段 用戶端程式庫 備註 快速入門
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration 提供者 Microsoft.Extensions.Configuration 快速入門
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore 提供者 Microsoft.Extensions.Configuration 快速入門
.NET 中的 Azure Functions Microsoft.Extensions.Configuration.AzureAppConfiguration 與 Azure 函式擴充功能搭配使用,以支援 Startup.cs 快速入門
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration 的組態產生器 System.Configuration 快速入門
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config 支援透過 Spring Framework 存取 ConfigurationProperties 快速入門
Python azure.appconfiguration 提供 AzureAppConfigurationClient 快速入門
JavaScript/Node.js @azure/app-configuration 提供 AppConfigurationClient 快速入門

除了客戶端連結庫之外,還有 Azure 應用程式組態 同步 GitHub Action 和 Azure 應用程式組態 Pull & Azure 應用程式組態 Push Azure DevOps 工作,以將設定步驟整合到建置程式中。

下一步