gRPC는 Google에서 개발한 어디서나 실행할 수 있는 오픈소스 고성능 RPC 프레임워크다. RPC는 Remote Procedure Call의 줄임말로 원격 프로시저 호출이라고 한다.
RPC는 별도의 원격 제어를 위한 코딩없이 다른 주소공간에서 함수나 프로시저를 실행할 수 있게 해주는 프로세스간 통신 기술이다. 특히 MSA구조에서 각 서버가 다른 언어와 프레임 워크로 개발되었더라도 RPC는 문제없이 서버간 통신이 가능하다.
gRPC를 사용하면 원격에 있는 어플리케이션의 메서드를 로컬 메서드처럼 직접 호출이 가능하여 분산 어플리케이션과 서비스를 보다 쉽게 만들 수 있다.
gRPC는 RPC 시스템과 마찬가지로 서비스를 정의하고, 서비스를 위한 매개변수와 반환 값을 가지는 메서드를 만든다는 아이디어를 가지고 있다.
서버 측은 정의한 서비스 규격에 따라서 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트 호출을 처리한다. 클라이언트 측에서는 서버와 동일한 방법을 제공하는 stub이 있다.
stub은 RPC의 핵심 개념으로 Parameter 객체를 Message로 Marshalling/Unmarshalling하는 레이어다.
서버와 클라이언트는 서로 다른 주소 공간을 사용하기 때문에 함수 호출에 사용된 매개 변수를 꼭 반환해줘야 한다. 그렇지 않으면 메모리 매개 변수에 대한 포인터가 다른 데이터를 가리키게 되기 때문이다.
클라이언트의 stub은 함수 호출에 사용된 파라미터의 변환(Marshalling) 및 함수 실행 후 서버에서 전달된 결과의 변환 담당이다.
서버의 stub은 클라이언트가 전달한 매개 변수의 역변환(Unmarshalling) 및 함수 실행 결과 반환을 담당한다.
gRPC는 IDL(Interface Definition Language)로 Protocol Buffer를 사용한다.
Protocol Buffer는 직렬화 데이터 구조로, 어떤 언어나 플랫폼에서도 통신 프로토콜이나 데이터 저장을 사용할 때 구조화된 데이터를 전환하게 해주는 방법이다. 직렬환 종류에는 대표적으로 Json과 XML이 있다.
Protocol Buffer로 작업할 때는 .proto
파일에서 직렬화할 데이터 구조를 정의한다. Protocol Buffer는 하나의 프로그래밍 언어가 아닌 여러 프로그래밍 언어를 지원하기 때문에, 특정 언어에 종속성이 없는 형태로 데이터 타입을 정하는데, 이 파일을 .proto
파일이라고 한다.
Protocol Buffer의 데이터는 일련의 key - value 형태의 쌍을 포함하는 작은 논리적 레코드인 메시지로 구성된다.
message Car {
int32 id = 1;
string name = 2;
}
이런 proto 파일을 protoc 컴파일러로 컴파일을 하면 데이터에 접근할 수 있는 각 언어에 맞는 형태의 데이터 클래스를 생성한다.
만들어진 클래스는 각 필드를 위한 접근자 외에도 전체 구조를 바이트로 직렬화하거나 바이트로부터 전체 구조를 파싱하는 메서드들을 제공한다.