티스토리 뷰

We think about IT

[gRPC] gRPC 톺아보기

알 수 없는 사용자 2020. 11. 8. 23:47

gRPC(Google Remote Procedure Call)는 모던하고 어떤 환경에서나 실행할 수 있는 고성능 오픈소스 RPC 프레임워크입니다. 먼저, RPC가 무엇인지 알아보겠습니다.

 

RPC

RPC란 원격 프로시저 호출의 약자로, 클라이언트 애플리케이션에서 백엔드 서버(gRPC서버)의 메소드를 마치 자신의 메서드를 호출하는 것처럼 직접 호출할 수 있습니다. 이는 MSA환경의 서비스를 보다 쉽게 구축할 수 있게 합니다.

구글이 제공하는 RPC 통신 기술을 gRPC라 칭합니다. 개념 자체는 RPC (Remote Procedure Call) 와 크게 다르지 않지만, 세부 구현에 있어서 여러 차이점이 존재합니다.

 

Protocol Buffers

RPC는 클라이언트와 서버 간의 데이터를 주고받기 위해서 직렬화/역직렬화 과정이 필요합니다. 이 작업은 Interface Description Language(IDL)에 의해 수행됩니다.

기본적으로 gRPC는 프로토콜 버퍼(proto3)를 사용하지만 JSON 같은 다른 포맷으로도 사용 가능하다고 합니다.

 

ProtoBuf로 작업할 때, 첫번째 순서로 ". proto"라는 확장자 파일을 생성하고, 직렬화하려는 데이터 구조를 정의합니다.

사람에 대한 메세지를 정의해보도록 하겠습니다.

  
  syntax = "proto3";

  message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
    
    enum PhoneType {
      MOBILE = 0;
      HOME = 1;
      WORK = 2;
    }
    
    message PhoneNumber {
      string number = 1;
      PhoneType type = 2;
    }
    
    repeated PhoneNumber phone = 4;
  }

 

첫 번째 라인에서 ProtoBuf 구문 버전을 명시합니다. 만약 정의하지 않았을 경우 Protocol Buffer 컴파일러는 proto2 버전을 사용하고 있다고 가정합니다.

메시지 정의 시 각 필드의 고유번호가 존재합니다. 이 고유번호는 메시지의 필드를 식별하는 데 사용됩니다. 메서드의 파라미터로 사용할 경우 순서라고도 봐도 되겠습니다.

메시지 타입은 재사용될 수 있으며 repeated라는 키워드로 배열을 정의합니다.

 

언어에 대한 자세한 가이드는 해당 URL에서 확인할 수 있습니다. 

developers.google.com/protocol-buffers/docs/proto3

 

HTTP/2

gRPC는 HTTP/2를 사용합니다.

서버와 클라이언트 간의 스트리밍 통신, 취소 같은 기능을 포함하고 있습니다.

또한 gRPC는 인증, 양방향 스트리밍과 흐름 제어, 블로킹과 논블로킹 바인딩 그리고 시간제한 기능들을 제공합니다. 그리고 Java, Node, Go 그리고 Python 등 다양한 언어에서 실행이 가능합니다.

gRPC-Web이라는 패키지를 활용하여, 웹 브라우저에서도 gRPC로 통신이 가능합니다.


  [HTTP Connection 재사용]
  HTTP/1로 구현된 REST 클라이언트는 요청을 전송할 때마다 새로운 Connection을 생성하기 때문에 상대적으로 
  소모되는 비용이 높습니다. 그렇지만 gRPC는 한 번 연결이 수립되면 이를 계속해서 재사용하며, gRPC에서는 이를 채널
  (Channel) 이라는 개념으로 구현해 놓았습니다. HTTP/1.1 대비 Latency가 약 50% 수준으로 줄어든다고 합니다.

  [멀티플렉싱]
  gRPC는 기본적으로 하나의 Connection에서 여러 요청을 보낼 수 있으며, 그러한 데이터에 대한 우선순위도 설정할 
  수 있습니다. 따라서 HTTP/1 에서 발생할 수 있는 문제인 Head of Line Blocking (HoLB) 을 간접적으로 
  해결할 수 있습니다.

  [메시지 압축]
  gRPC는 HTTP/2의 헤더 압축 기능을 사용하기 때문에 전송되는 데이터의 크기가 줄어듭니다.

  [서버에서 데이터 Push 가능]
  일단 연결이 맺어지면, 서버 <-> 클라이언트 간 양뱡향 데이터 전송이 가능합니다.

 

gRPC-Web

현재 브라우저에서는 HTTP/2를 제공하고 있지 않습니다.

그래서 아이디어로, 브라우저가 Fetch 또는 XHR로 HTTP/1.1 요청을 보내고 백엔드와 프론트엔드 서버 사이에 작은 proxy 서버를 둬서 HTTP/2로 변환하는 작업을 거쳐 gRPC 통신을 합니다.

 

추가 정보는 gRPC의 이 블로그 포스트에서 얻을 수 있습니다.

grpc.io/blog/state-of-grpc-web/#the-grpc-web-spec

 

The state of gRPC in the browser

A high-performance, open source universal RPC framework

grpc.io

 

 

다음 포스트에서는 실제 예제 코드를 가지고 간단한 todo 앱을 만들어보도록 하겠습니다

 

 

 

댓글