Шаблон внешнего хранилища конфигураций

конфигурация приложения Azure;
хранилище BLOB-объектов Azure

Переместите сведения о конфигурации из пакета развертывания приложения в централизованное расположение. Это может помочь упростить управление данными конфигурации, а также обмен данными конфигурации между приложениями и экземплярами приложений.

Контекст и проблема

В большинстве сред выполнения приложения содержатся сведения о конфигурации, которые хранятся в файлах, развернутых с этим приложением. В некоторых случаях можно изменить эти файлы, чтобы повлиять на поведение приложения после его развертывания. Однако изменения в конфигурации требуют повторного развертывания приложения, что часто приводит к неприемлемому простою и другим административным издержкам.

Локальные файлы конфигурации также ограничивают конфигурацию для одного приложения, но иногда могут быть полезными для совместного использования параметров конфигурации несколькими приложениями. В примерах содержатся строки подключения к базе данных, сведения о теме пользовательского интерфейса, а также URL-адреса очередей и хранилища, используемые связанным набором приложений.

Иногда сложно управлять изменениями для локальных конфигураций на нескольких запущенных экземплярах приложения, особенно при использовании сценария размещения в облаке. Это может привести к тому, что экземпляры используют другие параметры конфигурации во время развертывания обновления.

Кроме того, для обновления приложений и компонентов может потребоваться внести изменения в схемы конфигурации. Во многих системах конфигурации не поддерживаются разные версии сведений о конфигурации.

Решение

Храните сведения о конфигурации во внешнем хранилище и предоставьте интерфейс, который можно использовать для быстрого и эффективного чтения и обновления параметров конфигурации. Тип внешнего хранилища зависит от среды выполнения и размещения приложения. В облачном сценарии обычно это облачная служба хранилища или выделенная служба конфигурации, но может быть размещенной базой данных или другой пользовательской системой.

В выбранном для информации о конфигурации резервном хранилище должен быть простой в использовании и последовательный интерфейс. Он должен предоставлять сведения в правильно типизированном и структурированном формате. Реализация также может потребоваться авторизовать доступ пользователей для защиты данных конфигурации и быть достаточно гибким, чтобы разрешить хранение нескольких версий конфигурации (например, разработку, промежуточный или рабочий процесс, включая несколько версий выпуска каждой из них).

Многие встроенные системы конфигурации считывают данные при запуске приложения и выполняют кэширование данных в память для быстрого доступа к ним и минимизации влияния на производительность приложения. В зависимости от типа используемого резервного хранилища и его задержки может быть полезно реализовать механизм кэширования во внешнем хранилище конфигураций. Дополнительные сведения см. в руководстве по кэшированию. На этом рисунке показаны общие сведения о шаблоне внешнего хранилища конфигураций с необязательным локальным кэшем.

Общие сведения о шаблоне внешнего хранилища конфигураций с необязательным локальным кэшем

Проблемы и рекомендации

При принятии решения о реализации этого шаблона необходимо учитывать следующие моменты.

Выберите резервное хранилище, обеспечивающее приемлемую производительность, высокий уровень доступности, надежность и для которого можно создать резервную копию при обслуживании и администрировании приложения. В облачном приложении, использующем механизм облачного хранилища или выделенная служба платформы конфигурации, обычно подходит для удовлетворения этих требований.

Разработайте схему резервного хранилища, чтобы обеспечивать гибкость типов хранимых данных. Убедитесь, что предусмотрены все требования конфигурации (например, введенные данные, коллекции настроек, несколько версий параметров и любые другие компоненты, требуемые для использования приложения). Схема должна легко расширяться для поддержки дополнительных параметров по мере изменения требований.

Учитывайте физические возможности резервного хранилища, как оно связано со способом хранения сведений о конфигурации, а также его влияние на производительность. Например, для хранения XML-документа, в котором содержатся сведения о конфигурации, потребуется интерфейс конфигурации или приложение для синтаксического анализа документа, чтобы выполнить чтение отдельных параметров. Это обновление параметра слегка усложнится, хотя кэширование параметров может помочь компенсировать медленную скорость чтения.

Учтите то, каким образом интерфейс конфигурации будет разрешать управлять областью и наследованием настроек конфигурации. Например, требования к настройкам конфигурации области на уровне организации, приложения и компьютера. Эти требования могут понадобиться, чтобы поддержать делегирование контроля над доступом к разным областям, а также чтобы запретить или разрешить отдельным приложениям переопределять параметры.

Убедитесь, что интерфейс конфигурации может предоставлять данные конфигурации в требуемых форматах (например, типизированные значения, коллекции, пары "ключ — значение" или контейнеры свойств).

Посмотрите, как будет работать интерфейс хранилища конфигурации, когда настройки содержат ошибки или не существуют в резервном хранилище. Возможно, потребуется восстановить параметры по умолчанию и зарегистрировать ошибки. Кроме того, обратите внимание на учет регистра в ключах или именах параметров конфигурации, хранение и обработку двоичных данных и способы обработки пустых или нулевых значений.

Рассмотрите возможность защиты данных конфигурации, чтобы предоставить доступ только соответствующим пользователям и приложениям. Это, скорее всего, возможность интерфейса хранилища конфигурации, но необходимо убедиться, что к данным в резервном хранилище невозможно получить доступ напрямую без соответствующего разрешения. Обеспечьте строгое разделение между разрешениями, необходимыми для чтения и записи данных конфигурации. Учтите также необходимость шифрования некоторых или всех параметров конфигурации и способ их реализации в интерфейсе хранилища конфигурации.

