Conceptos básicos de gRPC
10 ejemplos para empezar con gRPC y Protobuf - 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para empezar con gRPC y Protobuf - 7 básicos y 3 intermedios.
protoc (compilador de Protocol Buffers) desde protobuf releases.go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest$GOPATH/bin o $(go env GOPATH)/bin esté en tu PATH.mkdir greet && cd greet && go mod init example.com/greet.go get google.golang.org/grpc@latest.Define un servicio y mensajes en api/greet/v1/greet.proto.
syntax = "proto3";
package greet.v1;
option go_package = "example.com/greet/api/greet/v1;greetv1";
service Greeter {
rpc SayHello(HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}proto3 es la sintaxis predeterminada para las nuevas API de gRPC.go_package establece la ruta de importación y el nombre del paquete de Go para el código generado.Relacionado: Diseño de esquemas de Protocol Buffers - reglas de campos
Ejecuta protoc desde la raíz del módulo.
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/greet/v1/greet.proto--go_out emite las estructuras de mensajes (greet.pb.go).--go-grpc_out emite las interfaces de servicio (greet_grpc.pb.go).paths=source_relative mantiene los archivos generados junto al .proto.Relacionado: gRPC en Go: Contratos, Streaming y Rendimiento - modelo de contrato
Incrusta UnimplementedGreeterServer para compatibilidad futura.
package main
import (
"context"
greetv1 "example.com/greet/api/greet/v1"
)
type greeterServer struct {
greetv1.UnimplementedGreeterServer
}
func (s *greeterServer) SayHello(ctx context.Context, req *greetv1.HelloRequest) (*greetv1.HelloResponse, error) {
return &greetv1.HelloResponse{Message: "hola, " + req.GetName()}, nil
}Unimplemented… para que las nuevas RPC no rompan las compilaciones.GetName() - manejan mensajes nulos de forma segura.(nil, err) para fallos; gRPC mapea los errores a códigos de estado.Relacionado: Códigos de error y mapeo de estado de gRPC - devuelve errores
Registra el servicio y bloquea en Serve.
package main
import (
"log"
"net"
greetv1 "example.com/greet/api/greet/v1"
"google.golang.org/grpc"
)
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatal(err)
}
s := grpc.NewServer()
greetv1.RegisterGreeterServer(s, &greeterServer{})
log.Println("escuchando en :50051")
log.Fatal(s.Serve(lis))
}50051 es convencional para ejemplos; usa configuración en producción.grpc.NewServer() acepta opciones de servidor (TLS, interceptores) cubiertas en páginas avanzadas.Serve se bloquea hasta que el proceso sale o se ejecuta GracefulStop.Crea un cliente inseguro para desarrollo local.
package main
import (
"log"
greetv1 "example.com/greet/api/greet/v1"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
conn, err := grpc.NewClient("localhost:50051",
grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
client := greetv1.NewGreeterClient(conn)
_ = client // usar en el próximo ejemplo
}grpc.NewClient es la API de marcado moderna (reemplaza patrones Dial obsoletos).Close() en las conexiones al apagar para liberar recursos HTTP/2.insecure.Pasa un contexto para plazos y cancelación.
package main
import (
"context"
"fmt"
"log"
"time"
greetv1 "example.com/greet/api/greet/v1"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
conn, err := grpc.NewClient("localhost:50051",
grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
client := greetv1.NewGreeterClient(conn)
resp, err := client.SayHello(ctx, &greetv1.HelloRequest{Name: "world"})
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.GetMessage())
}status.FromError.Relacionado: Middleware, Interceptores y Metadatos de gRPC - metadatos e interceptores
Usa status.Error para fallos tipificados.
import (
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func validateName(name string) error {
if name == "" {
return status.Error(codes.InvalidArgument, "se requiere el nombre")
}
return nil
}codes.InvalidArgument señala errores del cliente; usa codes.Internal para errores del servidor.fmt.Errorf simple se convierte en Unknown a menos que adjuntes el estado con status.Errorf.status.Code(err), no por coincidencia de cadenas.Relacionado: Códigos de error y mapeo de estado de gRPC - mapeo de códigos
Habilita la reflexión para introspeccionar servicios sin archivos proto en disco.
import "google.golang.org/grpc/reflection"
func main() {
lis, _ := net.Listen("tcp", ":50051")
s := grpc.NewServer()
greetv1.RegisterGreeterServer(s, &greeterServer{})
reflection.Register(s)
s.Serve(lis)
}grpcurl -plaintext localhost:50051 list descubre servicios en tiempo de ejecución.Deja de aceptar RPCs nuevas mientras terminas el trabajo en curso.
import (
"os"
"os/signal"
"syscall"
"time"
)
func serveWithGracefulStop(s *grpc.Server, lis net.Listener) {
go func() {
if err := s.Serve(lis); err != nil {
log.Fatal(err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
stopped := make(chan struct{})
go func() {
s.GracefulStop()
close(stopped)
}()
select {
case <-stopped:
case <-time.After(10 * time.Second):
s.Stop()
}
}GracefulStop espera las RPCs activas; Stop fuerza la finalización inmediata.preStop de Kubernetes y terminationGracePeriodSeconds acortados.Unavailable durante despliegues continuos.Registra el protocolo de salud estándar de gRPC para sondeos.
import (
"google.golang.org/grpc/health"
healthpb "google.golang.org/grpc/health/grpc_health_v1"
)
func main() {
s := grpc.NewServer()
greetv1.RegisterGreeterServer(s, &greeterServer{})
healthServer := health.NewServer()
healthpb.RegisterHealthServer(s, healthServer)
healthServer.SetServingStatus("greet.v1.Greeter", healthpb.HealthCheckResponse_SERVING)
// ... Serve(lis)
}grpc.health.v1.Health/Check.NOT_SERVING durante la inicialización de dependencias antes de marcar el pod como listo.Relacionado: Mejores prácticas de gRPC - plazos, versionado, K8s
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores go fix - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de la placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026