gRPC는 'Google Remote Procedure Call'의 약자입니다. Google에서 개발한 플러그인 오픈소스 RPC(Remote Procedure Call) 프레임워크입니다.
rpc는 이름에서 알 수 있듯 한 프로그램이 네트워크를 통해 다른 컴퓨터에 있는 프로그램의 함수나 프로시저를 호출할 수 있게 해주는 프로토콜입니다. 마치 로컬 시스템에서 함수를 호출하는 것처럼 원격 시스템의 함수를 호출할 수 있게 해줍니다.
# 서버 쪽 코드
def add_numbers(a, b):
return a + b
# 클라이언트 쪽 코드
result = remote_server.call("add_numbers", 5, 3) # 8이 반환됨
rpc에는 stub이라는 개념이 있습니다. stub은 아래와 같은 일을 처리해줍니다.
1. 직렬화/역직렬화
설명을 보면 잘 이해가 되지 않으지 stub이 없을 경우와 있을 경우 코드가 어떻게 달라지는지 claude에게 짜달라고 해보겠습니다.
# 클라이언트 측 코드
def manual_rpc_call(a, b):
# 1. 네트워크 연결 설정
socket = create_socket()
socket.connect(("server.example.com", 8080))
# 2. 데이터 직렬화
data = {
"method": "add",
"params": [a, b],
"id": generate_request_id()
}
serialized_data = json.dumps(data)
# 3. 데이터 전송
try:
socket.send(serialized_data.encode())
# 4. 응답 대기 및 수신
response = socket.recv(1024)
# 5. 응답 역직렬화
result = json.loads(response.decode())
return result["result"]
except Exception as e:
print(f"Error: {e}")
finally:
socket.close()
# 사용
result = manual_rpc_call(5, 3)
# 자동 생성된 Stub 코드
class CalculatorStub:
def __init__(self):
self.channel = create_secure_channel()
def Add(self, a, b):
# 모든 복잡한 과정이 Stub 내부에 캡슐화됨
request = AddRequest(a=a, b=b)
return self.channel.invoke("Add", request)
# 클라이언트 측 사용 코드
calculator = CalculatorStub()
result = calculator.Add(5, 3) # 매우 간단!
한눈에 봐도 stub을 사용하면 코드가 더욱 간결해지고 개발자가 신경쓸 부분이 적어지는 것을 알 수 있습니다.
rpc는 간단하지만 기능이 제한적이기 때문에 사내 시스템 간 간단한 통신, 레거시 시스템 연동, 단순한 원격 프로시저 호출 등에 사용이 되고
grpc는 복잡하지만 고성능을 제공하기 때문에 Google Cloud Services, Netflix의 마이크로서비스, Kubernetes 내부 통신, 실시간 채팅 시스템
IoT 디바이스 통신 등에 사용됩니다.