개발/잡다
GRPC란? - 정의 및 통신 방식
말고기
2021. 12. 31. 18:08
728x90
반응형
GRPC란?
- RPC: 원격으로 method call을 할 수 있게 만들어진 방식
- GRPC의 경우 이를 protocol buffer 및 HTTP2 방식으로 편리하게 구현할 수 있게 하였다.
특징
- 낮은 데이터 payload: rest API의 경우 HTTP의 텍스트 기반으로 전송된다. 하지만 GRPC는 binary 기반으로 전송하기 때문에 효율성이 좋다.
- IDL을 통한 강한 타입 체킹: protocol bufferIDL을 통해 rest API에 비해서 강한 타입 체킹이 가능하다.
- HTTP/2 지원: GRPC는 HTTP/2의 stream을 활용하기 때문에 HTTP/2를 통한 rest API에도 호환이 가능하다.
- 다양한 통신 방식을 지원: server stream 또는 client stream 또는 양방향 stream 방식을 지원한다.
구조
GRPC의 구조는 아래와 같다.
- Client 그리고 server쪽에 stub을 생성한다.
- 정의된 IDL을 토대로 request 또는 response를 생성하여 통신한다.
Protocol Buffer ( IDL )
- grpc는 protocol buffer IDL 파일을 생성하여 이를 정의한다.
- 우선 실제 파일을 한 번 살펴보자.
// heroes.proto
// protocol buffer의 version을 정의한다.
syntax = "proto3";
// 아래 내용이 어디 package에 포함될 것인지 정의한다.
package hero;
// rpc에 대한 인터페이스를 정의한다. 파라미터와 리턴값은 아래의 message로 정의한다.
service HeroesService {
rpc FindOne (HeroById) returns (Hero) {}
}
// 실제 주고 받는 message들을 의미한다.
message HeroById {
int32 id = 1;
}
message Hero {
int32 id = 1;
string name = 2;
}
- 위의 IDL 파일을 통해서 grpc library는 stub 또는 server를 생성해서 통신하게 된다.
- 해당 부분의 구현은 microservice (grpc) 를 사용해보자 - 튜토리얼편을 참조해봐도 좋을 것 같다.
HTTP/2 ??
- GRPC 관련 자료를 검색하다 보면 http/2와 관련된 내용이 많이 나오는 것을 확인할 수 있다.
- 이는 통신 프로토콜을 HTTP/2를 사용하는 방식으로 구현이 되어 있기 때문이다.
- 물론 content-type자체가 application/grpc이기 때문에 이를 언마샬링하기 위한 stub이 필요하다.
- 아래에서 grpc에서 지원하는 통신 방식을 살펴보면서 실제로 통신이 어떻게 이루어지는지 살펴보도록 하자.
- HTTP/2에 대한 내용은 Google HTTP 소개를 참조하면 좋다.
통신 방식
- grpc에서 지원하는 통신 방식은 크게 4가지로 나눌 수 있다.
- unary (request, response): 가장 기본적인 request, response pattern이다.
- server streaming: 단일 request에 여러개의 response를 보내는 방식이다.
- client streaming: 여러 request에 단일 response를 응답하는 방식이다.
- bidirectional streaming RPC: 여러 request에 여러 response를 응답하는 방식이다.
- 아래에서 자세한 내용을 알아보도록 하자.
1. unary 방식
- 가장 기본적인 방식이다.
- 아래와 같이 HTTP/2를 통해서 stream을 생성하고, 이를 통해 request와 response를 주고 받는다.
- 아래에서 data frame으로 message를 주고 받는 것을 볼 수 있다.
아래는 request의 예제이다.
아래는 response이다.
2. server streaming 방식
- 기본적으로는 위의 unary 방식과 같고, data frame이 지속적으로 보내지는 것을 확인할 수 있다.
- 아래의 두 가지 예제는 같은 데이터를 보내지만 message 보내는 간격에 따라서 message당 data frame을 생성하는지 아니면 한 data frame에 여러 message를 보내는지에 대한 차이를 보여준다.
1. no-delay
2. delay를 준 경우
3. client streaming 방식
- 해당 방식도 위와 유사하다.
- data frame을 통해서 client에서 message를 송신하고, 이를 server에서 단일 response로 응답하는 방식이다.
4. bidirectional streaming RPC
- 해당 방식은 http/2 connection을 맺은 후에 양쪽 모두 message를 주고 받는 형태이다.
- 해당 방식의 특징은 server 또는 client가 따로 응답을 기다리지 않는다는 것이다.
- 아래의 경우에는 client message를 받은 후 바로 응답하게 되어 있어서 주고 받는 것처럼 보이지만 실제로 기다리지는 않는다.
결론
- 우선 정의 및 통신 방식에 대해서 개략적으로 공부해보았다.
- 다음에는 metadata, error handle 그리고 TLS 설정 관련 부분에 대해서 정리하려고 한다.
출처
728x90
반응형