[GRPC] 1. GRPC 살펴보기
GRPC 란?
- Google 에서 만든 RPC
- Google Remote Procedure Call
- 다른 RPC 와 같이 IDL(interface definition language) 를 이용하여 정의함.
살펴보기 전에…
IDL
- Interface definition language
- 어느 한 언어에 국한되지 않는 언어중립적인 방법으로 인터페이스를 표현함으로써, 같은 언어를 사용하지 않는 소프트웨어 컴포넌트 사이의 통신을 가능하게 함.
- https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%A0%95%EC%9D%98%EC%96%B8%EC%96%B4
RPC 란?
- 네트워크로 연결된 서버 상의 프로시저를 원격으로 호출할 수 있는 기능.
- IDL(Interface Definition Language) 기반으로 다양한 언어를 가진 환경에서도 쉽게 확장 가능.
- 대표적인 구현체는
GRPC
, Facebook의 Thrift, Twitter의 Finalge
- 대표적인 구현체는
- Stub(스텁)
- Stub Compiler가 IDL 파일을 읽어 원하는 Language로 생성.
- Parameter Object를 Message로 marshalling/unmarshalling하는 Layer
HTTP/2
- http/1 와 차이점
- 클라이언트 -> 서버
- 요청 단위로 클라이언트와 서버를 왕복
- 요청이 올때만 전달 가능.
- 쿠키 등을 포함한 header 가 무거움
- http/2 의 장점
- Header compression
- header table 과 huffman encoding 기법을 사용하여 헤더정보를 압축
- Multiplexed Streams
- http/1 에서는 요청단위로 커넥션 생성하지만, http/2 에서는 한개의 커넥션으로 여러개의 메시지를 동시에 주고 받을 수 있음.
- Server Push
- 요청없이도 서버가 리소스를 보낼 수 있음.
- 클라이언트 요청을 최소화 할 수 있음.
- Header compression
ProtoBuf
- grpc 에서 idl 로 사용함.
- 데이터 직렬화 라이브러리로 사용
- 구글에서 만들었음.
- 바이너리로 직렬화된 메시지를 교환하므로 텍스트 기반의 Json이나 Xml 에 비해 크기가 작음.
- 직렬화 등의 비용이 적게 들어감.
- proto 파일을 통해 protoc 컴파일러를 통해 소스코드 생성
-
뒤에서 좀 더 자세하게 작성 예정…
- 기본구조
- syntax : proto 버전, default proto2
- package : 여기에 정의된 패키지로 stub 이 생성된다.
- service : 실제 서비스를 정의하고 인터페이스를 이안에서 정의.
- rpc : 메소드 인터페이스, request, response, stream 등 키워드로 정의
- message : rpc 통신을 할 때 주고 받을 모델 정의
GRPC 장점
- 유지보수하기가 쉽다.
- Protocol Buffers 를 사용
- 자동으로 소스 생성
- 다양한 언어와 플랫폼을 지원함.
- 공식적으로 지원하는 언어는 https://www.grpc.io/docs/languages/ 참고.
- Http/2 기반으로 양방향 스트리밍 가능
- ….
GRPC 단점
- protobuf http/2 에 대한 러닝커브가 있음.
- 기존 rest api 와 다르게 메시지가 바이너리로 전달되기 때문에 테스트가 쉽지 않음.
- 메시지 구조 등이 많이 변할 경우, 놓치는 부분이 생길 수 있으므로 CI 등을 도입하여 안정성을 확보할 필요가 있다.
- 개발 프로세스 복잡도가 증가할 수 있음.
GRPC lifecycle
- 총 4가지 방식이 있음.
- Client-Side 에서는 Marshaling(마샬링)을 수행
- Server-Side 에서는 Unmarshaling(언마샬링)을 수행
- https://grpc.io/docs/what-is-grpc/core-concepts
Unary RPC
- 클라이언트에서 서버로
단일 요청
, 서버는단일 응답
하는 형태
rpc xxx(yyyRequest) returns (zzzResponse);
Server Streaming RPC
- 클라이언트에서 서버로
단일 요청
, 서버는연속적인 스트림 응답
하는 형태 - 클라이언트는 완료처리가 될때까지 스트림 데이터를 수신함.
rpc xxx(yyyRequest) returns (stream zzzResponse);
Client Streaming RPC
- 클라이언트에서 서버로
연속적인 스트림 요청
, 서버는단일 응답
하는 형태 - 서버는 완료처리 될때까지 스트림 데이터를 수신함.
- 수신 도중 스트림을 취소하여 클라이언트의 메시지를 조기에 중단 할 수 있음.
rpc xxx(stream yyyRequest) returns (zzzResponse);
Bidirectional Streaming RPC
- 클라이언트, 서버 모두 독립적으로 동작하는 스트림을 이용하여 서로가 서로에게 완료처리가 될때까지 연속적인 스트림을 전달.
rpc xxx(stream yyyRequest) returns (stream zzzResponse);
클라이언트 Stub
- https://grpc.io/docs/languages/java/generated-code/#client-stubs
Asynchronous Stub
-
모든 방식의 RPC 사용 가능
-
Java 에서 생성하는 법
ServiceNameGrpc.newStub(Channel channel)
Blocking Stub
-
Unary RPC, Server Streaming RPC 만 사용가능
-
Java 에서 생성하는 법
ServiceNameGrpc.newBlockingStub(Channel channel)
Future Stub
- Streaming 호출을 지원하지 않음.
-
Unary RPC 만 사용 가능.
- Java 에서 생성하는 법
ServiceNameGrpc.newFutureStub(Channel channel)
추가로…
외부 Rest API 를 제공할 경우
- https://github.com/grpc-ecosystem/grpc-gateway
- grpc-gateway 를 사용하면 제공 가능.
GRPC vs REST
- protobuf vs json or xml
- http 버전
- http/2 의 장점…
- 이건 뭐 올리면 될 것 같은데…
- ….
참고링크
- https://nesoy.github.io/articles/2019-07/RPC
- https://meetup.toast.com/posts/261