Централизованно хранимые конфигурации, которые влияют на поведение приложения при выполнении, являются критически важными, и их необходимо развернуть, обновить и управлять ими с помощью механизмов, используемых для развертывания кода приложения. Например, изменения, которые могут повлиять на несколько приложений, необходимо выполнять с использованием подхода полного тестирования и промежуточного развертывания. Это позволит убедиться, что изменение подходит для всех приложений, использующих эту конфигурацию. Если администратор изменяет параметр, чтобы обновить одно приложение, это может отрицательно повлиять на другие приложения, использующие тот же параметр.

Если приложение кэширует сведения о конфигурации, ему необходимо получать предупреждения об изменениях конфигурации. Чтобы время от времени эти сведения автоматически обновлялись и были учтены все изменения (и обрабатывались), для кэшированных данных конфигурации можно реализовать политику срока действия.

Хотя кэширование данных конфигурации может помочь устранить временные проблемы с подключением к внешнему хранилищу конфигураций во время выполнения приложения, это обычно не решает проблему, если внешнее хранилище не работает при первом запуске приложения. Убедитесь, что конвейер развертывания приложения может предоставить последний известный набор значений конфигурации в файле конфигурации в качестве резервного варианта, если приложение не может получить динамические значения при запуске.

Когда следует использовать этот шаблон

Этот шаблон можно использовать для следующих целей:

  • если параметры конфигурации являются общими для нескольких приложений и экземпляров приложения, или если для нескольких приложений и экземпляров приложений применяется стандартная конфигурация;

  • если стандартная система конфигураций не поддерживает все необходимые параметры конфигурации (например, сохранение образов или сложных типов данных);

  • если дополнительное хранилище для некоторых параметров приложений позволяет приложениям переопределять некоторые или все централизованно хранимые параметры;

  • если нужно упростить администрирование нескольких приложений и при необходимости проводить мониторинг использования параметров конфигурации путем ведения журнала для некоторых или всех типов доступа к хранилищу конфигурации.

Проектирование рабочей нагрузки

Архитектор должен оценить, как шаблон внешнего хранилища конфигураций можно использовать в проектировании рабочей нагрузки для решения целей и принципов, описанных в основных принципах Платформы Azure Well-Architected Framework. Например:

Принцип Как этот шаблон поддерживает цели основных компонентов
Операционное превосходство помогает обеспечить качество рабочей нагрузки через стандартизированные процессы и сплоченность команды. Это разделение конфигурации приложения от кода приложения поддерживает конфигурацию для конкретной среды и применяет управление версиями к значениям конфигурации. Внешние хранилища конфигурации также являются общим местом для управления флагами функций для обеспечения безопасного развертывания.

- Проектирование автоматизации OE:10
- Рекомендации по развертыванию OE:11 Сейф

Как и любое решение по проектированию, рассмотрите любые компромиссы по целям других столпов, которые могут быть представлены с этим шаблоном.

Пример пользовательского хранилища резервного копирования

В размещенном приложении Microsoft Azure возможный выбор для хранения сведений о конфигурации во внешних целях — использовать служба хранилища Azure. Эта служба устойчива, обеспечивает высокую производительность, предоставляет высокий уровень доступности и реплицируется три раза с помощью автоматической отработки отказа. Хранилище таблиц Azure предоставляет хранилище ключей и значений с возможностью использования гибкой схемы для значений. Хранилище BLOB-объектов Azure предоставляет иерархическое, основанное на контейнере хранилище, которое может содержать любой тип данных в отдельно именованных больших двоичных объектах.

При реализации этого шаблона вы будете отвечать за абстрагирование хранилища BLOB-объектов Azure и предоставление параметров в приложениях, включая проверка обновления во время выполнения и решение способов реагирования на них.

В следующем примере показано, как упрощенное хранилище конфигурации может быть представлено в хранилище BLOB-объектов для хранения и предоставления сведений о конфигурации. Класс BlobSettingsStore может абстрагирует хранилище BLOB-объектов для хранения сведений о конфигурации и реализует простой ISettingsStore интерфейс.

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

Этот интерфейс определяет методы получения параметров конфигурации, хранящиеся в хранилище конфигурации, и включает номер версии, который можно использовать для определения того, были ли изменены какие-либо параметры конфигурации недавно. Класс BlobSettingsStore может использовать ETag свойство большого двоичного объекта для реализации управления версиями. Свойство ETag обновляется автоматически при каждой записи большого двоичного объекта.

По проектированию этот простой рисунок предоставляет все параметры конфигурации в виде строковых значений, а не типизированных значений.

Затем ExternalConfigurationManager класс может предоставить оболочку вокруг экземпляра BlobSettingsStore . Приложение может использовать этот класс для получения сведений о конфигурации. Этот класс может использовать такие расширения, как Microsoft Reactive Extensions, для публикации изменений, внесенных в конфигурацию во время работы системы. Кроме того, она будет отвечать за реализацию шаблона 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 Краткое руководство
Функции Azure в .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Используется с расширениями функций Azure для поддержки конфигурации в Startup.cs Краткое руководство
.NET Framework Microsoft.ConfigurationBuilders.AzureAppConfiguration Построитель конфигураций для System.Configuration Краткое руководство
Java Spring com.azure.spring azure-spring-spring-cloud-appconfiguration-config > Поддерживает доступ Spring Framework через ConfigurationProperties Краткое руководство
Python azure.appconfiguration Предоставляет AzureAppConfigurationClient Краткое руководство
JavaScript/Node.js @azure/app-configuration Предоставляет AppConfigurationClient Краткое руководство

Помимо клиентских библиотек, существуют также действия синхронизации GitHub Конфигурация приложений Azure и Конфигурация приложений Azure вытягивание и Конфигурация приложений Azure отправки задач Azure DevOps для интеграции шагов конфигурации в процесс сборки.

Следующие шаги