1. gRPC 란
- Protocol Buffer를 IDL (Interface Definition Language)로 사용하는 RPC 프레임워크
- 구글에서 10년 이상동안 MSA 아키텍쳐 이하 수많은 시스템들, 데이터 센터 간 통신을 위해 사용하던 범용 RPC 프레임워크인
Stubby
를 오픈소스화해 공개한 것
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
5message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; }
- 프로토 파일을 protoc(프로토콜 버퍼 컴파일러)로 원하는 언어에서 사용가능한 결과물로 컴파일하여 사용한다.
2. gRPC 의 특징
- 높은 생산성과 효율적인 유지보수
- 서비스와 메시지를 정의하기 위해 오직 ProtoBuf 만을 사용
- 다양한 언어와 플랫폼 지원
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+ |
- HTTP/2 기반 통신
- gRPC 는 HTTP/2 기반 통신으로 기존 HTTP 과는 다르게 서버와 클라이언트가 서로 데이터를 스트리밍으로 주고 받을 수 있음
- simple RPC : 클라이언트 요청에 서버가 응답하고 종료
- server-side streaming RPC : 클라이언트 요청에 응답을 여러번 보냄
- client-side streaming RPC : 클라이언트가 요청을 여러번 보내고, 요청이 끝나면 응답을 보냄
- bidirectional streaming RPC : 양방향 독립적으로 요청/응답을 보냄
- 기존 HTTP 보다 높은 헤더 압축률이 보장되고, ProtoBuf의 직렬화에 의해 전송되는 메시지가 획기적으로 줄어듬
- gRPC 는 HTTP/2 기반 통신으로 기존 HTTP 과는 다르게 서버와 클라이언트가 서로 데이터를 스트리밍으로 주고 받을 수 있음
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 로 표현하고, 페이로드 처리는 각 서버/클라이언트 측에서 각각 부담
- gRPC는 proto파일에 정의한
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 공식 문서)