반응형
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
vsJSON
vsProto
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)
- 서버의 proto 파일에 변화가 생길 경우 클라이언트의 proto 파일도 업데이트 필요
- 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());
}
실행
참고자료
반응형
'개발' 카테고리의 다른 글
[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 |