suyeonme

gRPC, gRPC-gateway란? 본문

프로그래밍👩🏻‍💻/기타

gRPC, gRPC-gateway란?

suyeonme 2024. 7. 19. 22:00

gRPC란?

gRPC (gRPC Remote Procedure Call)는 Google에서 개발한 언어에 상관없이 사용할 수 있는 고성능 PRC 프레임워크이다. 특히 마이크로서비스 아키텍처에서 많이 사용된다.

https://grpc.io/img/landing-2.svg

gRPC 특징

  • HTTP/2 기반으로 동작한다. HTTP/2의 멀티플렉싱 기능을 통해 하나의 커넥션에서 동시에 여러 요청과 응답을 처리할 수 있다. 따라서 네트워크 성능이 향상되고, 지연 시간이 줄어든다.
  • Protocol Buffer(Protobuf)를 데이터 직렬화 포맷으로 사용한다. Protobuf는 데이터 구조를 컴팩트하게 직렬화하며, JSON보다 더 빠르고 효율적인 직렬화와 역직렬화를 제공한다. (전송속도 향상 및 대역폭 절약)
  • 다양한 언어 지원
  • 클라이언트와 서버 간의 양방향 스트리밍을 지원한다. 따라서 실시간 데이터 전송에 유용하다.

HTTP/2의 특징

  • Binary Protocol을 사용해서 데이터를 전송한다. 따라서 데이터의 직렬화와 파싱이 효율적이다. 
  • Multiplexing: 하나의 TCP 연결에서 여러 요청과 응답을 동시에 처리할 수 있다. 따라서 네트워크 효율성을 향상시키고 요청 및 응답간의 지연시간을 줄인다.
  • HPACK: HPACK이라는 헤더 압축 알고리즘을 사용해서 요청과 응답 헤더를 압축한다. 헤더의 중복을 줄이고 전송 데이터의 크기를 줄여 네트워크 대역폭을 절약한다.
  • Server Push: 서버가 클라이언트의 요청을 예상하고 필요한 리소스를 클라이언트에게 미리 전송할 수 있다.

RPC(Remote Procedure Call)란?

RPC는 네트워크를 통해 다른 컴퓨터에서 프로시저(함수)를 호출할 수 있게 해주는 프로토콜로, 분산 시스템에서 서로 다른 프로세스 간에 통신을 가능하게 해준다.

 

마이크로서비스 아키텍처의 경우, 각 서버는 다양한 언어로 개발될 수 있다. PRC를 사용하면 언어에 상관없이 원격에 있는 프로시저를 로컬 메서드처럼 호출할 수 있다.

gRPC 구성요소

Stub

gRPC의 클라이언트와 서버 간의 인터페이스를 정의하고 구현하는 역할을 한다.

  • 클라이언트 Stub: 클라이언트에서 원격 프로시저를 호출하는 데 사용되는 객체이다. 해당 stub으로 서버의 메서드를 로컬 메서드처럼 호출할 수 있다.
  • 서버 Stub: 서버 측에서 클라이언트의 요청을 처리하는 데 사용되는 객체입니다. 해당 stub으로 클라이언트의 요청을 수신하고, 적절한 로직을 수행하여 응답을 클라이언트에게 반환합니다.

Protocol Buffer(Protobuf)

데이터 구조를 정의(Interface Definition Language, IDL)하고, 이 구조에 따라 데이터를 직렬화하고 역직렬화한다. Protobuf는 다양한 프로그래밍 언어와 플랫폼에서 사용될 수 있는 데이터를 정의하는 방법을 제공한다.

 

Protobuf는 protoc(Protobuf 컴파일러)를 이용해서 .proto 파일을 기반으로 다양한 프로그래밍 언어에 맞는 소스 코드를 자동으로 생성한다.

  • 직렬화: 바이트 스트림으로 변환
  • 역직렬화: 바이트 스트림을 원래 구조로 복원
  • .proto 파일: 데이터 구조와 메시지 형식을 정의
# proto file
syntax = "proto3";

// 메시지 정의
message Person {
  int32 id = 1;
  string name = 2;
  string email = 3;
}

// RPC 서비스 정의
service ExampleService {
  rpc GetPerson (PersonRequest) returns (Person);
}

// 요청 메시지 정의
message PersonRequest {
  int32 id = 1;
}

gRPC-gateway란?

gRPC 서버와 HTTP/JSON API 간의 브릿지 역할을 하는 도구이다. Protocol Buffers 문서를 기반으로 gRPC 서버에서 정의된 메서드를 HTTP/JSON API로 자동 변환하여, RESTful API와 gRPC를 동시에 제공한다.

 

클라이언트가 RESTful(HTTP/JSON) API로 서버에 요청하면 gRPC-gateway가 해당 요청을 gRPC로 변환한다. 따라서 gRPC 서버와 REST 클라이언트간의 통신이 가능해진다. -> gRPC는 Protocol Buffer를 사용해서 데이터를 직렬화하기 때문에 직접 HTTP/JSON 요청을 보낼 수 없기때문!

Comments