1. Introduction to gRPC
- Google의 원격 프로시저 호출 오픈소스 프로젝트
- 클라이언트 애플리케이션이 원격 서버 애플리케이션의 메서드를 로컬 객체처럼 직접 호출할 수 있음
- ✅ 클라이언트 측에서는 "Stub"을 이용함 (서버와 동일한 메서드를 제공하는 프록시 역할)
Concept Diagram
- 다양한 환경에서 실행되고 서로 통신할 수 있음 (서로 다른 기술 스택 등)
- ✅ 서비스 인터페이스 정의를 기반으로 통신함
- ✅ 서비스 정의를 중심으로 동작함
- ➡️ 분산 애플리케이션을 훨씬 쉽게 만들 수 있음
Working with Protocol Buffers
- Google이 만든 오픈소스 직렬화 방식
- ✅ 구조화된 데이터를 효율적으로 저장 및 전송하게 해줌
- proto 파일: gRPC 서비스 및 데이터 구조 정의
- protoc 컴파일러: .proto 파일에서 정의한 데이터 구조를 원하는 언어의 코드로 생성해줌
예) proto 파일
더보기
// 서비스 정의
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 요청 메시지
message HelloRequest {
string name = 1;
}
// 응답 메시지
message HelloReply {
string message = 1;
}
Protocol Buffer versions
- (권장) proto3: 간단. 다국어 지원, 호환성 제공
2. Core concepts, architecture and lifecycle
RPC 방식
- Unary RPC: 클라이언트/서버가 각가 1개씩 메시지를 주고받음
- Server Stream RPC: 클라이언트가 요청 1개를 보내고, 서버가 여러개의 응답 반환 (응답 순서 보장)
- Client Stream RPC: 클라이언트가 여러개의 요청을 보내고, 서버가 1개의 응답 반환 (요청 순서 보장)
- Bidirectional Stream RPC: 클라이언트/서버 모두 동시에 여러개 메시지를 주고받을 수 있음 (요청/응답 순서 보장)
코드) Unary RPC
더보기
rpc SayHello(HelloRequest) returns (HelloResponse);
코드) Server Stream RPC
더보기
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
코드) Client Stream RPC
더보기
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
코드) Bidirectional Stream RPC
더보기
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
Using the API
- .proto 파일에서 서비스 정의를 작성하면, protoc 컴파일러 + gRPC 플러그인이 클라이언트와 서버 코드를 자동으로 생성함
Deadlines/Timeouts
- RPC가 완료되기까지 기다릴 최대 시간을 지정할 수 있음
- ⚠️ 이 시간이 지나면 강제 종료됨
- ‼️ DEADLINE_EXCEEDED 에러 발생
Metadata
- RPC 호출에 대한 부가 정보
- ✅ 클라이언트-서버 간 추가 정보를 주고 받는 용도 (기본적으로 사용 안함)
- ✅ key-value 쌍의 리스트로 구성됨
Channel
- 특정 서버와의 연결 (host+port)
- Client에서 Stub을 만들 때 사용함
- 옵션 설정 가능 (메시지 압축, 연결 동작 방식 등)
- 상태 있음 (Connected, Idle 등)
출처