suyeonme
gRPC, gRPC-gateway란? 본문
gRPC란?
gRPC (gRPC Remote Procedure Call)는 Google에서 개발한 언어에 상관없이 사용할 수 있는 고성능 PRC 프레임워크이다. 특히 마이크로서비스 아키텍처에서 많이 사용된다.
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 요청을 보낼 수 없기때문!
'프로그래밍👩🏻💻 > 기타' 카테고리의 다른 글
Kustomize, ArgoCD에 대해서 알아보기 (1) | 2024.09.29 |
---|---|
데이터 파이프라인이란? (0) | 2024.07.12 |
Makefile이란? (0) | 2024.07.07 |
.envrc 파일로 환경변수 자동으로 설정하기 (0) | 2024.07.07 |
[Nestjs, Axios] Access Token과 Refresh Token으로 인증 구현하기(클라이언트, 서버) (0) | 2024.06.18 |