다음을 통해 공유


ASP.NET Core에서 gRPCurl 및 gRPCui를 사용하여 gRPC 서비스 테스트

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Warning

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

작성자: James Newton-King

개발자가 클라이언트 앱을 빌드하지 않고도 서비스를 테스트할 수 있도록 하는 도구를 gRPC에 사용할 수 있습니다.

  • gRPCurl은 gRPC 서비스에 대한 상호 작용을 제공하는 오픈 소스 명령줄 도구입니다.
  • gRPCui는 gRPCurl을 기반으로 빌드되고 gRPC에 대한 오픈 소스 대화형 웹 UI를 추가합니다.

이 문서에서는 다음 작업의 수행 방법에 대해 설명합니다.

  • gRPC ASP.NET Core 앱을 사용하여 gRPC 서버 리플렉션을 설정합니다.
  • 테스트 도구를 사용하여 gRPC와 상호 작용:
    • grpcurl를 사용하여 gRPC 서비스를 검색하고 테스트합니다.
    • grpcui를 사용하여 브라우저를 통해 gRPC 서비스와 상호 작용합니다.

참고 항목

gRPC 서비스를 단위 테스트하는 방법에 대한 자세한 내용은 ASP.NET Core에서 gRPC 서비스 테스트를 참조하세요.

gRPC 리플렉션 설정

서비스를 호출하려면 먼저 도구가 서비스의 Protobuf 계약을 알고 있어야 합니다. 여기에는 두 가지 방법이 있습니다.

  • 서버에서 gRPC 리플렉션 을 설정합니다. gRPCurl과 같은 도구는 리플렉션을 사용하여 서비스 계약을 자동으로 검색합니다.
  • .proto 파일을 도구에 수동으로 추가합니다.

gRPC 리플렉션은 사용하기가 더 쉽습니다. gRPC 리플렉션은 클라이언트가 서비스를 검색하기 위해 호출할 수 있는 앱에 새 gRPC 서비스를 추가합니다.

gRPC ASP.NET Core는 Grpc.AspNetCore.Server.Reflection 패키지에서 gRPC 리플렉션을 기본적으로 지원합니다. 앱에서 리플렉션을 구성하려면 다음을 수행합니다.

  • Grpc.AspNetCore.Server.Reflection 패키지 참조를 추가합니다.
  • 다음에서 리플렉션을 등록합니다.Program.cs
    • AddGrpcReflection - 리플렉션을 사용하는 서비스를 등록합니다.
    • MapGrpcReflectionService - 리플렉션 서비스 엔드포인트를 추가합니다.
builder.Services.AddGrpc();
builder.Services.AddGrpcReflection();

var app = builder.Build();

app.MapGrpcService<GreeterService>();

IWebHostEnvironment env = app.Environment;

if (env.IsDevelopment())
{
    app.MapGrpcReflectionService();
}

gRPC 리플렉션이 설정된 경우:

  • gRPC 리플렉션 서비스가 서버 앱에 추가됩니다.
  • gRPC 리플렉션을 지원하는 클라이언트 앱에서 리플렉션 서비스를 호출하여 서버에서 호스트되는 서비스를 검색할 수 있습니다.
  • gRPC 서비스는 클라이언트에서 계속 호출됩니다. 리플렉션에서는 서비스 검색만 사용할 수 있으며 서버 쪽 보안을 무시하지 않습니다. 인증 및 권한 부여으로 보호되는 엔드포인트는 호출자가 엔드포인트에 대한 자격 증명을 전달하여 성공적으로 호출되도록 해야 합니다.

리플렉션 서비스 보안

gRPC 리플렉션은 중요한 정보를 포함할 수 있는 사용 가능한 API 목록을 반환합니다. gRPC 리플렉션 서비스에 대한 액세스를 제한하려면 주의해야 합니다.

gRPC 리플렉션은 일반적으로 로컬 개발 환경에서만 필요합니다. 로컬 개발의 경우 IsDevelopment가 true를 반환하는 경우에만 리플렉션 서비스를 매핑해야 합니다.

if (env.IsDevelopment())
{
    app.MapGrpcReflectionService();
}

