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 프로그래밍과도 잘 어울린다.
'Back-end' 카테고리의 다른 글
[Redis] Redis 데이터 저장 근데 protobuf를 곁들인 (3) | 2024.10.14 |
---|---|
[gRPC] Armeria + gRPC 띄워보기 (7) | 2024.10.07 |
[Spring/Thymeleaf] option 태그에 enum 동적으로 넣기 (0) | 2024.08.10 |
[Redis] Cache 전략 (0) | 2024.07.29 |
Redis의 분산락 사용에 대해서 (0) | 2024.07.19 |