gRPC 디버깅 클라이언트 BloomRPC를 사용해 보았습니다.

14588 단어 C#gRPC
【Qiita】 쉽게 gRPC가 두드리는 OSS 툴 BloomRPC 에서 소개되고 있는 BloomRPC 를 사용해 보았습니다. 서비스 개발시의 디버깅에 편리할 것 같습니다.

BloomRPC란?



【Github】BloorRPC

gRPC GUI 클라이언트입니다.
JSON 형식으로 작성된 요청 데이터를 실행 중인 서비스로 전송하여 응답 데이터의 내용을 확인할 수 있습니다.
스트림에도 대응하고 있습니다.

스크린샷





설치



각 플랫폼에 대한 설치 프로그램이 게시되었습니다.
windows 버전 (bloomrpc-setup-1.3.1.exe)을 설치했습니다.

사용법


  • Protos 오른쪽 상단의 + 버튼을 클릭하여 대상 proto 파일을 읽습니다.
  • 실행할 트리에서 메소드를 선택합니다.
  • 서비스의 끝점을 입력합니다.
  • 요청 필드의 편집기에 요청 데이터를 작성합니다.
  • 요청 필드와 응답 필드 사이의 실행 버튼을 클릭합니다.
  • 응답 필드에 응답 데이터가 표시됩니다.

  • 스트림 조작



    Interactive/manual 에 의해 스트림 송수신의 조작이 바뀝니다.

    요청 스트림 제출



    Interactive
  • 실행 버튼을 누르면 스트림 전송이 시작되고 편집기에 설명 된 요청이 전송됩니다.
  • 요청 측에 탭이 추가되어 제출한 요청의 내용이 표시됩니다.
  • Push 버튼을 누를 때마다 편집기에 설명 된 요청이 전송됩니다.
  • Commit 버튼을 누르면 스트림 전송이 완료됩니다.

  • manual
  • Push/Commit 버튼은 더 이상 표시되지 않으며 한 번만 전송됩니다. 요청 측의 편집기에 어떻게 쓰는지 몰랐습니다. 요청을 배열로 작성하면 응답에 빈 배열이 반환되어 예상 결과가 아닙니다.

  • 응답 스트림 수신



    Interactive
  • 서비스에서 응답을 받을 때마다 탭이 추가되고 응답 내용이 표시됩니다.

  • manual
  • 서비스에서 응답을 받을 때마다 덮어쓰기됩니다. 탭은 추가되지 않습니다.

  • 요청 헤더



    METADATA 열에서 요청 헤더에 저장할 데이터를 지정할 수 있습니다.
    아래 이미지는 Visual Studio에서 디버깅할 때 요청 헤더의 내용입니다. METADATA 열에 설명한 "id":"123"이 포함되어 있음을 알 수 있습니다.



    확인에 사용한 proto 파일


    
    syntax = "proto3";
    
    import "timestamp.proto";
    
    option csharp_namespace = "SampleIDL";
    
    message SampleRequest
    {
        string Name = 1;
        int32 Count = 2;
    }
    
    message SampleResponse
    {
        string Name = 1;
        google.protobuf.Timestamp UpdateTime = 2;
    }
    
    message SampleResponseList
    {
        repeated SampleResponse Items = 1;
    }
    
    service SampleService
    {
        rpc Unary(SampleRequest) returns (SampleResponseList);
        rpc ClientStream(stream SampleRequest) returns (SampleResponseList);
        rpc ServerStream(SampleRequest) returns (stream SampleResponse);
        rpc DuplexStream(stream SampleRequest) returns (stream SampleResponse);
    }
    

    확인에 사용한 서비스 구현



    SampleRequest.Count 로 지정된 수만큼 SampleResponse 를 생성해 돌려주고 있을 뿐입니다.
    class SampleServiceImpl : SampleService.SampleServiceBase
    {
        internal SampleServiceImpl() : base()
        {
        }
    
        public async override Task<SampleResponseList> Unary(SampleRequest request, ServerCallContext context)
        {
            SampleResponseList list = new SampleResponseList();
    
            foreach (SampleResponse response in GetResponses(request))
            {
                await RamdomDelayAsync();
                list.Items.Add(response);
            }
    
            return list;
        }
    
        public async override Task<SampleResponseList> ClientStream(IAsyncStreamReader<SampleRequest> requestStream, ServerCallContext context)
        {
            SampleResponseList list = new SampleResponseList();
    
            while (await requestStream.MoveNext())
            {
                foreach (SampleResponse response in GetResponses(requestStream.Current))
                {
                    await RamdomDelayAsync();
                    list.Items.Add(response);
                }
            }
    
            return list;
        }
    
        public async override Task ServerStream(SampleRequest request, IServerStreamWriter<SampleResponse> responseStream, ServerCallContext context)
        {
            foreach (SampleResponse response in GetResponses(request))
            {
                await RamdomDelayAsync();
                await responseStream.WriteAsync(response);
            }
        }
    
        public async override Task DuplexStream(IAsyncStreamReader<SampleRequest> requestStream, IServerStreamWriter<SampleResponse> responseStream, ServerCallContext context)
        {
            while (await requestStream.MoveNext())
            {
                foreach (SampleResponse response in GetResponses(requestStream.Current))
                {
                    await RamdomDelayAsync();
                    await responseStream.WriteAsync(response);
                }
            }
        }
    
        private IEnumerable<SampleResponse> GetResponses(SampleRequest request)
        {
            for (int i = 0; i < request.Count; ++i)
            {
                yield return new SampleResponse()
                {
                    Name = string.Format("{0} {1}", request.Name, i + 1),
                    UpdateTime = Timestamp.FromDateTimeOffset(DateTimeOffset.Now)
                };
            }
        }
    
        private Task RamdomDelayAsync()
        {
            return Task.Delay(random.Next(1000));
        }
        static Random random = new Random();
    
    }
    

    좋은 웹페이지 즐겨찾기