gRPC
gRPC Remote Procedure Call
Google의 고성능 RPC 프레임워크. Protocol Buffers 사용. HTTP/2 기반.
gRPC Remote Procedure Call
Google의 고성능 RPC 프레임워크. Protocol Buffers 사용. HTTP/2 기반.
gRPC(gRPC Remote Procedure Call)는 Google이 개발한 고성능 RPC 프레임워크입니다. Protocol Buffers(protobuf)를 기본 직렬화 포맷으로 사용하며, HTTP/2 기반으로 동작합니다.
REST API의 텍스트 기반 JSON과 달리, gRPC는 바이너리 프로토콜을 사용해 더 작은 페이로드와 빠른 직렬화/역직렬화를 제공합니다. 마이크로서비스 간 통신에서 특히 강점을 발휘합니다.
Kubernetes, Envoy, etcd 등 클라우드 네이티브 도구들이 gRPC를 채택하고 있어 마이크로서비스 아키텍처의 사실상 표준이 되었습니다.
.proto 파일 정의
syntax = "proto3";
package user;
// 서비스 정의
service UserService {
// 단일 요청-응답
rpc GetUser(GetUserRequest) returns (User);
// 서버 스트리밍
rpc ListUsers(ListUsersRequest) returns (stream User);
// 양방향 스트리밍
rpc Chat(stream ChatMessage) returns (stream ChatMessage);
}
// 메시지 타입 정의
message User {
int32 id = 1;
string name = 2;
string email = 3;
}
message GetUserRequest {
int32 id = 1;
}
Node.js 서버 구현
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
// proto 파일 로드
const packageDefinition = protoLoader.loadSync('user.proto');
const userProto = grpc.loadPackageDefinition(packageDefinition).user;
// 서비스 구현
const server = new grpc.Server();
server.addService(userProto.UserService.service, {
getUser: (call, callback) => {
const user = { id: call.request.id, name: '홍길동', email: 'hong@example.com' };
callback(null, user);
},
listUsers: (call) => {
users.forEach(user => call.write(user));
call.end();
},
});
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
Node.js 클라이언트
const client = new userProto.UserService(
'localhost:50051',
grpc.credentials.createInsecure()
);
// 단일 요청
client.getUser({ id: 1 }, (err, user) => {
console.log(user); // { id: 1, name: '홍길동', email: '...' }
});
// 스트리밍 수신
const stream = client.listUsers({});
stream.on('data', (user) => console.log(user));
stream.on('end', () => console.log('완료'));
아키텍트
"마이크로서비스 간 통신을 REST에서 gRPC로 전환하는 게 어때요?"
개발자
"성능은 확실히 좋아지겠죠. 근데 디버깅이 좀 불편해요. JSON처럼 curl로 테스트하기 어렵고요."
아키텍트
"grpcurl이나 Postman gRPC 기능 쓰면 돼. 그리고 외부 API는 REST 유지하고, 내부 서비스 간 통신만 gRPC로 가자."
브라우저 직접 호출 불가
일반 브라우저에서 gRPC 호출이 불가능합니다. 웹 클라이언트는 gRPC-Web이나 REST 게이트웨이가 필요합니다.
proto 파일 관리
.proto 파일 변경 시 모든 서비스의 코드를 재생성해야 합니다. proto 파일 버전 관리와 호환성 유지가 중요합니다.
디버깅 복잡성
바이너리 프로토콜이라 네트워크 패킷을 직접 읽기 어렵습니다. 전용 도구(grpcurl, Postman)가 필요합니다.