gRPC para Go (Golang): bibliotecas e exemplos
gRPC é um framework de chamada de procedimento remoto (RPC) de alto desempenho do Google, baseado em HTTP/2 e Protocol Buffers (protobuf). Para a linguagem Go, existe a implementação oficial grpc-go, que permite criar microsserviços eficientes com suporte a transmissão bidirecional por streaming, criptografia TLS e interceptadores (interceptors). Neste artigo, você encontrará uma descrição completa das ferramentas, exemplos de servidor e cliente, além de recomendações práticas.
Principais bibliotecas para gRPC em Go
- google.golang.org/grpc — biblioteca principal do gRPC para Go. Inclui partes de servidor e cliente, suporte a streams, metadados e balanceamento de carga.
- google.golang.org/protobuf — pacote para trabalhar com mensagens protobuf: compilação, serialização, desserialização.
- github.com/golang/protobuf/protoc-gen-go — plugin para o compilador
protoc, que gera código Go a partir de arquivos.proto. - github.com/grpc-ecosystem/grpc-gateway — utilitário para criar proxies REST sobre gRPC (útil para compatibilidade com navegadores).
Instalação e configuração
Antes de começar, instale o compilador protobuf e os plugins:
# Instalação do protoc (Linux/macOS)sudo apt install protobuf-compiler # Ubuntu/Debianbrew install protobuf # macOS
# Instalação dos plugins para Gogo install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latestApós a instalação, atualize o PATH adicionando $GOPATH/bin.
Definição do serviço através do arquivo .proto
Crie o arquivo hello.proto:
syntax = "proto3";
package hello;
option go_package = "example.com/grpc-demo/hello";
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); rpc SayHelloStream (HelloRequest) returns (stream HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Gere o código Go com o comando:
protoc --go_out=. --go-grpc_out=. hello.protoSerão gerados os arquivos hello.pb.go (mensagens) e hello_grpc.pb.go (serviço).
Exemplo de servidor em Go
package main
import ( "log" "net"
pb "example.com/grpc-demo/hello" "google.golang.org/grpc")
type server struct { pb.UnimplementedGreeterServer}
func (s *server) SayHello(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // RPC comum return stream.Send(&pb.HelloReply{Message: "Olá, " + req.Name})}
func (s *server) SayHelloStream(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // Resposta por streaming for i := 0; i < 5; i++ { if err := stream.Send(&pb.HelloReply{Message: "Olá " + req.Name + " #" + string(rune(i))}); err != nil { return err } } return nil}
func main() { lis, _ := net.Listen("tcp", ":50051") s := grpc.NewServer() pb.RegisterGreeterServer(s, &server{}) log.Println("Servidor ouvindo na porta :50051") if err := s.Serve(lis); err != nil { log.Fatalf("Falha ao servir: %v", err) }}Exemplo de cliente em Go
package main
import ( "context" "log" "time"
pb "example.com/grpc-demo/hello" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure")
func main() { conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("não conectou: %v", err) } defer conn.Close()
client := pb.NewGreeterClient(conn) ctx, ca Também na biblioteca
Rate Limiting em C++: bibliotecas e implementação para proteção de API
Cliente Redis para C# (.NET): StackExchange.Redis — conexão e exemplos
Processamento JSON em Java: bibliotecas Jackson e Gson para manipulação de dados
Tokens JWT em Kotlin: Guia Completo com Exemplos de Código
Registro em Go: Visão geral da biblioteca padrão log e alternativas