on
gRPC란?
gRPC란?
도비의 블로그
도비 도비랑 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 동작방식
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 사용)
XML vs JSON vs Proto
2. gRPC
2.1 gRPC란?
Google에서 개발한 RPC(Remote Procedure Call) 시스템
시스템 TCP/IP 프로토콜과 HTTP 2.0 프로토콜 사용
IDL(Interface Definition Language) 로 protocol buffer를 사용
2.2 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 multiduplex bidirectional streaming 기능 제공 (HTTP2.0 특징) 다양한 언어에서 사용 가능 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 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()); }
실행
참고자료
from http://hirlawldo.tistory.com/119 by ccl(A) rewrite - 2021-03-22 00:26:18