Remote Procedure Call : 네트워크로 연결된 서버 상의 프로시저(함수, 메서드, ...)를 원격으로 호출하는 기능.
RPC를 사용하면 클라이언트는 마치 로컬에서 함수를 호출 하듯 서버의 프로시저를 호출할 수 있다.
RPC의 구성품. 마샬링 처리 수행.
Interface Definition Language : 호출 규약 정의 언어.
RPC는 IDL을 사용하여 클라이언트와 서버가 어떻게 호출, 값 전달 할지 규약을 정의한다. IDL 언어를 정의한 후 컴파일 하면 Stub Code가 자동으로 생성된다. Stub Code에 명시된 함수는 원시 코드의 형태로, 상세 기능은 server에서 구현된다. 만들어진 Stub 코드는 클라이언트/서버에서 사용할 수 있다.
google Remote Procedure Call : google 사에서 개발한 오픈소스 RPC(Remote Procedure Call) 프레임워크.
이전까지는 RPC 기능은 지원하지 않고, 메세지(JSON 등)을 Serialize할 수 있는 프레임워크인 PB(Protocol Buffer, 프로토콜 버퍼)만을 제공
REST와 달리 HTTP/2 사용 및 프로토콜 버퍼로 데이터를 전달. Proto File만 배포하면 환경과 프로그램 언어에 구애받지 않고 서로 간의 데이터 통신이 가능.
HTTP/1.1
HTTP/2
Protocol Buffer는 google 사에서 개발한 구조화된 데이터를 직렬화(Serialization : Ex - json, xml, ...)하는 기법.
Ex) Json vs ProtoBuf
Json : 82 byte 소요(key, value, '{', ...)
ProtoBuf : 33 byte(필드 번호(1), 필드 유형(1), ...)
대신 Json 처럼 Serialize 결과와 선언이 하나가 아니고 별도의 proto 파일이 필요 하다는점. proto 파일 자체를 전달할 수 없는 점은 개발시 조금더 번거롭다는 의견이 있을 수 있다.
클라이언트와 서버간의 통신 규약을 proto 파일에 정의한다.
*.proto
service HelloSerivce {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
string reply = 1;
}
gRPC는 클라이언트와 서버사이드 코드를 생성하는 프로토콜 버퍼 컴파일러 플러그인들을 제공한다.
proto 파일만 잘 정의하면 클라이언트와 서버는 플러그인을 사용하여 각자의 언어에 맞는 API 소스 파일을 생성하고 이 소스 파일에 정의된 API들을 사용하여 통신을 할 수 있다.
gRPC를 사용하여 통신할때 클라이언트/서버의 역할은 다음과 같드
다음과 같이 4가지 종류가 있는데 Unary, streaming 이라는 단어의 의미만 알면 해석이 가능하다.
Unary : 단항이라는 의미이다.
streaming : streaming은 스트림을 전달 한다는 의미이다. 메시지 순서는 gRPC에서 보장한다.
Bidirectional : 양쪽이라는 의미이다.
Unary RPC
rpc SayHello(HelloRequest) returns (HelloResponse);
Server streaming RPC
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
Client streaming RPC
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
Bidirectional streaming RPC
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
gRPC는 클라이언트의 대기 시간을 설정할 수 있다. 대기 시간을 만료하게 되면 클라이언트에서 해당 RPC에 대해 DEADLINE_EXCEEDED 에러 발생한다. 서버 사이드에서는 서버가 해당 RPC의 남은 만료 시간 확인 가능.
만료 시간은 언어마다 다르다. 어떤 언어에서는 timeouts이라는 조건을 사용하고 어떤 언어에서는 deadline이라는 조건을 이용한다.
클라이언트와 서버의 처리 결과가 다를 수 있다(Ex: 서버는 성공, 클라이언트는 실패).
클라이언트가 모든 요청을 보내기 전에 서버는 종료할 수 있다.
RPC 호출에 대한 정보이며 key-value 형태로 이루어져 있다.
메타 데이터는 gRPC가 생성한 API를 통해서 전달되지 않고 gRPC 백그라운드 단에서 전달 된다. 메타 데이터 접근은 사용 언어에 따라 가능 할 수 있다.
host, port로 채널 연결. 채널 연결시 클라이언트는 스텁 생성.
클라이언트는 메시지 압축을 키거나 끄는 등의 gPRC의 기본 행동을 제어하기 위해 채널에 어떤 인자들을 명시 가능.
채널은 상태를 connected와 idle 상태를 가진다.
gPRC가 닫힌 채널을 다루는 방법은 사용 언어에 따라 처리가 다르다. 어떤 언어들은 채널 상태를 질의하는 것을 허용한다.