Руководство по использованию динамической конфигурации в приложении Функций Azure

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

В этом руководстве описано следующее:

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

Предварительные требования

Перезагрузка данных из App Configuration

Функции Azure поддерживают запуск внутрипроцессно или в изолированном процессе. Основное различие в использовании Конфигурации приложений в этих двух режимах заключается в том, как обновляется конфигурация. Во внутрипроцессном режиме необходимо выполнить вызов в каждой функции, чтобы обновить конфигурацию. В режиме изолированного процесса поддерживается ПО промежуточного слоя. ПО промежуточного слоя Конфигурации приложений, Microsoft.Azure.AppConfiguration.Functions.Worker, позволяет автоматически обновлять конфигурацию перед выполнением каждой функции.

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

    Откройте файл Startup.cs и измените метод ConfigureAppConfiguration.

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                    // Load all keys that start with `TestApp:` and have no label
                    .Select("TestApp:*")
                    // Configure to reload configuration if the registered sentinel key is modified
                    .ConfigureRefresh(refreshOptions =>
                        refreshOptions.Register("TestApp:Settings:Sentinel", refreshAll: true));
        });
    }
    

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

    Срок действия кэша для всех параметров, зарегистрированных для обновления, по умолчанию составляет 30 секунд, а затем предпринимается новая попытка обновления. Его можно обновить, вызвав метод AzureAppConfigurationRefreshOptions.SetCacheExpiration.

    Совет

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

    Вы также можете сделать следующее, чтобы свести к минимуму риск несоответствий:

    • Спроектируйте приложение таким образом, чтобы была допустима временная несогласованность конфигурации.
    • Разогрейте приложение, прежде чем переносить его в режим "в сети" (обслуживание запросов).
    • Перенесите конфигурацию по умолчанию в приложении и используйте ее при сбое проверки конфигурации.
    • Выберите стратегию обновления конфигурации, которая сводит к минимуму влияние на приложение, например обновление в периоды низкого трафика.
  1. Обновите метод Configure, чтобы службы Конфигурации приложений Azure были доступны посредством внедрения зависимостей.

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
    }
    
  2. Откройте файл Function1.cs и добавьте указанные ниже пространства имен.

    using System.Linq;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    Обновите конструктор, чтобы получить экземпляр IConfigurationRefresherProvider посредством внедрения зависимостей, благодаря чему можно получить экземпляр IConfigurationRefresher.

    private readonly IConfiguration _configuration;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider)
    {
        _configuration = configuration;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  3. Обновите метод Run и оповещение об обновлениях конфигурации, используя метод TryRefreshAsync в начале вызова функций. Это не будет работать, если время истечения срока действия кэша не достигнуто. Удалите оператор await, если вы предпочитаете, чтобы конфигурация обновлялась без блокировки текущего вызова Функций. В этом случае при последующих вызовах Функций будет поступать обновленное значение.

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync(); 
    
        string keyName = "TestApp:Settings:Message";
        string message = _configuration[keyName];
    
        return message != null
            ? (ActionResult)new OkObjectResult(message)
            : new BadRequestObjectResult($"Please create a key-value with the key '{keyName}' in App Configuration.");
    }
    

Локальное тестирование функции

  1. Задайте переменную среды с именем ConnectionString и укажите для нее ключ доступа к хранилищу конфигураций приложений. Если вы используете командную строку Windows, выполните следующую команду и перезапустите командную строку, чтобы изменения вступили в силу:

    setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    Если вы используете Windows PowerShell, выполните следующую команду:

    $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

    Если вы используете macOS или Linux, выполните следующую команду:

    export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. Чтобы проверить работу функции, нажмите клавишу F5. Если будет предложено, примите запрос от Visual Studio на скачивание и установку основных инструментов решения "Функции Azure" (CLI). Кроме того, возможно, вам понадобиться включить исключение брандмауэра, чтобы инструменты могли обрабатывать HTTP-запросы.

  3. Скопируйте URL-адрес функции из выходных данных среды выполнения функций Azure.

    Отладки рассматриваемой в этом кратком руководстве функции в VS

  4. Вставьте URL-адрес для HTTP-запроса в адресной строке браузера. На изображении ниже показан ответ в браузере на локальный запрос GET, возвращаемый функцией.

    Локальный запуск рассматриваемой в этом кратком руководстве функции

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

  6. Выберите Обозреватель конфигураций и измените значения следующего ключа:

    Ключ Значение
    TestApp:Settings:FontSize Данные из конфигурации приложений Azure. Обновлено

    Затем создайте ключ Sentinel или измените его значение, если он уже существует, например:

    Ключ Значение
    TestApp:Settings:Sentinel Версия 1
  7. Обновите приложение браузера несколько раз. Если истечение срока действия кэша происходит через 30 секунд, на странице будет отображаться ответ на вызов функций с обновленным значением.

    Локальное обновление рассматриваемой в этом кратком руководстве функции

Примечание

Пример кода, используемый в этом руководстве, можно скачать в репозитории GitHub.

Очистка ресурсов

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

Важно!

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не те ресурсы или группу ресурсов. Если ресурсы для работы с этой статьей созданы в группе ресурсов, которая содержит другие нужные ресурсы, удалите каждый ресурс отдельно в соответствующей области ресурса, чтобы не удалять группу ресурсов.

  1. Войдите на портал Azure и выберитеГруппы ресурсов.
  2. Введите имя группы ресурсов в поле Фильтровать по имени.
  3. В списке результатов выберите имя группы ресурсов, чтобы просмотреть общие сведения.
  4. Выберите Удалить группу ресурсов.
  5. Подтвердите операцию удаления группы ресурсов. Введите имя группы ресурсов, которую необходимо удалить, и нажмите Удалить.

Через некоторое время группа ресурсов и все ее ресурсы будут удалены.

Дальнейшие действия

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