개발

gRPC란?

nova_dev 2021. 3. 22. 00:00
반응형

gRPC란?

1. 배경지식

1.1 RPC(Remote Procedure Call)

1.1.1 RPC란?

  • RPC(Remote Procedure Call)
    • 원격 프로시져 호출
    • 원격에 위치한 프로그램을 로컬에 있는 프로그램처럼 사용할 수 있다.
    • 분산 네트워크 컴퓨터환경에서 프로그래밍을 쉽게 하기 위해 나온 방식
  • 예시
      # Client
      z = function(x, y)
      # Server
      function(x, y) {
      compute x, y
      return z
      }

    1.1.2 RPC 동작방식

    rpc
  • Caller / Callee
    • 사용자(Client, Server)가 필요한 비즈니스 로직을 실행하는 Layer
    • IDL(Interface definition Language)로 작성
  • Stub
    • Stub Compiler가 IDL 파일을 읽어 원하는 Lagnuage로 생성
    • Parameter Object를 Message로 marsharlling/unmarshalling하는 Layer
  • RPC runtime
    • Server와 Client를 Building하는 Layer
    • 커뮤니케이션 중 발생한 에러처리도 진행

1.2 IDL(Interface Definition Language)

  • IDL(Interface Definition Language): 인터페이스 정의 언어

    • 정보를 저장하는 규칙
    • 예) XML, JSON, Proto 등
  • proto

    • gRPC에서 사용하는 데이터 형식으로 .proto파일을 protocol buffer compiler(protoc)를 이용해 compile해서 사용하여, 다양한 언어에서 다양한 데이터 스트림을 통해 데이터를 쉽게 읽고 쓸 수 있음
    • gRPC는 proto3을 사용하는 것이 좋음 (proto2 보다 많은 언어 지원)
    • 통신이 빠름
      • 같은 데이터를 보낼 경우, 데이터의 크기가 작아서 같은 시간 내에 더 많은 데이터를 보낼 수 있음
    • 파싱할 필요가 없음
      • JSON 포맷으로 온 데이터는 다시 객체로 파싱해서 사용해야하지만, Protocol Buffer는 Byte Stream을 Proto file이 읽어 유저가 파싱할 필요가 없음
    • 예시
      message Person {
          string name = 1;
          int32 id = 2;
          bool has_ponycopter = 3;
      }
    • Protocol Buffers로 인코딩된 방식 (동일한 데이터를 JSON으로 보낼 경우 88byte 사용)
      protocol buffer
  • XML vs JSON vs Proto
    3개 데이터 구조 비교

2. gRPC

2.1 gRPC란?

  • Google에서 개발한 RPC(Remote Procedure Call) 시스템
  • TCP/IP 프로토콜과 HTTP 2.0 프로토콜 사용
  • IDL(Interface Definition Language)로 protocol buffer를 사용

2.2 gRPC의 구조

gRPC

  • 클라이언트 어플리케이션은 마치 로컬 객체인 것처럼 다른 머신에 있는 서버 어플리케이션의 메서드를 직접 호출할 수 있음
  • 따라서 분산 어플리케이션 및 서비스를 더 쉽게 만들 수 있다.
  • 다양한 환경에서 실행 가능 (Go, Python, Ruby, Java 등)

2.3 gRPC 장단점

  • 장점
    • 성능과 문제점 개선
      • HTTP 1.1은 Web에서 가장 많이 사용하는 프로토콜이고, JSON은 매우 간단하면서 효율적인 IDL이지만 일부 문제점(JSON IDL의 크기나 HTTP 1.1의 HOLB 문제 등)이 존재
      • gRPC의 protocol buffer로 리소스 사용량을 크게 줄여 JSON을 사용할 때보다 응답속도를 줄일 수 있음. (JSON 및 XML로의 변환도 지원)
    • 서버-클라이언트 streaming
    • 다양한 언어에서 사용 가능
      • C#, C+, Dart, Go, Java, Kotline, Node, Object-C, PHP, Python, Ruby 지원 (proto3)
  • 단점
    • 브라우저 사용이 곤란함
      • 브라우저(Client)에서 proto 파일을 가지고 있을 수 없으므로 사실상 사용 불가능
    • 클라리언트 업데이트시 .proto 파일을 업데이트 해주어야 함
      • 서버의 proto 파일에 변화가 생길 경우 클라이언트의 proto 파일도 업데이트 필요

        2.4 gRPC 예제 (java)

  • gRPC 예제

Java 예제 - Server, Client를 다른 언어로 바꿔도 됨.

src/main/proto/helloworld.proto

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

src/main/java/helloworld/HelloWorldServer.java

  /**
   * Main launches the server from the command line.
   */
  public static void main(String[] args) throws IOException, InterruptedException {
    final HelloWorldServer server = new HelloWorldServer();
    server.start();
    server.blockUntilShutdown();
  }

  static class GreeterImpl extends GreeterGrpc.GreeterImplBase {

    @Override
    public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
      HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
      responseObserver.onNext(reply);
      responseObserver.onCompleted();
    }
  }

src/main/java/helloworld/HelloWorldClient.java

  /** Say hello to server. */
  public void greet(String name) {
    logger.info("Will try to greet " + name + " ...");
    HelloRequest request = HelloRequest.newBuilder().setName(name).build();
    HelloReply response;
    try {
      response = blockingStub.sayHello(request);
    } catch (StatusRuntimeException e) {
      logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
      return;
    }
    logger.info("Greeting: " + response.getMessage());
  }

실행

grpc-1
grpc-2
grpc-3

참고자료

반응형

'개발' 카테고리의 다른 글

[Spring Cloud] Hystrix 파헤치기  (0) 2021.11.07
[Golang] Go 언어 빠르게 훑어보기  (0) 2021.10.26
gradle  (0) 2021.08.16
WSL(Windows Subsystem for Linux)이란?  (0) 2021.05.23
HTTP 프로토콜 1.0 vs 1.1 vs 2.0 비교  (0) 2021.03.15