Introdução: REST morreu? Viva o gRPC!
\nNo mundo do desenvolvimento Go, há um debate constante: o que escolher para a comunicação entre microsserviços — o bom e velho REST ou o moderno gRPC? Se você já escreveu em Go, provavelmente já ouviu que gRPC é "rápido, rigoroso e binário". Mas será que é realmente assim? E o principal — quando usá-lo para não complicar sua vida?
\nMeu nome é [Seu Nome], e sou desenvolvedor Go com muitos anos de experiência. Hoje no PythonLib, vamos analisar o gRPC em Go com exemplos reais: onde ele é indispensável e onde é melhor ficar com o REST. Vamos lá!
\n\nO que é gRPC e por que Go?
\ngRPC é um framework de chamada de procedimento remoto (RPC) do Google, que usa Protocol Buffers (protobuf) para serialização de dados. Go é uma das linguagens de "primeira linha" de suporte ao gRPC, junto com C++ e Java. Por que isso?
\n- \n
- Desempenho: Go compila para código nativo, e o protobuf serializa dados em formato binário muito mais rápido que JSON. \n
- Simplicidade: Um servidor Go com gRPC é escrito em literalmente 20 minutos. \n
- Tipagem estática: Arquivos .proto geram clientes e servidores estritamente tipados. \n
Mas o principal é que o gRPC em Go oferece streaming (transmissão por fluxo) de forma nativa. Isso é um killer feature para muitas tarefas.
\n\nQuando o gRPC em Go é seu melhor amigo
\n1. Microsserviços com alta carga
\nSe seus serviços trocam milhares de requisições por segundo, o gRPC mostrará todo o seu potencial. O protocolo binário e o HTTP/2 reduzem a latência e a carga na CPU.
\nExemplo: um serviço de recomendações em tempo real. Cada requisição a ele é um pequeno pacote de dados, mas são muitos. REST com JSON seria "pesado" e lento.
\n\n2. Streaming de dados (atualizações ao vivo)
\ngRPC suporta quatro tipos de streaming: server-side, client-side e bidirecional. Em Go, isso é implementado através de canais (channels), tornando o código elegante.
\nExemplo: um serviço de monitoramento que envia métricas para o servidor a cada 100 ms. REST exigiria manter um WebSocket ou fazer long-polling. Com gRPC, basta chamar um stream.
\n\n3. Aplicativos móveis e IoT
\nO formato binário do protobuf economiza tráfego e bateria. Um servidor Go com gRPC atende facilmente milhares de clientes móveis.
\n\nQuando o gRPC é complexidade desnecessária
\n1. Aplicações CRUD simples
\nSe você tem um servidor web típico com alguns endpoints (criar usuário, obter lista), gRPC é como usar um canhão para matar uma formiga. REST + JSON será mais simples, e a diferença de desempenho é imperceptível.
\n\n2. Clientes de navegador
\nOs navegadores não suportam gRPC diretamente (apenas através de gRPC-Web, que adiciona uma camada extra). Para SPAs em React/Vue, é melhor ficar com REST ou GraphQL.
\n\n3. Equipe iniciante em Go
\ngRPC exige compreensão de protobuf, interceptadores e balanceamento de carga. Se sua equipe está apenas aprendendo Go, comece com REST — isso reduz a barreira de entrada.
\n\nExemplo real: escrevendo servidor e cliente em Go
\nVamos escrever um serviço simples para obter informações de um usuário. Isso mostrará como o gRPC se parece no código.
\n\nPasso 1: Definindo o arquivo .proto
\nsyntax = "proto3";\npackage user;\n\nservice UserService {\n rpc GetUser (UserRequest) returns (UserResponse);\n}\n\nmessage UserRequest {\n int32 id = 1;\n}\n\nmessage UserResponse {\n string name = 1;\n string email = 2;\n}\nCompilamos: protoc --go_out=. --go-grpc_out=. user.proto
Passo 2: Implementando o servidor em Go
\npackage main\n\nimport (\n "context"\n "log"\n "net"\n "google.golang.org/grpc"\n pb "path/to/your/proto"\n)\n\ntype server struct {\n pb.UnimplementedUserServiceServer\n}\n\nfunc (s *server) GetUser(ctx context.Context, req *pb.UserRequest) (*pb.UserResponse, error) {\n // Simulação de banco de dados\n users := map[int32]*pb.UserResponse{\n 1: {Name: "Alice",