서비스에 대한 액세스는 표준 ASP.NET Core 권한 부여 확장 방법(예: AllowAnonymousRequireAuthorization)을 통해 제어할 수 있습니다.

예를 들어 앱이 기본적으로 권한 부여를 요구하도록 구성된 경우 인증 및 권한 부여를 건너뛰도록 gRPC 리플렉션 엔드포인트를 AllowAnonymous 구성합니다.

if (env.IsDevelopment())
{
    app.MapGrpcReflectionService().AllowAnonymous();
}

gRPCurl

gRPCurl은 gRPC 커뮤니티에서 만든 명령줄 도구입니다. 해당 기능은 다음과 같습니다.

  • 스트리밍 서비스를 포함하여 gRPC 서비스 호출.
  • gRPC 리플렉션을 사용하여 서비스 검색.
  • gRPC 서비스 나열 및 설명.
  • 안전한(TLS) 서버 및 안전하지 않은(일반 텍스트) 서버에서 작동.

grpcurl다운로드 및 설치에 대한 자세한 내용은 gRPCurl GitHub 홈페이지를 참조하세요.

gRPCurl 명령줄

grpcurl 사용

-help 인수는 grpcurl 명령줄 옵션을 설명합니다.

$ grpcurl -help

서비스 검색

describe 동사를 사용하여 서버에서 정의한 서비스를 확인합니다. gRPC 서버의 localhost 포트 번호로 <port>를 지정합니다. 포트 번호는 프로젝트를 만들 때 임의로 할당되며 Properties/launchSettings.json에서 설정합니다.

$ grpcurl localhost:<port> describe
greet.Greeter is a service:
service Greeter {
  rpc SayHello ( .greet.HelloRequest ) returns ( .greet.HelloReply );
  rpc SayHellos ( .greet.HelloRequest ) returns ( stream .greet.HelloReply );
}
grpc.reflection.v1alpha.ServerReflection is a service:
service ServerReflection {
  rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse );
}

위의 예제는 다음과 같습니다.

  • localhost:<port> 서버에서 describe 동사를 실행합니다. 여기서 <port>는 gRPC 서버 프로젝트를 만들 때 임의로 할당되며 Properties/launchSettings.json에서 설정합니다.
  • gRPC 리플렉션에서 반환한 서비스 및 메서드를 출력합니다.
    • Greeter는 앱에 의해 구현된 서비스입니다.
    • ServerReflectionGrpc.AspNetCore.Server.Reflection 패키지에 의해 추가된 서비스입니다.

describe를 서비스, 메서드 또는 메시지 이름과 결합하여 세부 정보를 확인합니다.

$ grpcurl localhost:<port> describe greet.HelloRequest
greet.HelloRequest is a message:
message HelloRequest {
  string name = 1;
}

gRPC 서비스 호출

요청 메시지를 나타내는 JSON 인수와 함께 서비스 및 메서드 이름을 지정하여 gRPC 서비스를 호출합니다. JSON은 Protobuf로 변환되어 서비스로 전송됩니다.

$ grpcurl -d '{ \"name\": \"World\" }' localhost:<port> greet.Greeter/SayHello
{
  "message": "Hello World"
}

앞의 예에서:

  • -d 인수는 JSON으로 요청 메시지를 지정합니다. 이 인수는 서버 주소 및 메서드 이름 앞에 와야 합니다.
  • greeter.Greeter 서비스에서 SayHello 메서드를 호출합니다.
  • 응답 메시지를 JSON으로 출력합니다.
  • 여기서 <port>는 gRPC 서버 프로젝트를 만들 때 임의로 할당되며 Properties/launchSettings.json에서 설정합니다.

위의 예제에서는 \를 사용하여 " 문자를 이스케이프합니다. PowerShell 콘솔에서는 " 이스케이프가 필요하지만 일부 콘솔에서는 이 이스케이프를 사용하면 안 됩니다. 예를 들어 macOS 콘솔에 대한 이전 명령은 다음과 같습니다.

$ grpcurl -d '{ "name": "World" }' localhost:<port> greet.Greeter/SayHello
{
  "message": "Hello World"
}

gRPCui

