개발/잡다

GRPC란? - 정의 및 통신 방식

말고기 2021. 12. 31. 18:08
728x90
반응형

GRPC란?

  • RPC: 원격으로 method call을 할 수 있게 만들어진 방식
  • GRPC의 경우 이를 protocol buffer 및 HTTP2 방식으로 편리하게 구현할 수 있게 하였다.

 

특징

  1. 낮은 데이터 payload: rest API의 경우 HTTP의 텍스트 기반으로 전송된다. 하지만 GRPC는 binary 기반으로 전송하기 때문에 효율성이 좋다.
  2. IDL을 통한 강한 타입 체킹: protocol bufferIDL을 통해 rest API에 비해서 강한 타입 체킹이 가능하다.
  3. HTTP/2 지원: GRPC는 HTTP/2의 stream을 활용하기 때문에 HTTP/2를 통한 rest API에도 호환이 가능하다.
  4. 다양한 통신 방식을 지원: server stream 또는 client stream 또는 양방향 stream 방식을 지원한다.

 

구조

GRPC의 구조는 아래와 같다.

  1. Client 그리고 server쪽에 stub을 생성한다.
  2. 정의된 IDL을 토대로 request 또는 response를 생성하여 통신한다.

 

Protocol Buffer ( IDL )

  • grpc는 protocol buffer IDL 파일을 생성하여 이를 정의한다.
  • 우선 실제 파일을 한 번 살펴보자.
// heroes.proto

// protocol buffer의 version을 정의한다.
syntax = "proto3";

// 아래 내용이 어디 package에 포함될 것인지 정의한다.
package hero;

// rpc에 대한 인터페이스를 정의한다. 파라미터와 리턴값은 아래의 message로 정의한다.
service HeroesService {
    rpc FindOne (HeroById) returns (Hero) {}
}

// 실제 주고 받는 message들을 의미한다.
message HeroById {
    int32 id = 1;
}

message Hero {
    int32 id = 1;
    string name = 2;
}

 

HTTP/2 ??

  • GRPC 관련 자료를 검색하다 보면 http/2와 관련된 내용이 많이 나오는 것을 확인할 수 있다.
  • 이는 통신 프로토콜을 HTTP/2를 사용하는 방식으로 구현이 되어 있기 때문이다.
  • 물론 content-type자체가 application/grpc이기 때문에 이를 언마샬링하기 위한 stub이 필요하다.
  • 아래에서 grpc에서 지원하는 통신 방식을 살펴보면서 실제로 통신이 어떻게 이루어지는지 살펴보도록 하자.
  • HTTP/2에 대한 내용은 Google HTTP 소개를 참조하면 좋다.

 

통신 방식

  • grpc에서 지원하는 통신 방식은 크게 4가지로 나눌 수 있다.
    1. unary (request, response): 가장 기본적인 request, response pattern이다.
    2. server streaming: 단일 request에 여러개의 response를 보내는 방식이다.
    3. client streaming: 여러 request에 단일 response를 응답하는 방식이다.
    4. bidirectional streaming RPC: 여러 request에 여러 response를 응답하는 방식이다.
  • 아래에서 자세한 내용을 알아보도록 하자.

1. unary 방식

  • 가장 기본적인 방식이다.
  • 아래와 같이 HTTP/2를 통해서 stream을 생성하고, 이를 통해 request와 response를 주고 받는다.
  • 아래에서 data frame으로 message를 주고 받는 것을 볼 수 있다.

아래는 request의 예제이다.

아래는 response이다.

2. server streaming 방식

  • 기본적으로는 위의 unary 방식과 같고, data frame이 지속적으로 보내지는 것을 확인할 수 있다.
  • 아래의 두 가지 예제는 같은 데이터를 보내지만 message 보내는 간격에 따라서 message당 data frame을 생성하는지 아니면 한 data frame에 여러 message를 보내는지에 대한 차이를 보여준다.

1. no-delay

2. delay를 준 경우

3. client streaming 방식

  • 해당 방식도 위와 유사하다.
  • data frame을 통해서 client에서 message를 송신하고, 이를 server에서 단일 response로 응답하는 방식이다.

4. bidirectional streaming RPC

  • 해당 방식은 http/2 connection을 맺은 후에 양쪽 모두 message를 주고 받는 형태이다.
  • 해당 방식의 특징은 server 또는 client가 따로 응답을 기다리지 않는다는 것이다.
  • 아래의 경우에는 client message를 받은 후 바로 응답하게 되어 있어서 주고 받는 것처럼 보이지만 실제로 기다리지는 않는다.

결론

  • 우선 정의 및 통신 방식에 대해서 개략적으로 공부해보았다.
  • 다음에는 metadata, error handle 그리고 TLS 설정 관련 부분에 대해서 정리하려고 한다.

출처

728x90
반응형