Поделиться через


Руководство. Использование динамической конфигурации в фоновой службе .NET

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

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

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

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

Добавьте ключ-значение

Добавьте следующее ключевое значение в хранилище Конфигурация приложений и оставьте метку и тип контента со значениями по умолчанию. Дополнительные сведения о добавлении значений ключей в хранилище с помощью портал Azure или ИНТЕРФЕЙСА командной строки см. в разделе "Создание значения ключа".

Ключ Значение
TestApp:Settings:Message Данные из Конфигурация приложений Azure

Создание фоновой службы .NET

Интерфейс командной строки .NET (CLI) используется для создания проекта приложения .NET. Преимущество использования .NET CLI по сравнению с Visual Studio заключается в том, что он доступен на платформах Windows, macOS и Linux. Кроме того, можно использовать предварительно установленные средства, доступные в Azure Cloud Shell.

  1. Создайте новый каталог для своего проекта

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

    dotnet new worker
    

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

  1. Добавьте ссылки на Microsoft.Extensions.Configuration.AzureAppConfiguration пакет NuGet, выполнив следующую команду:

    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    
  2. Выполните следующую команду, чтобы восстановить пакеты проекта:

    dotnet restore
    
  3. Откройте файл Program.cs и добавьте следующие инструкции:

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  4. Подключение к Конфигурации приложения с использованием Microsoft Entra ID (рекомендуется) или строки подключения.

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

    // Existing code in Program.cs
    // ... ...
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        string endpoint = Environment.GetEnvironmentVariable("Endpoint"); 
        options.Connect(new Uri(endpoint), new DefaultAzureCredential());
            // Load all keys that start with `TestApp:` and have no label.
            .Select("TestApp:*")
            // Reload configuration if any selected key-values have changed.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.RegisterAll();
            });
    
        // Register the refresher so that the Worker service can consume it through DI
        builder.Services.AddSingleton(options.GetRefresher());
    });
    
    // The rest of existing code in Program.cs
    // ... ...
    

    Внутри метода ConfigureRefresh вы вызываете метод RegisterAll, чтобы указать поставщику App Configuration перезагрузить всю конфигурацию при обнаружении изменений в любом из выбранных ключевых значений (начиная с TestApp: и без ярлыка). Дополнительные сведения об изменениях конфигурации мониторинга см. в рекомендациях по обновлению конфигурации.

    Подсказка

    Вы можете добавить вызов метода refreshOptions.SetRefreshInterval, чтобы указать минимальное время между обновлениями конфигурации. In this example, you use the default value of 30 seconds. Установите более высокое значение, если вам нужно уменьшить количество запросов, отправляемых на ваш хранилище конфигурации приложения.

  5. Откройте Worker.cs. Внедрите IConfiguration и IConfigurationRefresher в службу Worker и зафиксируйте данные конфигурации из Конфигурации приложений.

    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private readonly IConfiguration _configuration;
        private readonly IConfigurationRefresher _refresher;
    
        public Worker(ILogger<Worker> logger, IConfiguration configuration, IConfigurationRefresher refresher)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            _refresher = refresher ?? throw new ArgumentNullException(nameof(refresher));
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                // Intentionally not await TryRefreshAsync to avoid blocking the execution.
                _refresher.TryRefreshAsync(stoppingToken);
    
                if (_logger.IsEnabled(LogLevel.Information))
                {
                    _logger.LogInformation(_configuration["TestApp:Settings:Message"] ?? "No data.");
                }
    
                await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
            }
        }
    }
    

    Вызов одного метода ConfigureRefresh не приведет к автоматическому обновлению конфигурации. Для активации обновления необходимо вызвать метод TryRefreshAsync из интерфейса IConfigurationRefresher. Это позволяет избежать запросов, отправленных в Конфигурация приложений даже если приложение неактивно. Вы можете включить вызов TryRefreshAsync, в котором вы считаете, что ваше приложение активно. Например, при обработке входящего сообщения, заказа или итерации сложной задачи. Это также может находиться в режиме таймера, если ваше приложение активно постоянно. В этом примере вы вызываете TryRefreshAsync каждый раз, когда выполняется фоновая служба. Обратите внимание, что даже в случае сбоя вызова TryRefreshAsync по какой-либо причине ваше приложение продолжит использовать кэшированную конфигурацию. Еще одна попытка будет выполнена после окончания настроенного интервала обновления, и вызов TryRefreshAsync будет активирован вашим приложением снова. Вызов TryRefreshAsync — это no-op до истечения заданного интервала обновления, поэтому его влияние на производительность минимально, даже если оно часто вызывается.

Создание и запуск приложения локально

  1. Задайте переменную среды.

    Задайте переменную среды с именем Endpoint на значение конечной точки вашего хранилища конфигурации приложений, найденной в разделе Обзор хранилища в портале Azure.

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

    setx Endpoint "<endpoint-of-your-app-configuration-store>"
    

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

    $Env:Endpoint = "<endpoint-of-your-app-configuration-store>"
    

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

    export Endpoint='<endpoint-of-your-app-configuration-store>'
    
  2. Выполните сборку приложения с помощью приведенной ниже команды.

    dotnet build
    
  3. После успешного завершения сборки выполните следующую команду, чтобы запустить приложение локально.

    dotnet run
    
  4. В консоли должны появиться следующие выходные данные.

    Снимок экрана: фоновая служба.

  5. На портале Azure перейдите в обозреватель конфигураций хранилища Конфигурации приложений и обновите значение следующего ключа.

    Ключ Значение
    TestApp:Settings:Message Данные из Конфигурация приложений Azure — обновлены
  6. Подождите несколько мгновений, пока временное окно интервала обновления не завершится. Вы увидите изменения выходных данных консоли.

    Снимок экрана: обновленная фоновая служба.

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

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

Внимание

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

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

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

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

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

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