gRPCui는 gRPC의 대화형 웹 UI입니다. gRPCui는 gRPCurl을 기반으로 합니다. gRPCui는 Swagger UI와 같은 HTTP 도구와 유사한 gRPC 서비스를 검색하고 테스트하기 위한 GUI를 제공합니다.

grpcui 다운로드 및 설치에 대한 자세한 내용은 gRPCui GitHub 홈페이지를 참조하세요.

grpcui 사용

상호 작용할 서버 주소에서 grpcui를 인수로 실행합니다.

$ grpcui localhost:<port>
gRPC Web UI available at http://127.0.0.1:55038/

앞의 예제에서는 gRPC 서버의 localhost 포트 번호로 <port>를 지정합니다. 포트 번호는 프로젝트를 만들 때 임의로 할당되며 Properties/launchSettings.json에서 설정합니다.

이 도구는 대화형 웹 UI를 사용하여 브라우저 창을 시작합니다. gRPC 서비스가 gRPC 리플렉션을 사용하여 자동으로 검색됩니다.

gRPCui 웹 UI

추가 리소스

개발자가 클라이언트 앱을 빌드하지 않고도 서비스를 테스트할 수 있도록 하는 도구를 gRPC에 사용할 수 있습니다.

  • gRPCurl은 gRPC 서비스에 대한 상호 작용을 제공하는 오픈 소스 명령줄 도구입니다.
  • gRPCui는 gRPCurl을 기반으로 빌드되고 gRPC에 대한 오픈 소스 대화형 웹 UI를 추가합니다.

이 문서에서는 다음 작업의 수행 방법에 대해 설명합니다.

  • gRPC ASP.NET Core 앱을 사용하여 gRPC 서버 리플렉션을 설정합니다.
  • 테스트 도구를 사용하여 gRPC와 상호 작용:
    • grpcurl를 사용하여 gRPC 서비스를 검색하고 테스트합니다.
    • grpcui를 사용하여 브라우저를 통해 gRPC 서비스와 상호 작용합니다.

참고 항목

gRPC 서비스를 단위 테스트하는 방법에 대한 자세한 내용은 ASP.NET Core에서 gRPC 서비스 테스트를 참조하세요.

gRPC 리플렉션 설정

서비스를 호출하려면 먼저 도구가 서비스의 Protobuf 계약을 알고 있어야 합니다. 여기에는 두 가지 방법이 있습니다.

  • 서버에서 gRPC 리플렉션 을 설정합니다. gRPCurl과 같은 도구는 리플렉션을 사용하여 서비스 계약을 자동으로 검색합니다.
  • .proto 파일을 도구에 수동으로 추가합니다.

gRPC 리플렉션은 사용하기가 더 쉽습니다. gRPC 리플렉션은 클라이언트가 서비스를 검색하기 위해 호출할 수 있는 앱에 새 gRPC 서비스를 추가합니다.

gRPC ASP.NET Core는 Grpc.AspNetCore.Server.Reflection 패키지에서 gRPC 리플렉션을 기본적으로 지원합니다. 앱에서 리플렉션을 구성하려면 다음을 수행합니다.

  • Grpc.AspNetCore.Server.Reflection 패키지 참조를 추가합니다.
  • 다음에서 리플렉션을 등록합니다.Startup.cs
    • AddGrpcReflection - 리플렉션을 사용하는 서비스를 등록합니다.
    • MapGrpcReflectionService - 리플렉션 서비스 엔드포인트를 추가합니다.
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
    services.AddGrpcReflection();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();

        if (env.IsDevelopment())
        {
            endpoints.MapGrpcReflectionService();
        }
    });
}

gRPC 리플렉션이 설정된 경우:

  • gRPC 리플렉션 서비스가 서버 앱에 추가됩니다.
  • gRPC 리플렉션을 지원하는 클라이언트 앱에서 리플렉션 서비스를 호출하여 서버에서 호스트되는 서비스를 검색할 수 있습니다.
  • gRPC 서비스는 클라이언트에서 계속 호출됩니다. 리플렉션에서는 서비스 검색만 사용할 수 있으며 서버 쪽 보안을 무시하지 않습니다. 인증 및 권한 부여으로 보호되는 엔드포인트는 호출자가 엔드포인트에 대한 자격 증명을 전달하여 성공적으로 호출되도록 해야 합니다.

