앱 구성 개념 검토
분산된 환경에 대한 마이크로 서비스를 만들면 중요한 문제를 야기합니다. 클라우드에서 호스트되는 마이크로 서비스는 여러 지역에 있는 여러 컨테이너에서 실행되는 경우가 많습니다. 각 서비스의 코드를 구성에서 분리하는 솔루션을 구현하면 모든 환경에서 문제를 쉽게 분류할 수 있습니다.
이 단원에서는 이 문제를 효과적으로 해결하기 위해 Azure App Configuration과 ASP.NET Core 및 Docker 구성 기능을 통합하는 방법을 알아봅니다.
다음을 검토합니다.
- ASP.NET Core 구성 아키텍처.
- Kubernetes 구성 추상화 - ConfigMap.
- Azure App Configuration 서비스.
- .NET 기능 관리 라이브러리.
- 앱에서 구현된 기능 플래그 구성 요소.
ASP.NET Core 구성
ASP.NET Core 프로젝트의 구성은 하나 이상의 .NET 구성 공급자에 포함되어 있습니다. 구성 공급자는 JSON 파일 등의 특정 구성 원본에 대한 추상화입니다. 구성 원본의 값은 키-값 쌍의 컬렉션으로 표시됩니다.
ASP.NET Core 앱은 여러 구성 공급자를 등록하여 다양한 원본의 설정을 읽을 수 있습니다. 기본 애플리케이션 호스트를 사용하면 여러 구성 공급자가 자동으로 등록됩니다. 다음 구성 원본은 나열된 순서대로 사용할 수 있습니다.
- JSON 파일(appsettings.json)
- JSON 파일(appsettings.{environment}.json)
- 사용자 비밀
- 환경 변수
- 명령 줄
각 구성 공급자는 고유한 키 값을 제공할 수 있습니다. 또한 모든 공급자는 자신이 아닌 이전에 체인에 등록된 공급자의 값을 재정의할 수 있습니다. 위의 목록에서 등록 순서를 지정하면 UseFeatureManagement
명령줄 매개 변수가 UseFeatureManagement
환경 변수를 재정의합니다. 마찬가지로 appsettings.json 내에 있는 UseFeatureManagement
키는 appsettings.Development.json에 저장된 UseFeatureManagement
키로 재정의될 수 있습니다.
구성 키 이름은 계층 구조를 설명할 수 있습니다. 예를 들어 eShop:Store:SeasonalSale 표기법은 eShop 앱의 스토어 마이크로 서비스 내에 있는 SeasonalSale 기능을 나타냅니다. 이 구조는 구성 값을 개체 그래프나 배열에 매핑할 수도 있습니다.
중요
일부 플랫폼은 환경 변수 이름에서 콜론을 지원하지 않습니다. 플랫폼 간 호환성을 위해 콜론 (:
) 대신 이중 밑줄(__
)을 사용하여 키를 구분합니다. 예를 들어 eShop__Store__SeasonalSale
는 eShop:Store:SeasonalSale
에 대해 플랫폼 간 동일한 표기법입니다.
ASP.NET Core는 ConfigurationBinder를 사용하여 구성 값을 개체 및 배열에 매핑합니다. 키 이름에 대한 매핑은 대/소문자를 구분하지 않는 방식으로 발생합니다. 예를 들어 ConnectionString
과 connectionstring
은 동일한 키로 처리됩니다. 자세한 내용은 키 및 값을 참조하세요.
도커 구성
Docker에서 구성을 키-값 쌍 컬렉션으로 처리하는 하나의 추상화는 컨테이너 YAML 파일의 환경 변수 섹션입니다. 다음 코드 조각은 앱의 docker-compose.yml
파일에서 발췌한 것입니다.
services:
frontend:
image: storeimage
build:
context: .
dockerfile: DockerfileStore
environment:
- ProductEndpoint=http://backend:8080
- ConnectionStrings:AppConfig=Endpoint=https://eshop-app-features.azconfig.io;Id=<ID>;Secret=<SECRET>
ports:
- "32000:8080"
depends_on:
- backend
파일 코드 조각은 다음을 정의합니다.
- 변수는 앞의 코드 조각에서 강조 표시된 대로 YAML 파일의
environment
섹션에 저장됩니다. - 컨테이너화된 앱에 환경 변수로 표시됩니다.
- 마이크로 서비스 앱에서 .NET 구성 값을 유지하는 메커니즘입니다.
환경 변수는 Docker 컨테이너에서 호스트되는 앱에 런타임 구성을 제공하는 플랫폼 간 메커니즘입니다.
Azure App Configuration
중앙 집중식 구성 서비스는 마이크로 서비스 앱 및 기타 배포된 앱에서 특히 유용합니다. 이 모듈에서는 특별히 기능 플래그를 위한 구성 값을 중앙에서 관리하는 서비스로서 Azure App Configuration을 소개합니다. 이 서비스는 앱과 함께 구성을 배포할 때 발생하는 오류 문제를 쉽게 해결할 수 있습니다.
App Configuration은 미사용 및 전송 중에 키 값을 암호화하는 완전 관리형 서비스입니다. 이 서비스를 이용해 저장된 구성 값은 실시간으로 업데이트할 수 있으며 앱을 다시 배포하거나 다시 시작할 필요가 없습니다.
ASP.NET Core 앱에서 Azure App Configuration은 구성 공급자로 등록됩니다. 공급자 등록과 별도로 앱은 App Configuration 저장소를 모릅니다. 구성 값은 .NET의 구성 추상화인 IConfiguration
인터페이스를 통해 검색할 수 있습니다.
기능 관리 라이브러리
기능 관리 라이브러리는 앱 내의 기능 플래그를 관리하기 위해 표준화된 .NET API를 제공합니다. 라이브러리는 Microsoft.FeatureManagement
및 Microsoft.FeatureManagement.AspNetCore
라는 두 가지 패키지 형태로 NuGet을 통해 배포됩니다. 후자에 속한 패키지는 ASP.NET Core 프로젝트의 Razor 파일에서 사용할 태그 도우미를 제공합니다. 태그 도우미가 필요하지 않거나 ASP.NET Core 프로젝트와 함께 사용하지 않을 경우에는 이전 패키지를 사용해도 충분합니다.
라이브러리는 IConfiguration
위에 빌드됩니다. 따라서 Azure App Configuration에 대한 공급자를 포함해 모든 .NET 구성 공급자와 호환됩니다. 라이브러리가 Azure App Configuration에서 분리되기 때문에 이 두 가지를 구성 공급자를 통해 통합할 수 있습니다. 이 라이브러리를 Azure App Configuration과 결합하면 지원 인프라를 구현하지 않고도 기능을 동적으로 전환할 수 있습니다.
Azure App Configuration과 통합
Azure App Configuration과 기능 관리 라이브러리의 통합을 이해하려면 ASP.NET Core 프로젝트의 Program.cs
파일에서 인용한 다음 설명을 참조하세요.
string connectionString = builder.Configuration.GetConnectionString("AppConfig");
// Load configuration from Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options => {
options.Connect(connectionString)
.UseFeatureFlags();
});
위의 코드 조각에서 다음을 수행합니다.
- 앱의
builder.Configuration
메서드를 호출하여 Azure App Configuration 저장소에 대한 구성 공급자를 등록합니다. 구성 공급자는AddAzureAppConfiguration
에 대한 호출을 통해 등록됩니다. - 다음 옵션을 사용하여 Azure App Configuration 공급자의 동작을 구성합니다.
Connect
메서드 호출에 전달된 연결 문자열을 통해 해당 Azure 서비스에 인증합니다. 연결 문자열은connectionString
변수에서 검색됩니다. 등록된 구성 원본은builder.Configuration
를 통해 제공됩니다.UseFeatureFlags
에 대한 호출을 통해 기능 플래그 지원을 사용하도록 설정합니다.
- Azure App Configuration 공급자는 다른 모든 구성 공급자들 다음으로 등록되었기 때문에 후자의 공급자들을 대체합니다.
팁
ASP.NET Core 프로젝트에서 ConfigureAppConfiguration
내부의 configBuilder.Sources
속성을 분석하여 등록된 공급자 목록에 액세스할 수 있습니다.