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


Руководство. Использование динамической конфигурации в фоновой службе .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 (рекомендуется) или строка подключения.

    Вы используете 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:`.
            .Select("TestApp:*")
            // Configure to reload the key 'TestApp:Settings:Message' if it is modified.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.Register("TestApp:Settings:Message");
            });
    
        // 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 для отслеживания изменений регистрируется ключ в хранилище Конфигурации приложений. Метод Register имеет необязательный логический параметр refreshAll, который можно использовать, чтобы указать, следует ли обновлять все значения конфигурации при изменении зарегистрированного ключа. В этом примере будет обновлен только ключ TestApp:Settings:Message. Срок действия кэша для всех параметров, зарегистрированных для обновления, по умолчанию составляет 30 секунд, а затем предпринимается новая попытка обновления. Его можно обновить, вызвав метод AzureAppConfigurationRefreshOptions.SetCacheExpiration.

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

    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 является холостым до завершения заданного времени истечения срока действия кэша, поэтому его влияние на производительность минимальна, даже если вызов совершается часто.

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

  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, перейдите к следующему учебнику: