gRPC Reference - 개요 및 특징

1. gRPC 란

  • Protocol Buffer를 IDL (Interface Definition Language)로 사용하는 RPC 프레임워크
  • 구글에서 10년 이상동안 MSA 아키텍쳐 이하 수많은 시스템들, 데이터 센터 간 통신을 위해 사용하던 범용 RPC 프레임워크인 Stubby를 오픈소스화해 공개한 것 basic.png

1.1. RPC란?

  • RPC (Remote Procedure Call)은 별도의 원격제어 없이 프로세스간 함수나 프로시저를 호출할 수 있도록 하는 통신 기술
  • 서로 통신하는 양 측의 Request, Response에 대한 인터페이스를 정의 후 양 측 프로그래밍 언어에 맞는 코드로 변환해야함.
  • 이 때 인터페이스를 정의하는 용어는 IDL(Interface Definition Language)라 함
  • IDL이 컴파일러 등으로 특정 언어의 코드로 변환된 결과를 Skeleton (서버 측), Stub (클라이언트 측) 라 함

1.2. Protocol Buffer (ProtoBuf)

  • 구글에서 개발한 데이터 직렬화 오픈소스로 gRPC의 IDL로 사용
  • 직렬화하려는 데이터의 구조를 프로토 파일에 정의 (.proto)
  • ProtoBuf의 데이터는 message 들로 구성되며 각 message는 field (name, value pair) 로 구성
    1
    2
    3
    4
    5
    message Person {
      string name = 1;
      int32 id = 2;
      bool has_ponycopter = 3;
    }
    
  1. 프로토 파일을 protoc(프로토콜 버퍼 컴파일러)로 원하는 언어에서 사용가능한 결과물로 컴파일하여 사용한다.

2. gRPC 의 특징

  1. 높은 생산성과 효율적인 유지보수
    • 서비스와 메시지를 정의하기 위해 오직 ProtoBuf 만을 사용
  2. 다양한 언어와 플랫폼 지원
Language Platform Compiler
C/C++ Linux/Mac GCC 4.8+, Clang 3.3+
C/C++ Windows 7+ Visual Studio 2015+
C# Linux/Mac .NET Core, Mono 4+
C# Windows 7+ .NET Core, .NET 4.5+
Dart Windows/Linux/Mac Dart 2.0+
Go Windows/Linux/Mac Go 1.6+
Java Windows/Linux/Mac JDK 8 recommended. Gingerbread+ for Android
Node.js Windows/Linux/Mac Node v4+
Objective-C Mac OS X 10.11+/iOS 7.0+ Xcode 7.2+
PHP (Beta) Linux/Mac PHP 5.5+ and PHP 7.0+
Python Windows/Linux/Mac Python 2.7 and Python 3.4+
Ruby Windows/Linux/Mac Ruby 2.3+
  1. HTTP/2 기반 통신
    • gRPC 는 HTTP/2 기반 통신으로 기존 HTTP 과는 다르게 서버와 클라이언트가 서로 데이터를 스트리밍으로 주고 받을 수 있음
      • simple RPC : 클라이언트 요청에 서버가 응답하고 종료
      • server-side streaming RPC : 클라이언트 요청에 응답을 여러번 보냄
      • client-side streaming RPC : 클라이언트가 요청을 여러번 보내고, 요청이 끝나면 응답을 보냄
      • bidirectional streaming RPC : 양방향 독립적으로 요청/응답을 보냄
    • 기존 HTTP 보다 높은 헤더 압축률이 보장되고, ProtoBuf의 직렬화에 의해 전송되는 메시지가 획기적으로 줄어듬

3. gRPC vs REST

  • Payload 의 차이
    • gRPC는 Protobuf 형식 자체 직렬화된 데이터
    • REST 는 JSON 데이터를 주고받음
  • HTTP 버전의 차이
    • gRPC는 HTTP/2 기반 통신
    • REST는 일반적으로 HTTP/1.1 통신
    • 때문에 gRPC는 스트리밍, 헤더 압축 등 HTTP/2 의 여러 장점을 확보
  • 호출방식의 차이
    • gRPC는 proto파일에 정의한 message, service 를 각 언어에 필요한 형태로 generate됨. 클라이언트에서 service 메소드를 호출하면 그에 해당하는 서버에서 구현한 service가 실행되고, 요청/응답 페이로드는 언어에 맞게 generate 결과를 사용
    • REST는 endpoint 를 HTTP Method + URI 로 표현하고, 페이로드 처리는 각 서버/클라이언트 측에서 각각 부담

4. gRPC의 활용

  • gRPC는 단일 인스턴스로 동작하는 CRUD 웹 애플리케이션에서 부터 수십 수백개의 인스턴스가 상호 작용하는 MSA 까지 모든 구조에서 사용 가능
  • 클라이언트 측에 gRPC 스텁을 library 등으로 제공해줘야하는 부분은 존재하는등 몇 가지 한계점도 존재 -> 호출 인터페이스 측면에서 웹 환경에서 사용한다면 REST 방식에 비해 일부제약
  • gRPC Gateway 플러그인을 사용하면 gRPC 서비스에 REST API 인터페이스를 제공할 수 있게 go 런타임에서 작동하는 프록시 서버와 Swagger 문서를 generate 해준다. (go 이외 다른 언어는 미지원) 때문에 gRPC 서비스를 이용할 준비가 되지 않은 클라이언트의 경우나 웹 환경에서 사용 가능
  • https://github.com/wejrowski/grpc-gateway-java-gradle (Spring Boot gRPC + grpc-gateway 예시)
  • https://grpc-ecosystem.github.io/grpc-gateway/ (grpc-gateway 공식 문서) grpc-gateway.png
0%