Skills Agentes

Golang Grpc

Ofrece guías de uso de gRPC, organización de protobuf y patrones listos para producción en microservicios Golang: servidores/clientes, proto files, interceptores, códigos de error, TLS/mTLS, bufconn y streaming.

Solicitaread edit write glob grep bash(go:*) bash(golangci-lint:*) bash(git:*) agent webfetch mcp__context7__resolve-library-id mcp__context7__query-docs bash(protoc:*) askuserquestion bash(godig:*) bash(gopls:*) lsp mcp__gopls__*
Estrellas
3k

en todo el repo

Actividad
59

0–100, la ruta de este skill

Actualizado
el mes pasado

último commit aquí

Commits
6

últimos 90 días

Contexto
2.5k tok

85 tok en reposo

Paquete
4 archivos

32 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add samber/cc-skills-golang --skill golang-grpc --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Aplica patrones de gRPC listos para producción: interceptores, códigos de estado, TLS/mTLS, health checks y graceful shutdown
  • Guía la organización de archivos proto por dominio con directorios versionados y mensajes Request/Response
  • Corrige errores gRPC comunes: uso de codes.Unknown, falta de deadlines, reflection en producción, etc.
  • Recomienda patrones de streaming (server, client, bidireccional) según el caso de uso
  • Define cómo testear con bufconn para conexiones en memoria

