gRPC para TypeScript: bibliotecas e exemplos de uso

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

gRPC para TypeScript: bibliotecas e exemplos

\n\n

gRPC é um framework RPC de alto desempenho do Google, que opera sobre HTTP/2 e utiliza Protocol Buffers (protobuf) para serialização de dados. Em TypeScript (e Node.js), o gRPC permite construir arquiteturas de microsserviços eficientes com suporte a streams e comunicação bidirecional. Nesta página, abordaremos as principais bibliotecas, a configuração do ambiente de trabalho e criaremos um exemplo funcional de aplicação cliente-servidor.

\n\n

Principais bibliotecas para gRPC em TypeScript

\n\n

Para trabalhar com gRPC no ecossistema TypeScript, existem três pacotes-chave:

\n\n
    \n
  • @grpc/grpc-js — implementação pura em JavaScript do gRPC (sem dependências nativas), com suporte total a HTTP/2 e funcionando em Node.js 12+.
  • \n
  • @grpc/proto-loader — carregador de arquivos .proto, que cria dinamicamente classes JavaScript com base nas definições do protobuf.
  • \n
  • ts-proto — gerador de tipos TypeScript a partir de arquivos proto. Alternativa ao grpc-tools integrado, mas com melhor suporte a tipagem estrita.
  • \n
\n\n

Instalação de todos os componentes com um único comando:

\n\n
npm install @grpc/grpc-js @grpc/proto-loader ts-proto\nnpm install -D typescript @types/node
\n\n

Criação do arquivo .proto

\n\n

Vamos começar definindo o serviço. Crie o arquivo hello.proto:

\n\n
syntax = "proto3";\n\npackage hello;\n\nservice Greeter {\n  rpc SayHello (HelloRequest) returns (HelloReply);\n  rpc SayHelloStream (HelloRequest) returns (stream HelloReply);\n}\n\nmessage HelloRequest {\n  string name = 1;\n}\n\nmessage HelloReply {\n  string message = 1;\n}
\n\n

Geração de tipos TypeScript com ts-proto

\n\n

O ts-proto cria interfaces e classes de mensagem completas. Instale o protoc e o plugin:

\n\n
npm install -g protoc-gen-ts-proto\nprotoc --ts_proto_out=./generated hello.proto
\n\n

Como resultado, você obterá o arquivo generated/hello.ts com as interfaces HelloRequest, HelloReply e o serviço tipado GreeterClient.

\n\n

Parte do servidor (servidor gRPC em TypeScript)

\n\n

Crie o arquivo server.ts:

\n\n
import * as grpc from '@grpc/grpc-js';\nimport * as protoLoader from '@grpc/proto-loader';\nimport { ProtoGrpcType } from './generated/hello';\n\nconst packageDef = protoLoader.loadSync('hello.proto');\nconst grpcObj = (grpc.loadPackageDefinition(packageDef) as unknown) as ProtoGrpcType;\nconst server = new grpc.Server();\n\nserver.addService(grpcObj.hello.Greeter.service, {\n  SayHello: (call: any, callback: any) => {\n    const name = call.request.name;\n    callback(null, { message: `Olá, ${name}!` });\n  },\n  SayHelloStream: (call: any) => {\n    const name = call.request.name;\n    for (let i = 0; i < 5; i++) {\n      call.write({ message: `Mensagem ${i + 1} para ${name}` });\n    }\n    call.end();\n  }\n});\n\nserver.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {\n  console.log('Servidor iniciado na porta 50051');\n});
\n\n

Parte do cliente (cliente gRPC em TypeScript)

\n\n

Crie o arquivo client.ts:

\n\n
import * as grpc from '@grpc/grpc-js';\nimport * as protoLoader from '@grpc/proto-loader';\nimport { ProtoGrpcType } from './generated/hello';\n\nconst packageDef = protoLoader.loadSync('hello.proto');\nconst grpcObj = (grpc.loadPackageDefinition(packageDef) as unknown) as ProtoGrpcType;\n\nconst client = new grpcObj.hello.Greeter(\n  'localhost:50051',\n  grpc.credentials.createInsecure()\n);\n\n// Chamada unária\nclient.SayHello({ name: 'Alice' }, (err, response) => {\n  if (!err) console.log('Resposta:', response?.message);\n});\n\n// Chamada com server-streaming\nconst stream = client.SayHelloStream({ name: 'Bob' });\nstream.on('data', (data) => console.log('Stream:', data.message));\nstream.on('end', (                    

Recommendations