gRPC

break 없는 while loop·2024년 11월 30일
post-thumbnail

1. gRPC란?

gRPC란 Google이 설계한 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 시스템으로, 서로 다른 애플리케이션 간의 통신을 간단하고 효율적으로 처리할 수 있도록 설계되었다. gRPC는 HTTP/2를 기반으로 동작하며, 성능과 확장성을 위해 최적화된 현대적인 RPC 프레임워크다.

2. gRPC의 주요 특징

  1. HTTP/2 기반
    • 멀티플렉싱, 스트리밍, 헤더 압축, 연결 재사용과 같은 HTTP/2의 강력한 기능을 활용하여 효율적인 통신 가능
  2. Protocol Buffers (protobuf)
    • 데이터 직렬화에 효율적인 Google의 Protocol Buffers를 사용하여 빠르고 간결한 메시지 전송
  3. 다양한 언어 지원
    • Java, C#, Python, C++, Go, JavaScript 등 여러 언어에서 클라이언트와 서버를 구현할 수 있음
  4. 양방향 스트리밍 지원
    • 클라이언트와 서버가 실시간으로 데이터를 주고 받을 수 있는 양방향 스트리밍 제공
  5. 서비스 정의 인터페이스(SDI)
    • .proto 파일에 서비스와 메시지를 정의하면 클라이언트와 서버 간의 인터페이스를 자동으로 생성
  6. 보안
    • HTTP/2의 TLS를 사용하여 보안을 강화

3. gRPC의 동작 방식

  1. 서비스 정의

    • .proto 파일에서 메시지와 서비스 인터페이스를 정의
    syntax = "proto3";
    
    service Greeter {
    	rpc SayHello (HelloRequest) returns (HelloResponse);
    }
    
    message HelloRequest {
    	string name = 1;
    }
    
    message HelloResponse {
     	string message = 1; 
    }
  2. 코드 생성

    • protoc 컴파일러를 사용해 .proto 파일에서 서버 및 클라이언트 코드를 생성
    protoc --java_out=. --grpc-java_out=. example.proto
  3. 서버 구현

    • 서비스 인터페이스를 구현하고 서버를 시작
    public class GreeterImpl extends GreeterGrpc.GreeterImplBase {
    	@Override
        public void sayHello(HelloRequest req, StreamObserver<HelloResponse> responseObserver) {
        	HelloResponse response = HelloResponse.newBuilder()
            	.setMessage("Hello " + req.getName())
                .build();
            responseObserver.onNext(response);
            responseObserver.onCompleted();
        }
    }
  4. 클라이언트 호출

    • 생성된 클라이언트를 통해 서버에 요청을 보냄
    ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
    	.usePlaintext()
        .build();
    GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);
    
    HelloResponse response = stub.sayHello(HelloRequest.newBuilder().setName("World").build());
    System.out.println(response.getMessage());

4. gRPC의 통신 방식

gRPC는 4가지 호출 방식(Method Type)을 지원한다:

  1. 단일 요청-응답 (Unary RPC)
    • 클라이언트가 단일 요청을 보내고 단일 응답을 받음
    • 예: 일반적인 HTTP 요청-응답과 유사
    • 호출: rpc SayHello(HelloRequest) returns (HelloResponse)
  2. 서버 스트리밍 (Server Streaming RPC)
    • 클라이언트가 요청을 보내면 서버가 여러 개의 응답을 스트리밍으로 보냄
    • 호출: rpc ListFeatures(Rectangle) returns (stream Feature)
  3. 클라이언트 스트리밍 (Client Streaming RPC)
    • 클라이언트가 여러 요청을 스트리밍으로 보내고 서버가 단일 응답을 반환
    • 호출: rpc RecordRoute(stream Point) returns (RouteSummary)
  4. 양방향 스트리밍 (Bidirectional Streaming RPC)
    • 클라이언트와 서버가 스트리밍 방식으로 동시에 데이터를 주고 받음
    • 호출: rpc RouteChat(stream RouteNote) returns (stream RouteNote)

5. gRPC의 장점

  1. 고성능
    • HTTP/2와 Protocol Buffers를 사용하여 낮은 대역폭과 낮은 지연 시간
  2. 다양한 플랫폼과 언어 지원
    • 클라이언트와 서버를 다른 언어로 작성할 수 있음
  3. 스트리밍 지원
    • 실시간 데이터 전송이 필요한 애플리케이션에서 적합
  4. 자동 코드 생성
    • .proto 파일에서 클라이언트와 서버 코드를 자동으로 생성하여 개발 생산성 향상
  5. 확장성
    • 대규모 시스템에서도 효율적으로 동작

한마디로 요즘 나온 기술의 장점은 다 가지고 있다

6. gRPC의 단점

  1. 학습 곡선
    • Protocol Buffers와 HTTP/2에 익숙하지 않으면 처음에는 설정이 복잡할 수 있음
  2. 디버깅 어려움
    • JSON 같은 텍스트 기반 형식이 아니라 Protocol Buffers의 이진 형식을 사용하므로 디버깅이 까다로울 수 있음
  3. 브라우저 지원 제한
    • 브라우저는 기본적으로 HTTP/2와 Protocol Buffers를 직접 지원하지 않기 때문에 gRPC-Web 같은 추가 도구가 필요

7. gRPC와 REST API 비교

gRPC vs REST API 비교표

특징gRPCREST API
프로토콜HTTP/2HTTP/1.1
데이터 포맷Protocol Buffers (Protobuf)JSON, XML
성능빠른 전송 속도 (Protobuf의 이진 데이터 전송)상대적으로 느림 (JSON/XML의 텍스트 기반 전송)
지원되는 메서드사용자 정의 가능, 유연한 RPC 호출GET, POST, PUT, DELETE 등 HTTP 표준 메서드 사용
양방향 통신지원 (스트리밍 가능, 클라이언트 및 서버 스트리밍)기본적으로 지원하지 않음 (단방향 통신, WebSocket 필요)
스키마 정의강력한 스키마 정의 (.proto 파일 사용)일반적으로 없음 (스키마가 없거나 Swagger/OpenAPI 사용)
언어 지원다수의 언어 지원 (gRPC 툴로 코드 생성)모든 언어에서 지원 (HTTP 지원 언어라면 사용 가능)
요구사항Protobuf 컴파일러 및 gRPC 런타임 필요추가 도구 없이 바로 사용 가능
에러 처리gRPC 상태 코드와 커스텀 에러 메시지 지원HTTP 상태 코드 사용
브라우저 지원직접 지원하지 않음 (gRPC-Web 사용 필요)브라우저에서 기본적으로 지원
보안기본적으로 HTTP/2의 TLS 지원HTTPS를 통한 TLS 보안
호환성버전 관리를 통한 강력한 호환성 유지명시적인 버전 관리를 해야 함
설치 및 설정초기 설정이 복잡할 수 있음간단하고 설정이 쉬움
사용 사례실시간 통신, 마이크로서비스 간 통신, 고성능 애플리케이션웹 애플리케이션 API, 간단한 CRUD API

8. gRPC의 활용 사례

  1. 마이크로서비스 통신
    • 서로 다른 언어로 작성된 마이크로서비스 간의 효율적이고 빠른 통신
  2. 실시간 애플리케이션
    • 채팅, 비디오 스트리밍, 게임 서버 등 양방향 데이터 흐름이 필요한 시스템
  3. 분산 시스템
    • 분산 트랜잭션, 클러스터링, 데이터 처리 시스템 등에서 gRPC의 고성능과 효율성을 활용
profile
프로그래밍 지식 아카이브용

0개의 댓글