gRPCurl

gRPCurl은 gRPC 커뮤니티에서 만든 명령줄 도구입니다. 해당 기능은 다음과 같습니다.

  • 스트리밍 서비스를 포함하여 gRPC 서비스 호출.
  • gRPC 리플렉션을 사용하여 서비스 검색.
  • gRPC 서비스 나열 및 설명.
  • 안전한(TLS) 서버 및 안전하지 않은(일반 텍스트) 서버에서 작동.

grpcurl다운로드 및 설치에 대한 자세한 내용은 gRPCurl GitHub 홈페이지를 참조하세요.

gRPCurl 명령줄

grpcurl 사용

-help 인수는 grpcurl 명령줄 옵션을 설명합니다.

$ grpcurl -help

서비스 검색

describe 동사를 사용하여 서버에서 정의한 서비스를 확인합니다.

$ grpcurl localhost:5001 describe
greet.Greeter is a service:
service Greeter {
  rpc SayHello ( .greet.HelloRequest ) returns ( .greet.HelloReply );
  rpc SayHellos ( .greet.HelloRequest ) returns ( stream .greet.HelloReply );
}
grpc.reflection.v1alpha.ServerReflection is a service:
service ServerReflection {
  rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse );
}

위의 예제는 다음과 같습니다.

  • localhost:5001 서버에서 describe 동사를 실행합니다.
  • gRPC 리플렉션에서 반환한 서비스 및 메서드를 출력합니다.
    • Greeter는 앱에 의해 구현된 서비스입니다.
    • ServerReflectionGrpc.AspNetCore.Server.Reflection 패키지에 의해 추가된 서비스입니다.

describe를 서비스, 메서드 또는 메시지 이름과 결합하여 세부 정보를 확인합니다.

$ grpcurl localhost:5001 describe greet.HelloRequest
greet.HelloRequest is a message:
message HelloRequest {
  string name = 1;
}

gRPC 서비스 호출

요청 메시지를 나타내는 JSON 인수와 함께 서비스 및 메서드 이름을 지정하여 gRPC 서비스를 호출합니다. JSON은 Protobuf로 변환되어 서비스로 전송됩니다.

$ grpcurl -d '{ \"name\": \"World\" }' localhost:5001 greet.Greeter/SayHello
{
  "message": "Hello World"
}

앞의 예에서:

  • -d 인수는 JSON으로 요청 메시지를 지정합니다. 이 인수는 서버 주소 및 메서드 이름 앞에 와야 합니다.
  • greeter.Greeter 서비스에서 SayHello 메서드를 호출합니다.
  • 응답 메시지를 JSON으로 출력합니다.

위의 예제에서는 \를 사용하여 " 문자를 이스케이프합니다. PowerShell 콘솔에서는 " 이스케이프가 필요하지만 일부 콘솔에서는 이 이스케이프를 사용하면 안 됩니다. 예를 들어 macOS 콘솔에 대한 이전 명령은 다음과 같습니다.

$ grpcurl -d '{ "name": "World" }' localhost:5001 greet.Greeter/SayHello
{
  "message": "Hello World"
}

gRPCui

gRPCui는 gRPC의 대화형 웹 UI입니다. gRPCui는 gRPCurl을 기반으로 합니다. gRPCui는 Swagger UI와 같은 HTTP 도구와 유사한 gRPC 서비스를 검색하고 테스트하기 위한 GUI를 제공합니다.

grpcui 다운로드 및 설치에 대한 자세한 내용은 gRPCui GitHub 홈페이지를 참조하세요.

grpcui 사용

상호 작용할 서버 주소에서 grpcui를 인수로 실행합니다.

$ grpcui localhost:5001
gRPC Web UI available at http://127.0.0.1:55038/

이 도구는 대화형 웹 UI를 사용하여 브라우저 창을 시작합니다. gRPC 서비스가 gRPC 리플렉션을 사용하여 자동으로 검색됩니다.

gRPCui 웹 UI

추가 리소스