gRPC란?

gRPC는 고성능의 오픈 소스 RPC 프레임워크로, 마이크로서비스와 실시간 통신에 적합하다.

gRPC란 무엇인가요?

gRPC는 Google에서 개발한 고성능, 오픈 소스 RPC (Remote Procedure Call) 프레임워크입니다.

다양한 환경에서 실행될 수 있으며, 데이터 센터 내부 및 외부 서비스를 효율적으로 연결합니다. 또한, 분산 컴퓨팅의 마지막 단계에서 장치, 모바일 애플리케이션 및 브라우저를 백엔드 서비스에 연결하는 데에도 적용할 수 있습니다. gRPC는 2015년 Google에서 Stubby라는 내부 RPC 인프라를 개선하여 오픈소스로 공개한 것입니다. 현재는 마이크로서비스, API 게이트웨이, 실시간 통신 등 다양한 분야에서 사용되고 있습니다.

gRPC의 주요 특징

gRPC는 다음과 같은 주요 특징을 가지고 있습니다.

gRPC 작동 방식

gRPC는 클라이언트와 서버 간에 메시지를 교환하여 작동합니다. 클라이언트는 서버에서 제공하는 서비스의 메서드를 호출하고, 서버는 해당 메서드를 실행하고 결과를 클라이언트에게 반환합니다. gRPC는 HTTP/2를 사용하여 메시지를 전송하며, Protobuf를 사용하여 메시지를 직렬화합니다. gRPC는 채널을 사용하여 클라이언트와 서버 간의 연결을 관리합니다. 채널은 연결된 상태와 유휴 상태를 포함한 상태를 가지며, 채널을 닫는 방법은 언어에 따라 다릅니다.

gRPC는 다음과 같은 4가지 유형의 서비스 메서드를 지원합니다.

  1. Unary: 클라이언트가 단일 요청을 보내고 서버가 단일 응답을 반환하는 가장 일반적인 유형입니다. 이는 일반적인 함수 호출과 유사합니다. 예를 들어, 클라이언트가 사용자 정보를 요청하면 서버는 해당 사용자 정보를 응답으로 반환합니다.
  2. Server streaming: 클라이언트가 단일 요청을 보내고 서버가 여러 개의 응답을 스트림 형태로 반환하는 유형입니다. 클라이언트는 서버에서 더 이상 메시지가 없을 때까지 반환된 스트림에서 메시지를 읽습니다. gRPC는 개별 RPC 호출 내에서 메시지 순서를 보장합니다. 예를 들어, 클라이언트가 특정 기준에 맞는 여러 책을 요청하면 서버는 찾은 책들을 순차적으로 스트리밍하여 클라이언트에 전송합니다.
  3. Client streaming: 클라이언트가 여러 개의 요청을 스트림 형태로 보내고 서버가 단일 응답을 반환하는 유형입니다. 클라이언트는 제공된 스트림을 사용하여 일련의 메시지를 작성하고 서버에 보냅니다. 클라이언트가 메시지 작성을 완료하면 서버가 메시지를 모두 읽고 응답을 반환할 때까지 기다립니다. gRPC는 개별 RPC 호출 내에서 메시지 순서를 보장합니다. 예를 들어, 차량 공유 앱에서 운전자가 운행을 시작하면 클라이언트 애플리케이션은 실시간 위치 데이터를 서버에 스트리밍합니다. 운행이 종료되면 서버는 이동 거리와 요금을 요약하여 클라이언트에 응답합니다.
  4. Bidirectional streaming: 클라이언트와 서버가 모두 스트림 형태로 메시지를 주고받는 유형입니다. 두 스트림은 독립적으로 작동하므로 클라이언트와 서버는 원하는 순서대로 메시지를 읽고 쓸 수 있습니다. 예를 들어, 서버는 모든 클라이언트 메시지를 수신할 때까지 기다렸다가 응답을 작성하거나, 메시지를 읽은 다음 메시지를 쓰거나, 읽기와 쓰기의 다른 조합을 사용할 수 있습니다. 각 스트림의 메시지 순서는 유지됩니다

gRPC의 장점

gRPC는 다음과 같은 장점을 제공합니다.

gRPC의 단점

gRPC는 다음과 같은 단점을 가지고 있습니다.

gRPC 사용 사례

gRPC는 다음과 같은 다양한 사용 사례에 적합합니다.

