你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

外部配置存储模式

将配置信息从应用程序部署包移动到集中位置。 此方法可更轻松地管理和控制配置数据,以及跨应用程序和应用程序实例共享配置数据。

上下文和问题

大多数应用程序运行时环境在随应用程序一起部署的文件中包含配置信息。 在某些情况下,可以编辑这些文件,以在部署应用程序后更改应用程序的行为。 但是,配置更改要求重新部署应用程序。 重新部署通常会导致无法接受的停机时间和其他管理开销。

本地配置文件还会将配置限制为单个应用程序。 在某些情况下,你可能希望跨多个应用程序共享配置设置。 示例包括数据库连接字符串、UI 主题信息以及一组相关应用程序使用的队列和存储的 URL。

在应用程序的多个正在运行的实例中管理对本地配置的更改具有挑战性。 此质询可能会导致在部署更新时使用不同的配置设置的实例。

对应用程序和组件的更新还可能需要更改配置架构。 许多配置系统不支持不同版本的配置信息。

解决方案

将配置信息存储在外部存储中,并提供可用于快速高效地读取和更新配置设置的接口。 外部存储的类型取决于应用程序的托管和运行时环境。 在云托管方案中,外部存储通常是基于云的存储服务或专用配置服务。 它也可能是托管数据库或其他自定义系统。

为配置信息选择的后盾存储应具有提供一致且易于使用的接口。 它应以正确类型化和结构化格式公开信息。 实现还可能需要授权用户访问以保护配置数据。 它可能需要足够灵活,可以存储多个版本的配置,例如开发、过渡和生产,包括每个配置的多个发布版本。

许多内置配置系统在应用程序启动时读取数据,然后将数据缓存在内存中,以提供快速访问并最大程度地降低对应用程序性能的影响。 根据你使用的后盾存储类型和此存储的延迟,你可能希望在外部配置存储中实现缓存机制。 有关详细信息,请参阅 缓存指南。 下图显示了具有可选本地缓存的外部配置存储模式的概述。

显示具有可选本地缓存的外部配置存储模式概述的关系图。

问题和注意事项

