gRPC

구글에서 개발한 어느 환경에서 실행할 수 있는 최신 오픈 소스 고성능 RPC 프레임워크다.

RPC

Remote Procedure Call의 약자로 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게 하는 프로세스 간 통신 기술이다.

gRPC를 이용하면 원격에 있는 애플리케이션의 메소드를 로컬 메소드인 것처럼 직접 호출할 수 있기에 분산 애플리케이션과 서비스를 보다 쉽게 만들 수 있다.

  1. stub Stub은 RPC의 행심 개념으로 Parameter 객체를 Message로 Marshalling/ Unmarshalling하는 레이어다. 서버와 클라이언트는 서로 다른 주소 공간을 사용하므로 함수 호출에 사용된 매개 변수를 꼭 변환해줘야 한다.
  • client의 stub은 함수 호출에 사용된 파라미터의 변환 및 함수 실행 후 서버에서 전달된 결과의 변환 담당
  • server의 stub은 클라이언트가 전달한 매개 변수의 역변환 및 함수 실행 결과 변환을 담당
  1. protocol buffer IDL(interface Definition Language)로 protocol buffer를 사용한다. protocol buffer는 직렬 데이터 구조다. 어떤 언어나 플랫폼에서도 통신 프로토콜이나 데이터 저장을 사용할 때, 구조화된 데이터를 전환하게 해주는 방법이다. 그 일례로 JSON, XML이 있다.

프로토콜 버퍼로 작업할 때는 proto file에서 직렬화하는 데이터 구조를 정의한다. 프로토콜 버퍼는 하나의 프로그래밍 언어가 아니라 여러 프로그래밍 언어를 지원하기 때문에, 특정 언어에 종속성이 없는 상태로 타입을 정의하게 된다. key-value 쌍을 포함하는 작은 논리적 레코드인 메시지로 구성된다.

message Person {
  string name = "1";
  int32 id = 2;
  bool isHuman = 1;
}

이렇게 작성된 proto file을 protoc 컴파일러로 컴파일하면 언어에 맞게 데이터 클래스를 생성해준다.

특징

  1. 높은 생산성과 다양한 언어 및 플랫폼 지원 (proto buffer를 사용하기에 프로토콜 버퍼의 IDL만 정의하면 서비스, 메시지에 대한 소스코드가 자동으로 생성되고 데이터를 주고 받을 수 있다.)
  2. HTTP/2 기반 양반향 스트리밍이다.
  3. 성능적으로 ProtoBuffers를 사용해서 직렬화된 바이트 스트림으로 통신하므로 JSON 보다 가볍고 빠르다.

Rest와?

Rest는 서로 느슨하게 결합하기에 클라이언트, 서버가 서로를 크게 알 필요가 없다. 느슨한 커플링으로 확장에 용이하다. 그러나 gRPC는 긴밀하게 결합되기 때문에 클라이언트, 서버에서 동일한 proto 파일에 액세스할 수 있어야 한다.

  1. REST
    • 웹 기반 아키텍쳐
    • 외부 사용자가 쉽게 이해할 수 있는 공개 API
    • 간단한 통신
  2. gRPC
    • 고성능 시스템
    • 많은 양의 데이터 로드
    • 실시간 또는 스트리밍 애플리케이션
  gRPC API REST API
무엇인가요? 원격 프로시저 호출(RPC) 클라이언트-서버 통신 모델을 기반으로 API를 만들고 사용하는 시스템입니다. 클라이언트와 서버 간의 정형 데이터 교환을 정의하는 일련의 규칙입니다.
설계 접근 방식 서비스 지향 설계. 클라이언트는 서버에 서버 리소스에 영향을 줄 수도 있고 아닐 수도 있는 서비스 또는 기능을 수행해 줄 것을 요청합니다. 엔터티 지향 설계. 클라이언트에서 서버에 리소스의 생성, 공유 또는 수정을 요청합니다.
통신 모델 단방향, 단일 서버-다중 클라이언트, 단일 클라이언트-다중 서버, 다중 클라이언트-다중 서버 등 다양한 옵션이 있습니다. 단방향. 단일 클라이언트가 단일 서버와 통신합니다.
구현 작동하려면 클라이언트 측과 서버 측 모두에 gRPC 소프트웨어가 필요합니다. 공통 소프트웨어 없이 클라이언트 측과 서버 측에서 다양한 형식으로 구현할 수 있습니다.
데이터 액세스 서비스(기능) 직접 호출 리소스를 정의하는 URL 형태의 여러 엔드포인트
반환된 데이터 Protocol Buffer 파일에 정의된 서비스의 고정된 반환 유형으로 반환됩니다 서버에서 정의하는 고정 구조(일반적으로 JSON)로 반환됩니다.
클라이언트-서버 커플링 긴밀하게 결합됩니다. 클라이언트와 서버 모두에 데이터 형식을 정의하는 동일한 Protocol Buffer 파일이 필요합니다. 느슨하게 결합됩니다. 클라이언트와 서버는 내부 세부 정보를 인식하지 못합니다.
자동 코드 생성 기본 제공 기능 서드 파티 도구가 필요합니다.
양방향 스트리밍 있음 없음
가장 적합한 용도 고성능 또는 데이터 사용량이 많은 마이크로서비스 아키텍처 리소스가 잘 정의되어 있는 단순한 데이터 소스