gRPC 소개
gRPC는 protocol buffer와 RPC를 사용한다.
2022.12 당시, IDL로는 proto3를 사용하며 호환하는 언어로는 Java, C++, Python, Java Lite, Ruby, JavaScript, Objective-C, C#을 호환한다.
gRPC의 핵심은 분산으로 클라이언트 응용 프로그램을 서버에서 함수를 원격 호출할 수 있어 MSA(Micro Service Architecture)를 구현하기 수월하다. gRPC 서버에서는 Stub을 통한 호출을 처리할 수 있다.
gRPC 특징
1. Protocol Buffere
gRPC는 IDL을 Protocol Buffere(.proto)를 사용한다.
2. Service definition
service EducationService {
rpc basicRead(BasicRequest) returns (BasicResponse){}
}
message BasicRequest {
string message = 1;
}
message BasicResponse {
string message = 1;
string statusCode = 2;
string statusMessage = 3;
}
3. Channels
gRPC channel은 특정 host와 port에 대해 gRPC서버에 대한 연결을 제공한다.
4. RPC Life Cycle
단항(Unary) RPC
a. 클라이언트가 Stub메서드를 호출하면 이 호출에 대한 클라이언트의 메타데이터를 RPC가 호출되었음을 알린다. 서버는 호출을 확인하고 초기 메타데이터를 바로 되돌려 보내거나 클라이언트의 요청 메시지를 기다릴 수 있다.
b. 서버가 클라이언트의 요청 메시지를 받으면 응답을 생성하고 채우는 데 필요한 모든 작업을 수행한다.
c. 그런 다음 응답은 상태 세부 정보 및 선택적인 후행 메타데이터와 함께 클라이언트에 반환된다.
d. 응답상태가 OK이면 클아이언트는 클라이언트 측에서 호출 응답 완료를 응답 받는다.
Server Streaming RPC
클라이언트 request 1번, 서버 Response 유지
서버가 클라이언트 요청에 대한 응답으로 메시지 스트림을 반환한다는 점을 제외하면 Unary RPC와 유사하다. 모든 메시지를 보낸 후 서버의 상태 세부 정보 및 선택적 메타데이터가 클라이언트로 전송된다. 이렇게 하면 서버측에서 처리가 완료되고 클라이언트는 서버의 모든 메시지를 받으면 된다.
Client Streaming RPC
클라이언트 request 1번, 서버 Response 1번
클라이언트가 단일 메시지 대신 서버에 미시지 스트림을 보낸다. 서버는 일반적으로 클라이언트의 모든 메시지를 수신한 후에 대개 단일 메시지로 응답한다.
Bidirectional streaming RPC
DEADLINE_EXCEEDED gRPC를 사용하면 클라이언트는 RPC가 오류로 종료되기 전에 RPC가 완료될 때까지 대기할 시간을 지정할 수 있다.
RPC termination
gRPC에서 클라이언트와 서버는 모두 호출의 성공 여부를 독립적이고 로컬에서 결정하므로 결론이 일치하지 않을 수 있다. 예를 들어 서버 측에서는 성공적으로 완료되었지만(“내 모든 응답을 보냈습니다!”) 클라이언트 측에서는 실패한 RPC가 있을 수 있다(“응답이 마감 시간 이후에 도착했습니다!”). 클라이언트가 모든 요청을 보내기 전에 서버가 완료를 결정할 수 있다.
Cancelling an RPC
클라이언트나 서버는 언제든지 RPC를 취소할 수 있다.
gRPC 장점
protocol buffer사용
protocol buffere는 IDL xml, json에 비해 데이터 크기가 작아 결과적으로 리소스 사용량을 줄여 응답시간을 줄일 수 있다.
xml, json으로도 변환하는 기능도 지원한다.
HTTP 2.0지원
HTTP1.1은 TCP연결 관련하여 비효율적인 연결방식을 HTTP2.0을 통해 서버푸시와 1.1버전 대비 효율적인 연결이 가능해졌다.
넓은 언어 호환성
현재 Java, Python, Objective-C, C++을 지원하고 proto3의 경우 Kotlin, Dart, Go, Ruby, C#을 추가적으로 지원한다.
분산 환경
최근의 개발 환경을 보면 핵심은 분산이다. 기존의 서비스를 분산하여 에러에 대해서 대처를 유연하게 대응하는 것이 중요한 시대이다. 이를 해결할 수 있는 것이 gRPC환경으로 분산환경 구축이 가능하다.
gRPC 단점
.proto파일에 대한 업데이트
gRPC로 연결되어 있는 서버 클라이언트에서 어느 한쪽에서라도 변경이 일어나면 proto파일을 업데이트 해야하는 단점이 있다.
Reference.