-->

 

gRPC

gRPC(gRPC Remote Procedure Call)은 구글에서 만든 오픈 소스 고성능 원격 프로시저 호출(RPC) 프레임워크다. 

로드 밸런싱, 추적, 상태 검사 및 인증을 위한 플러그형 지원을 통해 데이터 센터 내부 및 데이터 센터 간 서비스를 효율적으로 연결할 수 있다. 또한 분산 컴퓨팅의 마지막 마일에서 장치, 모바일 애플리케이션 및 브라우저를 백엔드 서비스에 연결하는 데 적용할 수 있다.

 

gRPC에서 클라이언트 애플리케이션은 마치 로컬 객체인 것처럼 다른 머신의 서버 애플리케이션에서 메서드를 직접 호출할 수 있으므로 분산 애플리케이션과 서비스를 더 쉽게 만들 수 있다. 많은 RPC 시스템에서와 마찬가지로 gRPC는 서비스를 정의하고 매개변수와 반환 유형으로 원격으로 호출할 수 있는 메서드를 지정하는 아이디어를 기반으로 한다. 서버 측에서 서버는 이 인터페이스를 구현하고 클라이언트 호출을 처리하기 위해 gRPC 서버를 실행한다. 클라이언트 측에서 클라이언트는 서버와 동일한 메서드를 제공하는 Stub(일부 언어에서는 단순히 클라이언트라고 함)을 갖는다.

Proto Buffer (=protobuf)

기본적으로 gRPC는 프로토콜 버퍼를 사용한다. json과 같이 구조화된 데이터를 직렬화/역직렬화하여 주고 받기 위함이다. .proto 텍스트 파일을 생성하고 메세지로 구조화된다. 각 메세지는 필드라고 하는 k-v 형태의 논리적인 레코드로 구성된다.

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

데이터 구조를 지정했으면 프로토버프 컴파일러를 이용해 데이터 액세스 클래스를 생성한다. 

// The greeter 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;
}

프로토버프가 지원하는 언어는 다양하며 각 언어별로 protoc 패키지를 통해 해당 프로토파일을 바이트코드로 컴파일하게 되는데 나는 주로 protoc-java, protoc-kotlin을 이용해서 사용할 예정이다. 다양한 언어를 사용하는 Polyglot 환경에서는 특히 더 유용하다. api 스펙에 해당하는 proto파일을 가지고 각자의 환경에서 컴파일러가 generate한 클래스를 개발에 이용할 수 있으니 통일된 규격의 api를 만드는 것이 가능해진다. 또한 개발자들은 비즈니스 로직에 집중할 수 있게 되어 개발 생산성이 향상된다.

프로토콜 버퍼는 버전이 있는데 현재는 proto3 버전을 사용한다. 자세한 내용은 Protobuf Documentation을 참고한다.

gRPC는 쓰레드 기반이 아니라 이벤트 기반으로 동작해서 쓰레드가 죽기전까지 작업을 계속 할 수 있다. 그래서 Spring WebFlux, Coroutine 같은 Reactive 프로그래밍과도 잘 어울린다.

+ Recent posts