Partilhar via


Tutorial: Usar a configuração dinâmica em um serviço em segundo plano do .NET

Os dados da Configuração do Aplicativo podem ser carregados como Configurações do Aplicativo em um aplicativo .NET. Para obter mais informações, consulte o guia de início rápido. No entanto, como é projetado pelo .NET, as Configurações do aplicativo só podem ser atualizadas após a reinicialização do aplicativo. O provedor .NET de Configuração de Aplicativo é uma biblioteca .NET Standard. Ele suporta cache e atualização de configuração dinamicamente sem reinicialização do aplicativo. Este tutorial mostra como você pode implementar atualizações de configuração dinâmica em um serviço em segundo plano do .NET.

Neste tutorial, irá aprender a:

  • Configure seu serviço em segundo plano .NET para atualizar sua configuração em resposta a alterações em uma loja de configuração de aplicativos.
  • Consuma a configuração mais recente em seu serviço em segundo plano.

Pré-requisitos

Adicionar um valor-chave

Adicione o seguinte valor-chave à loja de Configuração de Aplicativos e deixe Rótulo e Tipo de Conteúdo com seus valores padrão. Para obter mais informações sobre como adicionar valores-chave a uma loja usando o portal do Azure ou a CLI, vá para Criar um valor-chave.

Key valor
TestApp:Configurações:Mensagem Dados da Configuração do Aplicativo do Azure

Criar um serviço em segundo plano do .NET

Você usa a interface de linha de comando (CLI) do .NET para criar um novo projeto de aplicativo .NET. A vantagem de usar a CLI do .NET sobre o Visual Studio é que ela está disponível nas plataformas Windows, macOS e Linux. Como alternativa, use as ferramentas pré-instaladas disponíveis no Azure Cloud Shell.

  1. Crie uma pasta nova para o projeto.

  2. Na nova pasta, execute o seguinte comando para criar um novo projeto de serviço em segundo plano do .NET:

    dotnet new worker
    

Recarregar dados da Configuração do Aplicativo

  1. Adicione referências ao Microsoft.Extensions.Configuration.AzureAppConfiguration pacote NuGet executando o seguinte comando:

    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    
  2. Execute o seguinte comando para restaurar pacotes para o seu projeto:

    dotnet restore
    
  3. Abra Program.cs e adicione as seguintes instruções:

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  4. Conecte-se à Configuração do aplicativo.

    // Existing code in Program.cs
    // ... ...
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
            // 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
    // ... ...
    

    No método, uma chave dentro da sua App Configuration Store é registrada para monitoramento de ConfigureRefresh alterações. O Register método tem um parâmetro refreshAll booleano opcional que pode ser usado para indicar se todos os valores de configuração devem ser atualizados se a chave registrada for alterada. Neste exemplo, apenas a chave TestApp:Settings:Message será atualizada. Todas as configurações registradas para atualização têm uma expiração de cache padrão de 30 segundos antes de uma nova atualização ser tentada. Ele pode ser atualizado chamando o AzureAppConfigurationRefreshOptions.SetCacheExpiration método.

  5. Abra Worker.cs. Injete IConfiguration no IConfigurationRefresher Worker serviço e registre os dados de configuração da Configuração do aplicativo.

    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);
            }
        }
    }
    

    Chamar o ConfigureRefresh método sozinho não fará com que a configuração seja atualizada automaticamente. Você chama o TryRefreshAsync método da interface IConfigurationRefresher para disparar uma atualização. Esse design é para evitar solicitações enviadas para a Configuração do aplicativo mesmo quando seu aplicativo está ocioso. Você pode incluir a TryRefreshAsync chamada onde você considera seu aplicativo ativo. Por exemplo, pode ser quando você processa uma mensagem de entrada, um pedido ou uma iteração de uma tarefa complexa. Ele também pode estar em um temporizador se seu aplicativo estiver ativo o tempo todo. Neste exemplo, você chama TryRefreshAsync toda vez que o serviço em segundo plano é executado. Observe que, mesmo se a chamada TryRefreshAsync falhar por qualquer motivo, seu aplicativo continuará a usar a configuração em cache. Outra tentativa será feita quando o tempo de expiração do cache configurado tiver passado e a chamada for acionada pela atividade do TryRefreshAsync aplicativo novamente. A chamada TryRefreshAsync é um no-op antes que o tempo de expiração do cache configurado transcorra, portanto, seu impacto no desempenho é mínimo, mesmo que seja chamado com frequência.

Crie e execute o aplicativo localmente

  1. Defina uma variável de ambiente chamada ConnectionString e defina-a como a chave de acesso à sua loja de configuração de aplicativos. Na linha de comando, execute o seguinte comando.

    Para criar e executar o aplicativo localmente usando o prompt de comando do Windows, execute o seguinte comando.

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

    Reinicie o prompt de comando para permitir que a alteração entre em vigor. Imprima o valor da variável de ambiente para validar se ela está definida corretamente.

  2. Execute o seguinte comando para criar o aplicativo.

    dotnet build
    
  3. Depois que a compilação for concluída com êxito, execute o seguinte comando para executar o aplicativo localmente.

    dotnet run
    
  4. Você deve ver as seguintes saídas no console.

    Captura de ecrã do serviço em segundo plano.

  5. No portal do Azure, navegue até o Gerenciador de configurações do seu repositório de configuração de aplicativos e atualize o valor da chave a seguir.

    Key valor
    TestApp:Configurações:Mensagem Dados da Configuração do Aplicativo do Azure - Atualizado
  6. Aguarde alguns instantes até que a janela de tempo do intervalo de atualização passe. Você verá as saídas do console alteradas.

    Captura de ecrã do serviço em segundo plano atualizado.

Clean up resources (Limpar recursos)

Se não quiser continuar a utilizar os recursos criados neste artigo, elimine o grupo de recursos que criou aqui para evitar cobranças.

Importante

A eliminação de um grupo de recursos é irreversível. O grupo de recursos e todos os recursos nele contidos são excluídos permanentemente. Certifique-se de não excluir acidentalmente o grupo de recursos ou recursos errados. Se você criou os recursos para este artigo dentro de um grupo de recursos que contém outros recursos que deseja manter, exclua cada recurso individualmente de seu respetivo painel em vez de excluir o grupo de recursos.

  1. Entre no portal do Azure e selecione Grupos de recursos.
  2. Na caixa Filtrar por nome, introduza o nome do seu grupo de recursos.
  3. Na lista de resultados, selecione o nome do grupo de recursos para ver uma visão geral.
  4. Selecione Eliminar grupo de recursos.
  5. É-lhe pedido que confirme a eliminação do grupo de recursos. Insira o nome do grupo de recursos a ser confirmado e selecione Excluir.

Após alguns momentos, o grupo de recursos e todos os seus recursos são excluídos.

Próximos passos

Neste tutorial, você habilitou seu serviço em segundo plano do .NET para atualizar dinamicamente as definições de configuração da Configuração do aplicativo. Para saber como habilitar a configuração dinâmica em um aplicativo Web ASP.NET, continue para o próximo tutorial:

Para saber como usar uma identidade gerenciada do Azure para simplificar o acesso à Configuração do Aplicativo, continue para o próximo tutorial: