반응형
gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment.

 

RPC(Remote Procedure Call)?

  • 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 프로세스 간 통신 기술
  • 개발자가 원격 상호 작용에 대한 세부 정보를 명시적으로 코딩하지 않아도 프레임워크가 자동 핸들링함
  • 클라이언트 코드에서는 직접 서버 코드의 함수를 호출하는 것처럼 보임
  • 언어에 구애받지 않고 원격의 프로시져를 호출가능(즉, 클라이언트 코드 언어와 서버 코드 언어가 다른 언어로 쓰일 수 있음 )

grpc

gRPC?

  • RPC인데 구글이 만든 RPC이다. g가 구글인줄 알았는데 그건 또 아니라고 반박함ㅋㅋㅋ
    https://github.com/grpc/grpc/blob/master/doc/g_stands_for.md
  • IDL: proto 사용
  • http/2 기반 통신
  • json 기반의 통신보다 가볍고 속도가 빠르다.(성능이점)
  • 클라이언트에는 서버와 통신 시 Stub을 inject 하여 통신하며 소스에 바로 로딩하여 사용가능
  • protoc 파일을 작성 시 request이나 response앞에 붙은 'stream' 유무에 따라 4가지 방식이 있음
    • unary(단방향): 클라이언트가 서버에 단일 요청을 보내고 일반 함수 호출처럼 단일 응답을 받음(1개 request , 1개 respone)
      • rpc SayHello(HelloRequest) returns (HelloResponse);
    • server stream(서버 스트리밍): 서버가 클라이언트의 요청에 대한 응답으로 메시지 스트림을 반환(1개 request, n개 response)
      • rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
    • client stream(클라이언트 스트리밍): 클라이언트가 단일 메시지 대신 서버에 메시지 스트림을 보냄(n개 request, 1개 response)
      • rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
    • bi-directional(양방향): 서버, 클라이언트 양쪽에서 메시지 스트림을 보냄(n개 request, n개 response)
      • rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
  • 클라이언트 stub: 서버를 추상화해놓은 것 / 클라이언트의 수신처리 방법
    • BlockingStub: 동기적으로 통신하는 방법으로, 서버로부터 응답이 올 때까지 대기.
      • Unary RPC와 Server Streaming RPC에서만 사용
    • AsyncStub (Stub): 비동기적으로 통신하는 방법으로, 서버로부터 오는 응답을 StreamObserver 객체가 대신 받아서 처리
      • 모든 방식의 RPC에서 사용
    • FutureStub: 비동기적으로 통신하는 방법으로, 서버로부터의 응답 도달에 상관 없이 일단 ListenableFuture로 래핑된 객체를 반환. 서버로부터 오는 응답이 오면 ListenableFuture 객체를 통해 전달받은 메시지를 언래핑할 수 있음.
      • Unary RPC에서만 사용

즉 위 내용을 모두 합치면 아래와 같은 7가지 통신방법이 존재한다.

  unary server stream client stream bi-directional
blocking o o x x
asyn o o o o
future o x x x

 

gRPC 단점

  • 브라우저에서 직접 gRPC 통신 불가, proxy 를 통하거나 브라우저 -> 클라이언트 연동 서버 -> gRPC 서버 순으로 요청해야 함
  • protobuf(이진형식)으로 인코딩되어 송수신에 효율적이나 사람이 읽을 수 없는 데이터라 네트워크 단에서 볼 때 어려움

 

왜 MSA에서 많이 쓰이나 싶었는데, MSA구조의 특정 상 안 그래도 많은 api 콜을 gRPC로 대체하면 성능 향상에 도움이 될 것 같다..

다음 글에서는 간단하게 서버와 클라이언트를 구현해본다.

2022.01.20 - [개발/spring] - [grpc] springboot2 grpc server/client coding

 

[grpc] springboot2 grpc server/client coding

목표: java11 / gradle 7.3.3 multi project / springboot 2.6.2 / grpc server & client 개발 참고 블로그: https://velog.io/@chb1828/Spring-boot%EB%A1%9C-Grpc%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B..

bangpurin.tistory.com


IDL(Interface Definition Language)?
: 정보를 저장하는 규칙

1. xml
2. json
3. proto

Protocol buffers(proto)?

  • 직렬화 데이터 구조, 데이터를 전송할 때 구조화된 데이터를 전환하는 방법 중 하나
  • XML의 문제점을 개선하기 위해 제안된 IDL이며, XML보다 월등한 성능을 지님
  •  .proto 파일에 protocol buffer 메세지 타입/구조를 정의
  • message = '이름-값'의 쌍을 포함하는 작은 논리적 레코드
  • protoc 컴파일러로 컴파일 하면 데이터에 접근할 수 있는 각 언어에 맞는 형태의 데이터 클래스를 생성해주며 만들어진 클래스는 각 필드를 위한 접근자 뿐 아니라 전체 구조를 바이트로 직렬화하거나 바이트로부터 전체 구조를 파싱하는 메서드들을 제공함

xml 보다..

  • XML보다 작고 빠르고 간단함
  • 파일 크기가 3에서 10배 정도 작음
  • 속도가 20에서 100배 정도 빠름
  • XML보다 가독성이 좋고 명시적

 


참고자료

https://tech.lattechiffon.com/2021/06/30/grpc-%EC%84%B8-%EA%B0%80%EC%A7%80-streaming-rpc-%EA%B5%AC%ED%98%84-java/

 

gRPC 세 가지 Streaming RPC 구현 (Java) – 라떼쉬폰의 코드 베이커리

이전 글에서 gRPC를 이용하여 Unary RPC를 구현했던 것에 이어서, 이번에는 Server Streaming, Client Streaming 및 Bidirectional Streaming RPC를 Java로 구현해보도록 하겠습니다. Streaming 패턴 구현에 앞서 gRPC에서

tech.lattechiffon.com

 

https://qwer9412.tistory.com/40

 

4. grpc의 여러가지 통신 기법

grpc는 4개의 통신을 지원한다. - unary (1개 request , 1개 respone) - server stream (1개 request, n개 response) - client stream (n개 request, 1개 response) - bi stream (n개 request, n개 response) 그리..

qwer9412.tistory.com

 

728x90
반응형

+ Recent posts