자습서: .NET 백그라운드 서비스에서 동적 구성 사용

App Configuration의 데이터는 .NET 애플리케이션에서 앱 설정으로 로드할 수 있습니다. 자세한 내용은 빠른 시작을 참조하세요. 그러나 .NET에서 디자인한 대로 앱 설정은 애플리케이션을 다시 시작할 때만 새로 고칠 수 있습니다. App Configuration .NET 공급자는 .NET Standard 라이브러리입니다. 애플리케이션을 다시 시작하지 않고 동적으로 구성을 캐싱 및 새로 고치도록 지원합니다. 이 자습서에서는 .NET 백그라운드 서비스에서 동적 구성 업데이트를 구현하는 방법을 보여 줍니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • App Configuration 저장소의 변경 내용에 대응하여 구성을 업데이트하도록 .NET 백그라운드 서비스를 설정합니다.
  • 백그라운드 서비스에서 최신 구성을 사용합니다.

필수 조건

키-값 추가

App Configuration 저장소에 다음 키-값을 추가하고 레이블콘텐츠 형식을 기본값으로 둡니다. Azure Portal 또는 CLI를 사용하여 저장소에 키-값을 추가하는 방법에 대한 자세한 내용은 키-값 만들기로 이동합니다.

TestApp:Settings:Message Azure App Configuration의 데이터

.NET 백그라운드 서비스 만들기

.NET CLI(명령줄 인터페이스)를 사용하여 새 .NET 앱 프로젝트를 만듭니다. Visual Studio 대신 .NET CLI를 사용하면 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. App Configuration에 연결합니다.

    // 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
    // ... ...
    

    ConfigureRefresh 메서드에서 App Configuration 저장소 내의 키는 변경 모니터링을 위해 등록됩니다. Register 메서드에는 등록된 키가 변경되는 경우 모든 구성 값을 새로 고칠지 여부를 나타내는 데 사용할 수 있는 선택적 부울 매개 변수 refreshAll이 있습니다. 이 예제에서는 TestApp:Settings:Message 키만 새로 고쳐집니다. 새로 고침을 위해 등록된 모든 설정의 기본 캐시 만료 기간은 새 새로 고침이 시도되기 전 30초입니다. AzureAppConfigurationRefreshOptions.SetCacheExpiration 메서드를 호출하여 업데이트할 수 있습니다.

  5. Worker.cs를 엽니다. Worker 서비스에 IConfigurationIConfigurationRefresher을(를) 삽입하고 App Configuration에서 구성 데이터를 기록합니다.

    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 메서드만 호출하면 구성이 자동으로 새로 고쳐지지 않습니다. 인터페이스 IConfigurationRefresher에서 TryRefreshAsync 메서드를 호출하여 새로 고침을 트리거합니다. 이 디자인은 애플리케이션이 유휴 상태인 경우에도 App Configuration으로 전송되는 요청을 방지하기 위한 것입니다. 애플리케이션이 활성 상태인 것으로 간주되는 TryRefreshAsync 호출을 포함할 수 있습니다. 예를 들어 들어오는 메시지, 주문 또는 복잡한 작업의 반복을 처리할 때 이 작업을 수행할 수 있습니다. 애플리케이션이 항상 활성 상태인 경우 타이머에 있을 수도 있습니다. 이 예제에서는 백그라운드 서비스가 실행될 때마다 TryRefreshAsync을(를) 호출합니다. 어떤 이유로 TryRefreshAsync 호출이 실패하더라도 애플리케이션은 캐시된 구성을 계속 사용합니다. 구성된 캐시 만료 시간이 경과하고 TryRefreshAsync 호출이 애플리케이션 작업에 의해 다시 트리거되는 경우 다른 시도가 수행됩니다. TryRefreshAsync를 호출하는 것은 구성된 캐시 만료 시간이 경과하기 전에 작동하지 않으므로 자주 호출하더라도 성능에 미치는 영향은 최소화됩니다.

로컬로 앱 빌드 및 실행

  1. ConnectionString이라는 환경 변수를 설정하고, App Configuration 스토리지에 대한 액세스 키로 설정합니다. 명령줄에서 다음 명령을 실행합니다.

    Windows 명령 프롬프트를 사용하여 로컬로 앱을 빌드하고 실행하려면 다음 명령을 실행합니다.

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

    명령 프롬프트를 다시 시작하여 변경 내용을 적용합니다. 환경 변수의 값을 출력하여 올바르게 설정되었는지 확인합니다.

  2. 다음 명령을 실행하여 앱을 빌드합니다.

    dotnet build
    
  3. 빌드가 성공적으로 완료되면 다음 명령을 실행하여 앱을 로컬로 실행합니다.

    dotnet run
    
  4. 콘솔에 다음 출력이 표시됩니다.

    백그라운드 서비스의 스크린샷.

  5. Azure Portal에서 App Configuration 저장소의 구성 탐색기로 이동하여 다음 키의 값을 업데이트합니다.

    TestApp:Settings:Message Azure App Configuration의 데이터 - 업데이트됨
  6. 새로 고침 간격 시간 창이 지나도록 몇 분 정도 기다립니다. 콘솔 출력이 변경된 것을 볼 수 있습니다.

    새로 고친 백그라운드 서비스의 스크린샷.

리소스 정리

이 문서에서 만든 리소스를 계속 사용하지 않으려면 여기서 만든 리소스 그룹을 삭제하여 요금이 부과되지 않도록 합니다.

Important

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹 및 포함된 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 합니다. 유지하려는 다른 리소스가 포함된 리소스 그룹 내에서 이 문서에 대한 리소스를 만든 경우 리소스 그룹을 삭제하는 대신 해당 창에서 각 리소스를 개별적으로 삭제합니다.

  1. Azure Portal에 로그인하고 리소스 그룹을 선택합니다.
  2. 이름으로 필터링 상자에서 리소스 그룹의 이름을 입력합니다.
  3. 결과 목록에서 리소스 그룹 이름을 선택하여 개요를 확인합니다.
  4. 리소스 그룹 삭제를 선택합니다.
  5. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인하고 삭제를 선택합니다.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.

다음 단계

이 자습서에서는 .NET 백그라운드 서비스를 사용하도록 설정하여 App Configuration에서 구성 설정을 동적으로 새로 고칩니다. ASP.NET 웹 애플리케이션에서 동적 구성을 사용하도록 설정하는 방법을 알아보려면 다음 자습서를 계속 진행합니다.

Azure 관리 ID를 사용하여 App Configuration에 대한 액세스를 간소화하는 방법을 알아보려면 다음 자습서로 계속 진행하세요.