카테고리 없음

[gRPC] 1. What is gRPC?

noahkim_ 2025. 8. 26. 23:40

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 등)

 

 

출처