gRPC para Go (Golang): bibliotecas, ejemplos y guía práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

gRPC para Go (Golang): bibliotecas y ejemplos



gRPC es un framework de alto rendimiento para llamadas a procedimientos remotos (RPC) de Google, basado en HTTP/2 y Protocol Buffers (protobuf). Para el lenguaje Go existe la implementación oficial grpc-go, que permite crear microservicios eficientes con soporte para transmisión bidireccional por flujo, cifrado TLS e interceptores (interceptors). En este artículo encontrará una descripción completa de las herramientas, ejemplos de servidor y cliente, así como recomendaciones prácticas.



Bibliotecas principales para gRPC en Go



  • google.golang.org/grpc — biblioteca principal de gRPC para Go. Incluye partes de servidor y cliente, soporte para flujos, metadatos y balanceo de carga.
  • google.golang.org/protobuf — paquete para trabajar con mensajes protobuf: compilación, serialización, deserialización.
  • github.com/golang/protobuf/protoc-gen-go — plugin para el compilador protoc, que genera código Go a partir de archivos .proto.
  • github.com/grpc-ecosystem/grpc-gateway — utilidad para crear un proxy REST sobre gRPC (útil para compatibilidad con navegadores).


Instalación y configuración



Antes de comenzar, instale el compilador protobuf y los plugins:



# Instalación de protoc (Linux/macOS)sudo apt install protobuf-compiler  # Ubuntu/Debianbrew install protobuf              # macOS

# Instalación de plugins para Gogo install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest


Después de la instalación, actualice el PATH agregando $GOPATH/bin.



Definición del servicio mediante archivo .proto



Cree un archivo 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;}


Genere el código Go con el comando:



protoc --go_out=. --go-grpc_out=. hello.proto


Aparecerán los archivos hello.pb.go (mensajes) y hello_grpc.pb.go (servicio).



Ejemplo de servidor en 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 normal return stream.Send(&pb.HelloReply{Message: "Hello, " + req.Name})}

func (s *server) SayHelloStream(req *pb.HelloRequest, stream pb.Greeter_SayHelloServer) error { // Respuesta por flujo for i := 0; i < 5; i++ { if err := stream.Send(&pb.HelloReply{Message: "Hello " + 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 escuchando en :50051") if err := s.Serve(lis); err != nil { log.Fatalf("Error al servir: %v", err) }}


Ejemplo de cliente en 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("no se pudo conectar: %v", err) } defer conn.Close()

client := pb.NewGreeterClient(conn) ctx, ca

Recommendations