MSA와 같은 분산 서비스 시스템에서 느슨한 결합과 효율적인통신을 위해 고안된 방법입니다.
[그림] - Soap, REST, gRPC의 기본 데이터 전송 포멧의 장단점 비교
Protocol Buffer란, gRPC에서 구조화된 데이터를 직렬화하기 위한 오픈소스 메커니즘입니다. 언어와 플랫폼에 중립적으로 동작합니다. (영향을 받지 않습니다)
자세한 스펙은 https://protobuf.dev/ 를 참고해주세요!
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
gRPC는 서버와 클라이언간 이진 바이트 통신을 하기 위해 Protocol Buffer를 기본 전략으로 사용합니다.
*.proto파일에 데이터 구조를 정의합니다. 직렬화하고싶은 데이터를 위와 같이 key-value필드로 매핑해 *.proto 파일로 작성합니다.
protoc은 프로토콜 버퍼 컴파일러입니다.
이는 *.proto 파일에서 정의한 내용으로 특정 언어가 데이터에 접근할 수 있는 클래스파일을 생성합니다.
name(), set_name()과 같은 메서드를 통해 raw bytes에서 메시지로 직렬화하거나 그 반대로 파싱할 수 있습니다.
출처 Geeks for geeks
stream을 통해 대량 데이터가 전달될 수도 있습니다. 그래도 gRPC의 프로그래밍 API에서는 대부분 비동기 처리를 지원하므로, stream data 및 단일 요청에 대해서도 Blocking없이 비동기적으로 처리 가능합니다.
Unary RPC
클라이언트에서 단일 요청을 보내고, 서버가 단일 응답을 보낸다.
rpc SayHello(HelloRequest) returns (HelloResponse);
Server Streaming RPC
클라이언트가 단일 요청을 보내고, 서버가 스트림을 통해 여러개의 메시지로 응답한다.
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
Clinet Streaming RPC
클라이언트가 스트림을 통해 여러게의 메시지를 보내고, 서버가 단일 메시지로 응답한다.
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
Bidrectional Streaming RPC
클라이언트와 서버가 독립적인 스트림을 주고받으며
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
gRPC, Protocol Buffer, Multiflex, Data access object, Binary framing, Async
https://grpc.io/docs/what-is-grpc/introduction/
https://web.dev/performance-http2/ - (Refer:HTTP2 spec, binary framing, multiflexing)
https://learn.microsoft.com/ko-kr/aspnet/core/grpc/comparison?view=aspnetcore-7.0 (refer: pros&cons of gRPC)
https://www.geeksforgeeks.org/remote-procedure-call-rpc-in-operating-system/