在决定如何实现此模式时,请考虑以下几点:

  • 选择提供可接受的性能、高可用性和稳定性的后备存储。 确保可以在应用程序维护和管理过程中备份它。 在云托管应用程序中,使用云存储机制或专用配置平台服务来满足这些要求。

  • 设计后盾存储的架构,以使其可以保存的信息类型具有灵活性。 确保它为所有配置要求提供功能,例如类型化数据、设置集合、多个版本的设置以及应用程序所需的任何其他功能。 当要求发生更改时,架构应易于扩展以支持更多设置。

  • 考虑后盾存储的物理功能、它们与存储配置信息的方式以及性能的影响的关系。 例如,存储包含配置信息的 XML 文档需要配置接口或应用程序来分析文档以读取单个设置。 分析使更新设置的方式复杂化,但缓存设置有助于抵消读取性能变慢的影响。

  • 请考虑配置接口如何允许控制配置设置的范围和继承。 例如,可能需要在组织、应用程序和计算机级别确定配置设置的范围。 配置接口可能需要委托对不同范围的访问的控制,并阻止或允许单个应用程序替代设置。

  • 确保配置接口可以公开所需格式的配置数据,例如类型化值、集合、键值对和属性包。

  • 考虑当设置包含错误或不存在于后盾存储区时,配置存储接口的行为方式。 可能需要还原默认设置和日志错误。 另请考虑配置设置键或名称的区分大小写、如何存储和处理二进制数据,以及如何处理 null 或空值。

  • 请考虑如何保护配置数据,并仅授予对适当用户和应用程序的访问权限。 配置存储接口通常提供此功能,但还需要确保用户和应用程序无法在没有适当权限的情况下直接访问后备存储中的数据。 确保对读取和写入配置数据所需的权限进行严格分隔。 另请考虑是否需要加密部分或全部配置设置,以及如何在配置存储接口中实现此加密。

    还应启用审核日志记录来记录谁读取或修改配置值,以及何时执行这些操作。 对配置数据的任何本地回退副本应用相同的审核要求。

  • 将非敏感配置值与机密分开。 在配置设置中保留例程设置,例如功能标志和终结点。 将机密(如连接字符串、API 密钥、证书和密码)存储在提供加密和控制访问的专用机密管理系统中。

  • 集中存储的配置(在运行时更改应用程序行为)至关重要。 使用用于部署应用程序代码的相同机制部署、更新和管理它们。 例如,必须使用经过完全测试和暂存的部署方法执行可能影响多个应用程序的更改,以确保更改适合使用此配置的所有应用程序。 如果管理员编辑设置以更新一个应用程序,它可能会对使用同一设置的其他应用程序产生不利影响。 Azure 应用程序配置等产品通过内置功能(如修订历史记录、时间点恢复(PITR)、不可变快照和渐进式推出模式来帮助缓解此风险。

  • 如果应用程序缓存配置信息,则需要在配置更改时向应用程序发出警报。 你可以为缓存的配置数据实现过期策略,以便此信息定期自动刷新。 应用程序将看到更改并实现这些更改。

  • 缓存的配置数据可以帮助解决外部配置存储在应用程序运行时遇到的暂时性连接问题,但如果应用程序启动时外部存储关闭,此方法通常无法解决问题。 确保应用程序部署管道可以在配置文件中提供最后一组已知配置值,以在应用程序启动时无法检索实时值时使用。

何时使用此模式

在以下情况下使用此模式:

  • 需要跨多个应用程序或实例共享配置设置,或者跨多个应用程序或实例强制实施标准配置。

  • 标准配置系统不支持所有必需的设置类型,例如图像或复杂数据结构。

  • 需要一些设置的补充存储,同时允许应用程序替代部分或全部集中存储的值。

  • 需要通过记录对配置存储的访问权限来简化跨多个应用程序的管理,并选择性地监视配置使用情况。

在以下情况下,此模式可能不适用:

  • 配置简单、本地到一个应用程序,仅在正常发布周期期间更改。 在这种情况下,外部配置存储可能会增加不必要的操作复杂性。

工作负载设计

评估如何在工作负荷设计中使用外部配置存储模式来解决 Azure Well-Architected Framework 支柱中涵盖的目标和原则。 下表提供有关此模式如何支持每个支柱目标的指南。

支柱 此模式如何支持支柱目标
卓越运营有助于通过标准化流程和团队凝聚力来实现工作负荷质量 应用程序配置与应用程序代码的这种分离支持特定于环境的配置,并将版本控制应用于配置值。 外部配置存储也是管理功能标志以实现安全部署做法的一个常见位置。

- OE:10 自动化设计
- OE:11 安全部署实践

如果此模式在某个支柱中引入权衡取舍,请将它们与其他支柱的目标进行对比。

Example

以下示例演示如何在 Azure 中实现外部配置存储模式。 第一个示例使用应用配置和客户端库。 第二个示例对需要专用实现的方案使用自定义后盾存储。

应用程序配置

大多数应用程序都可以使用 应用配置 而不是自定义配置存储。 应用配置支持可向其应用命名空间的 键值对 。 应用配置还支持 配置的不可变快照 ,以便可以检查、回滚或逐步部署配置更改,而不会对运行实例造成风险。

使用 快照引用 让应用程序在运行时的快照之间切换,而无需更改或重新部署代码。 可以导出配置值,以便在应用程序启动时无法访问服务时,副本随应用程序一起作为备份使用。

在应用配置中, 是 Unicode 字符串,每个键值对都有可选的元数据,例如 基于标签的变体内容类型。 使用内容类型描述应用程序应如何解释值,例如在 JSON 中或内置应用配置类型中。 应用配置还 保留 PITR 的修订历史记录,这有助于查看和恢复以前的键值对。

若要实现复原能力,请在支持 可用性区域的 区域中预配存储,并启用 异地复制 ,以便可以将应用程序配置为从最近的副本读取,并在区域中断期间在副本终结点之间切换。 使用 Azure 密钥保管库 引用将机密保存在密钥保管库中,并从应用配置中引用机密,而不是直接在配置存储中存储凭据。 使用 托管标识和Azure基于角色的访问控制(Azure RBAC)而不是连接字符串对应用程序进行身份验证。

对于在 Azure Kubernetes 服务 (AKS) 中运行的工作负荷,App Configuration Kubernetes 提供程序可以直接从存储生成 ConfigMap 和机密,而无需更改工作负载容器中的代码。 还可以在安全部署实践中使用应用配置来管理功能标志,包括有针对性的推出和基于变体的试验。

对于网络隔离,请使用应用配置终结点,以便客户端流量通过Azure 专用链接保留在专用 IP 地址上。 设置专用访问后,可以 关闭公共访问 以减少公共终结点公开。 在异地复制的部署中,单个专用终结点可以访问所有副本,但为了提高区域复原能力,可以为每个副本区域预配专用终结点,并相应地设置域名系统(DNS)。

A 关系图显示了一个示例外部配置存储模式实现,其中应用配置是连接到多个Azure服务和存储系统的中心中心。

客户端库

客户端库提供上述许多功能。 客户端库与应用程序运行时集成,以帮助提取和缓存值、在更改值时刷新值,以及处理应用配置中的暂时性中断。

运行时 客户端库 备注 快速入门
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Microsoft.Extensions.Configuration 提供程序 适用于 .NET 的快速入门
ASP.NET Core Microsoft.Azure.AppConfiguration.AspNetCore 为 ASP.NET Core添加请求驱动的刷新中间件 适用于 ASP.NET CoreQuickstart>
.NET 中的Azure Functions Microsoft.Azure.AppConfiguration.Functions.Worker 使用的独立辅助角色模型的提供程序 Program.cs 适用于 Azure FunctionsQuickstart>
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration 配置生成器 System.Configuration 适用于 .NET Framework 的 Quickstart
Java Spring(Spring框架) com.azure.spring > azure-spring-cloud-appconfiguration-config 支持通过 访问 Spring Framework 适用于 Java Spring 的 Quickstart
Python Azure 应用配置提供程序 提供动态刷新和密钥保管库参考支持的提供程序库 适用于 Python 的快速入门
JavaScript 和 Node.js @azure/app-configuration-provider (Azure 应用程序配置提供者) 提供动态刷新和密钥保管库参考支持的提供程序库 适用于 JavaScript 的快速入门

以下 App 配置同步 GitHub操作和内置Azure Pipelines任务也可用:

自定义后盾存储示例

在Azure主机的应用程序中,可以使用Azure 存储在外部存储配置信息。 此方法提供复原能力和高性能。 默认情况下,存储在单个数据中心内复制数据三次。 对于跨区域的异地冗余,可以使用手动故障转移功能设置异地复制。 Azure 表存储提供了一个键值存储,可以使用灵活的架构来存储这些值。 Azure Blob 存储提供分层的基于容器的存储,该存储可以保存单独命名 Blob 中的任何类型的数据。

实现此模式时,需要抽象化Blob 存储并在应用程序中公开设置。 还需要在运行时检查更新,并决定如何响应这些更新。

以下示例演示如何使用简单的配置存储和Blob 存储来存储和公开配置信息。 BlobSettingsStore 类抽象化用于保存配置信息的Blob 存储。 它实现一 ISettingsStore 个简单的接口。

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

此接口定义用于检索配置存储保留的配置设置的方法,并包括可用于检测最近配置设置修改的版本号。 类 BlobSettingsStore 可以使用 ETag Blob 的属性来实现版本控制。 每次写入 Blob 时,属性 ETag 都会自动更新。

注释

根据设计,此简单插图将所有配置设置公开为字符串值,而不是类型化值。

ExternalConfigurationManager 提供实例周围的 BlobSettingsStore 包装器。 应用程序可以使用此类来检索配置信息。 此类可以使用更改通知机制(如 Microsoft 反应扩展)在系统运行时发布配置更新。 它还为设置实现 Cache-Aside 模式 ,以提供更好的复原能力和性能。

以下示例演示如何实现类 ExternalConfigurationManager

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

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

后续步骤