Por que o REST já não está dando conta, e o gRPC entra em cena?
Imagine: você está escrevendo um microsserviço em Node.js que troca dados a cada segundo com uma dezena de outros serviços. A API REST está lenta, a serialização JSON consome CPU, e o WebSocket para chamadas RPC complexas vira um verdadeiro pesadelo. Familiar?
Conheça — gRPC em JavaScript. Não é apenas uma sigla da moda, mas uma ferramenta real que o Google criou para suas necessidades internas e depois abriu o código-fonte. Hoje vamos analisar quando usar gRPC em projetos JS, e quando é melhor ficar com o bom e velho REST. Spoiler: gRPC não é uma bala de prata, mas nas mãos certas, faz milagres.
O que é gRPC em termos simples
gRPC é um framework para chamada remota de procedimentos (Remote Procedure Call). Você define o serviço e seus métodos em um arquivo .proto, e então gera o código do cliente e do servidor em qualquer linguagem suportada, incluindo JavaScript. A base é o Protocol Buffers (protobuf) — um formato binário de serialização que funciona muito mais rápido que o JSON.
Principais recursos do gRPC:
- Protocolo binário — os dados são transmitidos em formato binário compacto, não em JSON textual
- HTTP/2 — multiplexação, compressão de cabeçalhos, server push
- Tipagem forte — o contrato do serviço é descrito no arquivo proto, sem "será que o campo vem ou não"
- Quatro modos de operação: unário (requisição-resposta), server streaming, client streaming, bidirectional streaming
Quando usar gRPC em JavaScript: 5 cenários infalíveis
1. Arquitetura de microsserviços com alta carga
Se seus microsserviços em Node.js se comunicam centenas de vezes por segundo, o gRPC oferece ganho de desempenho de 5 a 10 vezes em comparação com o REST. Graças ao protocolo binário, o tamanho do payload é reduzido, e o HTTP/2 evita abrir uma nova conexão para cada requisição.
// proto/order.protosyntax = "proto3";
service OrderService { rpc CreateOrder (OrderRequest) returns (OrderResponse); rpc ListOrders (ListRequest) returns (stream OrderResponse);}
message OrderRequest { string user_id = 1; repeated string item_ids = 2;}
message OrderResponse { string order_id = 1; string status = 2; double total = 3;}
message ListRequest { string user_id = 1; int32 limit = 2;}2. Streaming de dados em tempo real
Precisa transmitir cotações de ações, logs de servidor ou atualizações de chat em tempo real? REST com polling é coisa do passado. Bidirectional streaming no gRPC permite que cliente e servidor troquem mensagens em ambas as direções simultaneamente através de uma única conexão.
// Cliente em Node.js: inscrição em stream de cotaçõesconst grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');
const packageDef = protoLoader.loadSync('proto/stock.proto');const stockProto = grpc.loadPackageDefinition(packageDef).stock;
const client = new stockProto.StockService( 'localhost:50051', grpc.credentials.createInsecure());
// Solicita o streamconst call = client.SubscribePrices({ symbol: 'AAPL' });
call.on('data', (priceUpdate) => { console.log(`Novo preço ${priceUpdate.symbol}: $${priceUpdate.price}`);});
call.on('end', () => { console.log('Stream finalizado');});3. Aplicativos móveis com tráfego limitado
Cada kilobyte conta, e as respostas JSON das APIs REST são excessivamente inchadas. Protobuf comprime os dados em 30-70% em comparação com JSON. Isso é crítico para clientes móveis em React Native ou Flutter, onde o gRPC-web é usado como proxy.
4. Arquitetura multilinguagem
Você tem backend em Go, serviço de ML em Python e frontend em JavaScript (via gRPC-web)? O gRPC gera clie