다음을 통해 공유


.NET에서의 서비스 검색

이 문서에서는 Microsoft.Extensions.ServiceDiscovery 라이브러리를 사용하는 방법을 알아봅니다. 서비스 검색은 개발자가 물리적 주소(IP 주소 및 포트) 대신 논리 이름을 사용하여 외부 서비스를 참조하는 방법입니다.

시작하기

.NET에서 서비스 검색을 시작하려면 Microsoft.Extensions.ServiceDiscoveryNuGet 패키지를 설치합니다.

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

자세한 내용은 dotnet add package 또는 .NET 애플리케이션에서 패키지 종속성 관리를 참조하세요.

예제 사용

프로젝트의 Program.cs 파일에서 AddServiceDiscovery 확장 메서드를 호출하여 호스트에 서비스 검색을 추가하고 기본 서비스 엔드포인트 확인자를 구성합니다.

builder.Services.AddServiceDiscovery();

AddServiceDiscovery 확장 메서드를 호출하여 개별 IHttpClientBuilder에 서비스 검색을 추가합니다.

builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
    {
        client.BaseAddress = new("https://catalog");
    })
    .AddServiceDiscovery();

또는 기본적으로 모든 HttpClient 인스턴스에 서비스 검색을 추가할 수 있습니다.

builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // Turn on service discovery by default
    http.AddServiceDiscovery();
});

HTTP(S) 엔드포인트를 확인할 때 체계 선택

로컬에서 서비스를 개발하고 테스트하는 동안에는 HTTP를 사용하고, 서비스가 배포될 때는 HTTPS를 사용하는 것이 일반적입니다. 서비스 검색은 서비스 검색에 제공된 입력 문자열에 URI 체계의 우선 순위 목록을 지정하도록 허용하여 이를 지원합니다. 서비스 검색은 체계에 대한 서비스를 순서대로 확인하려고 시도하고 엔드포인트를 찾은 후에 중지됩니다. URI 체계는 + 문자로 구분됩니다(예: "https+http://basket"). 서비스 검색은 먼저 "basket" 서비스에 대한 HTTPS 엔드포인트를 찾으려고 시도한 다음 HTTP 엔드포인트로 대체합니다. HTTPS 엔드포인트가 발견되면 서비스 검색에 HTTP 엔드포인트가 포함되지 않습니다.

체계는 ServiceDiscoveryOptions에서 AllowedSchemesAllowAllSchemes 속성을 구성하여 필터링할 수 있습니다. AllowAllSchemes 속성은 모든 체계가 허용됨을 나타내는 데 사용됩니다. 기본적으로 AllowAllSchemestrue이며 모든 체계가 허용됩니다. AllowAllSchemesfalse로 설정하고 허용된 체계를 AllowedSchemes 속성에 추가하여 구성표를 제한할 수 있습니다. 예를 들어, HTTPS만 허용하려면 다음을 수행합니다.

services.Configure<ServiceDiscoveryOptions>(options =>
{
    options.AllowAllSchemes = false;
    options.AllowedSchemes = ["https"];
});

모든 체계를 명시적으로 허용하려면 ServiceDiscoveryOptions.AllowAllSchemes 속성을 true로 설정합니다.

services.Configure<ServiceDiscoveryOptions>(
    options => options.AllowAllSchemes = true);

구성에서 서비스 엔드포인트 확인

AddServiceDiscovery 확장 메서드는 기본적으로 구성 기반 엔드포인트 확인자를 추가합니다. 이 확인자는 .NET 구성 시스템에서 엔드포인트를읽습니다. 라이브러리는 appsettings.json, 환경 변수 또는 기타 IConfiguration 원본을 통한 구성을 지원합니다.

다음은 appsettings.json을 통해 카탈로그라는 서비스에 대한 엔드포인트를 구성하는 방법을 보여 주는 예제입니다.

{
  "Services": {
    "catalog": {
      "https": [
        "localhost:8080",
        "10.46.24.90:80"
      ]
    }
  }
}

앞의 예제에서는 카탈로그: https://localhost:8080"https://10.46.24.90:80"라는 서비스에 대해 두 개의 엔드포인트를 추가합니다. 카탈로그가 확인될 때마다 이러한 엔드포인트 중 하나가 선택됩니다.

IServiceCollectionAddServiceDiscoveryCore 확장 메서드를 사용하여 호스트에 서비스 검색을 추가한 경우, IServiceCollectionAddConfigurationServiceEndpointProvider 확장 메서드를 호출하여 구성 기반 엔드포인트 확인자를 추가할 수 있습니다.

구성

구성 확인자는 다음 구성 옵션을 제공하는 ConfigurationServiceEndpointProviderOptions 클래스를 사용하여 구성됩니다.

  • SectionName: 서비스 엔드포인트를 포함하는 구성 섹션의 이름입니다. 기본값은 "Services"입니다.

  • ApplyHostNameMetadata: 호스트 이름 메타데이터를 확인된 엔드포인트에 적용해야 하는지 여부를 결정하는 데 사용되는 대리자입니다. 기본값은 false를 반환하는 함수로 설정됩니다.

이러한 옵션을 구성하려면 애플리케이션의 Startup 클래스 또는 Program 파일 내에서 IServiceCollectionConfigure 확장 메서드를 사용하면 됩니다.

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ConfigurationServiceEndPointResolverOptions>(
    static options =>
    {
        options.SectionName = "MyServiceEndpoints";

        // Configure the logic for applying host name metadata
        options.ApplyHostNameMetadata = static endpoint =>
        {
            // Your custom logic here. For example:
            return endpoint.EndPoint is DnsEndPoint dnsEp
                && dnsEp.Host.StartsWith("internal");
        };
    });

앞의 예제는 서비스 엔드포인트에 대한 사용자 지정 섹션 이름을 설정하고 호스트 이름 메타데이터를 적용하기 위한 사용자 지정 조건부 논리를 제공하는 방법을 보여줍니다.

플랫폼 제공 서비스 검색을 사용하여 서비스 엔드포인트 확인

Azure Container Apps나 Kubernetes와 같은 특정 플랫폼(제대로 맞춰 구성된 경우)은 서비스 검색 클라이언트 라이브러리 없이도 서비스 검색 기능을 제공합니다. 이러한 환경에서 애플리케이션이 배포되는 경우 플랫폼의 기본 제공 기능을 사용하는 것이 유리할 수 있습니다. 통과 확인자는 이 시나리오를 용이하게 하도록 설계되었습니다. 개발자 컴퓨터와 같은 다양한 환경에서 구성과 같은 대체 확인자를 사용할 수 있습니다. 이러한 유연성이 코드를 수정하거나 조건부 가드를 구현 하지 않아도 달성된다는 것이 중요합니다.

통과 확인자는 외부 확인을 수행하지 않는 대신, DnsEndPoint로 표시되는 입력 서비스 이름을 반환하여 엔드포인트를 확인합니다.

통과 공급자는 AddServiceDiscovery 확장 메서드를 통해 서비스 검색을 추가할 때 기본적으로 구성됩니다.

IServiceCollectionAddServiceDiscoveryCore 확장 메서드를 사용하여 호스트에 서비스 검색을 추가한 경우 IServiceCollectionAddPassThroughServiceEndpointProvider 확장 메서드를 호출하여 통과 공급자를 추가할 수 있습니다.

참고 항목