Introdução: REST morreu? Viva o gRPC!
Você já se pegou pensando que sua API REST funciona como o velho correio — você envia uma requisição e espera a resposta, e depois ainda precisa parsear um JSON que pesa mais que os próprios dados? Se sim, bem-vindo ao mundo do gRPC em TypeScript. Essa tecnologia promete velocidade, rigidez de tipos e transmissão de dados em streaming. Mas, como qualquer ferramenta poderosa, o gRPC não é uma bala de prata. Neste artigo, vamos analisar quando vale a pena usá-lo e quando é melhor ficar com o REST tradicional. E tudo isso com exemplos práticos em TypeScript, porque teoria seca é chato.
Vamos falar sobre como o gRPC muda as regras do jogo em microsserviços, por que o Protobuf não é apenas "mais um formato", e como o TypeScript nos ajuda a não nos perdermos nesse zoológico de tipos. Vamos lá!
O que é gRPC e por que ele se deu bem com TypeScript?
gRPC é um framework para chamada remota de procedimentos (RPC), desenvolvido pelo Google. Em vez de enviar requisições HTTP com JSON, você define serviços e mensagens em arquivos .proto (Protocol Buffers) e então gera o código cliente e servidor. As principais características: formato binário de dados, suporte a streams, tipagem estrita e comunicação bidirecional.
Agora imagine que você está programando em TypeScript. Você já tem tipagem estática, mas na API REST ela frequentemente "quebra" na fronteira com o JSON. gRPC em TypeScript resolve esse problema de forma radical: os tipos são gerados automaticamente a partir dos arquivos .proto. Você não precisa mais adivinhar o que veio na resposta — o compilador TypeScript dirá isso a você durante o desenvolvimento.
Por que TypeScript é o par ideal para gRPC?
- Ecossistema unificado de tipos: Os tipos Protobuf se transformam em interfaces TypeScript. Nada de
anyeas any. - Autocompletar: Sua IDE entende todos os campos de requisições e respostas.
- Segurança em refatoração: Renomeou um campo no
.proto? O TypeScript destacará todos os lugares onde ele é usado.
Quando o gRPC em TypeScript é a escolha dos campeões?
Nem todo projeto exige gRPC. Mas existem cenários onde ele proporciona um ganho de desempenho e conveniência de 10 vezes. Vamos analisá-los em ordem.
1. Microsserviços em TypeScript: comunicação interna
Se você tem de 5 a 10 microsserviços em TypeScript que se comunicam constantemente entre si, o gRPC é seu melhor amigo. Imagine: o serviço de usuários envia dados para o serviço de pedidos. Sem gRPC, você serializaria JSON, desserializaria e verificaria tipos manualmente. Com gRPC, isso acontece no nível do protocolo.
Exemplo de um serviço simples:
// user.protoservice UserService { rpc GetUser (GetUserRequest) returns (User);}
message GetUserRequest { string user_id = 1;}
message User { string id = 1; string name = 2; string email = 3;}Após a geração do código, você obtém um cliente estritamente tipado:
import { UserServiceClient } from './generated/user_grpc_pb';import { GetUserRequest } from './generated/user_pb';
const client = new UserServiceClient('localhost:50051', grpc.credentials.createInsecure());
const request = new GetUserRequest();request.setUserId('123');
client.getUser(request, (error, user) => { if (!error) { console.log(user.getName()); // TypeScript sabe que isso é string }});Quando usar: quando cada milissegundo de latência entre serviços é crítico (por exemplo, em sistemas financeiros ou servidores de jogos).
2. Transmissão de dados em streaming (Streaming)
REST não sabe fazer streaming direito. WebSocket sabe, mas é outro protocolo. O gRPC suporta quatro tipos de streams: unidirecional (cliente->servidor), servidor (servidor->cliente) e bidirecional