RPC
gRPC
에 대해 알기 전에, RPC
에 대해 알아볼 필요가 있다.
RPC (Remote Procedure Calls) 는 네트워크로 연결된 서버 상의 함수와 같은 프로시저를 원격으로 호출 기능을 지원한다.
흔하게 사용하는 Socket
방식처럼 네트워크 연결 방식과 호출 방식에 대한 고민을 덜어주고, 원격지에 있는 서버의 프로지서를 클라이언트 내부 함수처럼 사용할 수 있다.
IDL (Interface Definication Language) 기반으로 다양한 언어를 지원하기 때문에 확장성과 인터페이스 연동이 용이한 강점이 있다.
RPC 의 Stub(스텁)
Stub
은 RPC
를 이해하기 위한 중요한 개념 중 하나이다.
클라이언트와 서버는 서로 다른 주소 공간을 사용하기 때문에, 함수 호출에 필요한 매개 변수를 변환해줘야하는 기능이 필요하고, 그 기능을 담당하는 것이 스텁이다.
Client Stub 클라이언트 스텁은 프로시저의 함수 호출을 위해 파라미터 변수 변환인 Marshalling (마샬링)
과 함수 결과 반환 데이터를 변환하는 역할을 한다.
Server Stub 서버 스텁은 클라이언트로부터 전달된 매개 변수 역변환인 Unmarshalling (언마샬링)
과 함수 결과 반환하는 역할을 한다.
RPC 동작 순서
IDL
를 사용하여 함수 호출 규약을 정의한다.Stub Code
안 명시된 함수는 원시코드의 형태로, 상세 기능은 서버에서 구현한다.Stub Code
는 클라이언트/서버 함께 빌드한다.
- 클라이언트는
RPC Runtime
을 통해서 원격 프로시저 함수를 호출한다. - 서버는 수신한 프로시저 호출을 처리하고 결과를 반환한다.
gRPC
gRPC 는 구글에서 개발한 Remote Procedure Calls 오픈 소스 원격 프로시저 호출 시스템이다.
모든 환경에서 실행할 수 있는 고성능 RPC 프레임워크로서, HTTP/2
프로토콜 기반하여 Protocal Buffers
프로토콜 버퍼를 활용하여
메시지를 직렬화하고, 인증, 양방향 스트리밍 및 흐름 제어, 차단 및 비차단 바인딩, 취소 및 타임아웃 등 다양한 기능을 지원한다.
원격 프로시저 호출은 서비스 기능을 제공하는 서버에서 만든 함수를 클아이언트에서 그대로 호출하여 사용하는 것을 의미한다. 이는, 다른 시스템에 있는 서버의 함수를 직접 호출할 수 있기 때문에 다양한 형태의 분산 애플리케이션과 서비스를 구축할 수 있는 특징을 가질 수 있다.
gRPC 특징
HTTP/2
프로토콜 기반 네크워크 통신 지원한다.Protobuf
프로토콜 버퍼 사용한 메시지 직렬화/역직렬화 지원으로 통신 속도 빠르다.SSL/TLS
사용한 네트워크 통신 암호화를 지원하여OAuth
,JWT
와 같은 인증 프로토콜에 보안 강화가 가능하다.- 다양한 언어에서 개발 구축이 가능하도록 지원한다.
- Proto File 만 배포하면 환경 및 프로그램 언어와 관계없이 데이터 통신이 가능하다
HTTP/2
프로토콜 관련 Post : HTTP/2 간단 정리
ProtoBuf (Protocol Buffer, 프로토콜 버퍼)
ProtoBuf
는 구글에서 개발한 구조화된 데이터를 Serialization 직렬화하는 기법이다.
Serialization 직렬화? 데이터를 바이트 코드로 변환하는 작업
ProtoBuf
와 같은 직렬화는 일반 Text 형식의 데이터의 크기를 줄여주어 데이터 통신에 대한 성능 최적화 역할을 한다.
Proto File
Proto File은 ProtoBuf
의 기본 정보를 명세하는 파일이다.
데이터 통신에 필요한 데이터 타입, 필드명, 필수 여부 등 기본적인 메시지 정의를 할 수 있다.
proto3
를 지원하면서 기존 proto2
보다 더 많은 언어를 지원한다.
Conclusion
gRPC
를 사용하면 Socket
방식의 네트워크 통신 기반인 REST
와 다른 패러다임으로 서비스를 구축할 수 있는 것을 알게 되었다.
하지만 구현의 어려움과 지원 기능의 한계 등의 이유로 REST
보단 많은 레퍼런스가 없는 것 같다.
그렇지만, HTTP/2
네트워크 통신이 기본 기능인 만큼 실시간 스트리밍, 양방향 데이터 통신과 같은 상황에 맞는 기능 구현이 필요할 때는 도입에 대해
적극 검토할 필요가 있을 것 같다.