gRPC와 REST API 비교

gRPC와 REST API는 모두 클라이언트-서버 통신을 위한 아키텍처 스타일이지만, 몇 가지 중요한 차이점이 있습니다

Notion Image

gRPC는 성능, 효율성, 스트리밍 기능 측면에서 REST API보다 우수하지만, 브라우저 지원 및 디버깅 측면에서는 제한적입니다. 따라서 애플리케이션의 요구 사항에 따라 적합한 아키텍처 스타일을 선택해야 합니다. gRPC는 대규모 마이크로서비스 연결, 실시간 통신, 저전력 및 저대역폭 시스템, 다국어 환경에 적합합니다. 반면 REST API는 사람이 읽기 쉽고 웹 브라우저에서 폭넓게 지원되므로, 간단한 데이터 소스 및 범용적인 API에 적합합니다.

gRPC 보안

gRPC는 API 보안을 위해 다음과 같은 기능을 제공합니다.

gRPC 보안을 위한 몇 가지 추가적인 모범 사례는 다음과 같습니다.

gRPC 성능

gRPC는 Protobuf를 사용한 바이너리 직렬화와 HTTP/2의 다중화 및 헤더 압축 기능을 통해 REST API보다 높은 성능을 제공합니다. 벤치마크 테스트 결과에 따르면, gRPC는 REST API보다 최대 10배 빠른 성능을 보여줍니다.

gRPC 성능을 측정한 몇 가지 벤치마크 테스트 결과는 다음과 같습니다.

gRPC를 지원하는 프로그래밍 언어 및 프레임워크

gRPC는 다음과 같은 다양한 프로그래밍 언어를 지원합니다.

또한, gRPC는 다양한 프레임워크와 통합될 수 있습니다. 예를 들어, Spring Boot 애플리케이션에서 gRPC를 사용할 수 있습니다.

gRPC를 사용하는 방법 (간단한 예제 코드 포함)

gRPC를 사용하려면 먼저 Protobuf를 사용하여 서비스 정의 및 메시지 형식을 정의해야 합니다. 그런 다음 protoc 컴파일러를 사용하여 .proto 파일에서 클라이언트 및 서버 코드를 생성합니다. 마지막으로 생성된 코드를 사용하여 서버를 구현하고 클라이언트에서 서버의 메서드를 호출합니다.

다음은 Python으로 작성된 간단한 gRPC 서버 예제입니다.

Python

from concurrent import futures
import logging

import grpc

import helloworld_pb2
import helloworld_pb2_grpc


class Greeter(helloworld_pb2_grpc.GreeterServicer):

    def SayHello(self, request, context):
        return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)


def serve():
    port = '50051'
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port('[::]:' + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()


if __name__ == '__main__':
    logging.basicConfig()
    serve()

다음은 Python으로 작성된 간단한 gRPC 클라이언트 예제입니다.

Python

import logging

import grpc

import helloworld_pb2
import helloworld_pb2_grpc


def run():
    # NOTE(gRPC Python Team): .close() is possible on a channel and should be
    # used in circumstances in which the with statement does not fit the needs
    # of the code.
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = helloworld_pb2_grpc.GreeterStub(channel)
        response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
    print("Greeter client received: " + response.message)


if __name__ == '__main__':
    logging.basicConfig()
    run()

gRPC 관련 추가 정보

결론

gRPC는 고성능, 오픈 소스 RPC 프레임워크로, 마이크로서비스, API 게이트웨이, 실시간 통신 등 다양한 분야에서 사용됩니다. HTTP/2, Protobuf, IDL, 코드 생성, 양방향 스트리밍 등의 기능을 통해 효율적이고 안전한 통신을 가능하게 합니다. gRPC는 REST API보다 높은 성능을 제공하지만, 브라우저 지원 및 디버깅 측면에서는 제한적입니다. 따라서 애플리케이션의 요구 사항에 따라 적합한 아키텍처 스타일을 선택해야 합니다. gRPC는 마이크로서비스 아키텍처의 발전과 함께 점점 더 많은 관심을 받고 있으며, Dropbox와 Lyft와 같은 회사에서 실제 서비스에 gRPC를 적용하는 사례가 늘어나고 있습니다. gRPC의 성능과 효율성은 분산 시스템의 미래를 위한 핵심 기술로 자리매김할 가능성이 높습니다.