Úsalo cuando

  • Implementar, revisar o depurar servidores/clientes gRPC
  • Escribir archivos proto
  • Configurar interceptores, manejo de errores con status codes o TLS/mTLS
  • Probar con bufconn o trabajar con RPCs de streaming

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Ayúdame a implementar un servidor gRPC en Go con health checks
    • Revisa este código gRPC en busca de problemas de seguridad y operabilidad
    • Cómo estructuro mis archivos proto por dominio
    • Necesito escribir tests con bufconn para mi servicio gRPC

    SKILL.md

    En inglés

    Persona: You are a Go distributed systems engineer. You design gRPC services for correctness and operability — proper status codes, deadlines, interceptors, and graceful shutdown matter as much as the happy path.

    Modes:

    • Build mode — implementing a new gRPC server or client from scratch.
    • Review mode — auditing existing gRPC code for correctness, security, and operability issues.

    Dependencies:

    • protoc: brew install protobuf
    • protoc-gen-go: go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    • protoc-gen-go-grpc: go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

    Go gRPC Best Practices

    Treat gRPC as a pure transport layer — keep it separate from business logic. The official Go implementation is google.golang.org/grpc.

    This skill is not exhaustive. Please refer to library documentation and code examples for more information. For Go package docs, symbols, versions, importers, and known vulnerabilities, → See samber/cc-skills-golang@golang-pkg-go-dev skill (godig) — prefer it over Context7 for Go package facts. To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See samber/cc-skills-golang@golang-gopls skill (gopls). Context7 remains a fallback for docs not indexed on pkg.go.dev.

    Quick Reference

    Concern Package / Tool
    Service definition protoc or buf with .proto files
    Code generation protoc-gen-go, protoc-gen-go-grpc
    Error handling google.golang.org/grpc/status with codes
    Rich error details google.golang.org/genproto/googleapis/rpc/errdetails
    Interceptors grpc.ChainUnaryInterceptor, grpc.ChainStreamInterceptor
    Middleware ecosystem github.com/grpc-ecosystem/go-grpc-middleware
    Testing google.golang.org/grpc/test/bufconn
    TLS / mTLS google.golang.org/grpc/credentials
    Health checks google.golang.org/grpc/health

    Proto File Organization

    Organize by domain with versioned directories (proto/user/v1/). Always use Request/Response wrapper messages — bare types like string cannot have fields added later. Generate with buf generate or protoc.

    Proto & code generation reference

    Server Implementation

    • Implement health check service (grpc_health_v1) — Kubernetes probes need it to determine readiness
    • Use interceptors for cross-cutting concerns (logging, auth, recovery) — keeps business logic clean
    • Use GracefulStop() with a timeout fallback to Stop() — drains in-flight RPCs while preventing hangs
    • Disable reflection in production — it exposes your full API surface
    srv := grpc.NewServer(
        grpc.ChainUnaryInterceptor(loggingInterceptor, recoveryInterceptor),
    )
    pb.RegisterUserServiceServer(srv, svc)
    healthpb.RegisterHealthServer(srv, health.NewServer())
    
    go srv.Serve(lis)
    
    // On shutdown signal:
    stopped := make(chan struct{})
    go func() { srv.GracefulStop(); close(stopped) }()
    select {
    case <-stopped:
    case <-time.After(15 * time.Second):
        srv.Stop()
    }
    

    Interceptor Pattern

    func loggingInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
        start := time.Now()
        resp, err := handler(ctx, req)
        log.Printf("method=%s duration=%s code=%s", info.FullMethod, time.Since(start), status.Code(err))
        return resp, err
    }
    

    Client Implementation

    • Reuse connections — gRPC multiplexes RPCs on a single HTTP/2 connection; one-per-request wastes TCP/TLS handshakes
    • Set deadlines on every call (context.WithTimeout) — without one, a slow upstream hangs goroutines indefinitely
    • Use round_robin with headless Kubernetes services via dns:/// scheme
    • Pass metadata (auth tokens, trace IDs) via metadata.NewOutgoingContext
    conn, err := grpc.NewClient("dns:///user-service:50051",
        grpc.WithTransportCredentials(creds),
        grpc.WithDefaultServiceConfig(`{
            "loadBalancingPolicy": "round_robin",
            "methodConfig": [{
                "name": [{"service": ""}],
                "timeout": "5s",
                "retryPolicy": {
                    "maxAttempts": 3,
                    "initialBackoff": "0.1s",
                    "maxBackoff": "1s",
                    "backoffMultiplier": 2,
                    "retryableStatusCodes": ["UNAVAILABLE"]
                }
            }]
        }`),
    )
    client := pb.NewUserServiceClient(conn)
    

    Error Handling

    Always return gRPC errors using status.Error with a specific code — a raw error becomes codes.Unknown, telling the client nothing actionable. Clients use codes to decide retry vs fail-fast vs degrade.

    Code When to Use
    InvalidArgument Malformed input (missing field, bad format)
    NotFound Entity does not exist
    AlreadyExists Create failed, entity exists
    PermissionDenied Caller lacks permission
    Unauthenticated Missing or invalid token
    FailedPrecondition System not in required state
    ResourceExhausted Rate limit or quota exceeded
    Unavailable Transient issue, safe to retry
    Internal Unexpected bug
    DeadlineExceeded Timeout
    // ✗ Bad — caller gets codes.Unknown, can't decide whether to retry
    return nil, fmt.Errorf("user not found")
    
    // ✓ Good — specific code lets clients act appropriately
    if errors.Is(err, ErrNotFound) {
        return nil, status.Errorf(codes.NotFound, "user %q not found", req.UserId)
    }
    return nil, status.Errorf(codes.Internal, "lookup failed: %v", err)
    

    For field-level validation errors, attach errdetails.BadRequest via status.WithDetails.

    Streaming

    Pattern Use Case
    Server streaming Server sends a sequence (log tailing, result sets)
    Client streaming Client sends a sequence, server responds once (file upload, batch)
    Bidirectional Both send independently (chat, real-time sync)

    Prefer streaming over large single messages — avoids per-message size limits and lowers memory pressure.

    func (s *server) ListUsers(req *pb.ListUsersRequest, stream pb.UserService_ListUsersServer) error {
        for _, u := range users {
            if err := stream.Send(u); err != nil {
                return err
            }
        }
        return nil
    }
    

    Testing

    Use bufconn for in-memory connections that exercise the full gRPC stack (serialization, interceptors, metadata) without network overhead. Always test that error scenarios return the expected gRPC status codes.

    Testing patterns and examples

    Security

    • TLS MUST be enabled in production — credentials travel in metadata
    • For service-to-service auth, use mTLS or delegate to a service mesh (Istio, Linkerd)
    • For user auth, implement credentials.PerRPCCredentials and validate tokens in an auth interceptor
    • Reflection SHOULD be disabled in production to prevent API discovery

    Performance

    Setting Purpose Typical Value
    keepalive.ServerParameters.Time Ping interval for idle connections 30s
    keepalive.ServerParameters.Timeout Ping ack timeout 10s
    grpc.MaxRecvMsgSize Override 4 MB default for large payloads 16 MB
    Connection pooling Multiple conns for high-load streaming 4 connections

    Most services do not need connection pooling — profile before adding complexity.

    Common Mistakes

    Mistake Fix
    Returning raw error Becomes codes.Unknown — client can't decide whether to retry. Use status.Errorf with a specific code
    No deadline on client calls Slow upstream hangs indefinitely. Always context.WithTimeout
    New connection per request Wastes TCP/TLS handshakes. Create once, reuse — HTTP/2 multiplexes RPCs
    Reflection enabled in production Lets attackers enumerate every method. Enable only in dev/staging
    codes.Internal for all errors Wrong codes break client retry logic. Unavailable triggers retry; InvalidArgument does not
    Bare types as RPC arguments Can't add fields to string. Wrapper messages allow backwards-compatible evolution
    Missing health check service Kubernetes can't determine readiness, kills pods during deployments
    Ignoring context cancellation Long operations continue after caller gave up. Check ctx.Err()

    Cross-References

    • → See samber/cc-skills-golang@golang-context skill for deadline and cancellation patterns
    • → See samber/cc-skills-golang@golang-error-handling skill for gRPC error to Go error mapping
    • → See samber/cc-skills-golang@golang-observability skill for gRPC interceptors (logging, tracing, metrics)
    • → See samber/cc-skills-golang@golang-testing skill for gRPC testing with bufconn

    Reproducido de samber/cc-skills-golang bajo licencia MIT. Leer esta página en markdown.

    Archivos

    4 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Requiere protoc (brew install protobuf), protoc-gen-go y protoc-gen-go-grpc instalados.

    Detalles

    Creador
    samber
    Licencia
    MIT
    Recursos incluidos
    referencias
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de samber/cc-skills-golang

    Este repo incluye 46 skills. Si instalas uno, normalmente ya tienes los demás.

    Buenas prácticas de linting y configuración de golangci-lint para proyectos Golang: ejecutar linters, configurar .golangci.yml, suprimir avisos con nolint, interpretar salidas y elegir linters.

    Costo de contexto al activarse
    1.8k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    hace 3 días
    herramientas desarrollo

    Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI.

    Costo de contexto al activarse
    3.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    hace 28 días
    testing qa

    Orquestador de skills de Golang, siempre activo en cualquier tarea de código, revisión, debug o setup: carga las skills más relevantes de samber/cc-skills-golang, a menudo varias a la vez.

    Costo de contexto al activarse
    3.8k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 20 días
    herramientas desarrollo

    Patrones y metodología de optimización de rendimiento en Golang: si hay cuello de botella X, aplica el patrón Y, una vez que profiling o benchmarks ya lo identificaron.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    9 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración.

    Costo de contexto al activarse
    4.4k tok
    Tamaño del paquete
    6 archivos
    Última actualización
    el mes pasado
    testing qa

    Inyección de dependencias en Golang con samber/do: contenedores de servicios, gestión de ciclo de vida, scopes, health checks, apagado ordenado y organización en módulos.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    4 archivos
    Última actualización
    hace 22 días
    herramientas desarrollo

    Skills relacionados

    Implementa APIs GraphQL en Golang con gqlgen o graphql-go: diseño de schemas, resolvers, suscripciones e integración con servicios HTTP en Go.

    Costo de contexto al activarse
    3.3k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    el mes pasado
    desarrollo apis

    Documentación OpenAPI/Swagger en Go con swaggo/swag: anotaciones, `swag init`, integraciones con gin/echo/fiber/chi/net/http, seguridad y etiquetas de struct.

    Costo de contexto al activarse
    2.3k tok
    Tamaño del paquete
    3 archivos
    Última actualización
    el mes pasado
    desarrollo apis

    Implementa inyección de dependencias en Golang con uber-go/dig: contenedor basado en reflexión, Provide/Invoke, dig.In/dig.Out, valores nombrados, value groups, dependencias opcionales, scopes y Decorate.

    Costo de contexto al activarse
    2.7k tok
    Tamaño del paquete
    5 archivos
    Última actualización
    el mes pasado
    desarrollo apis