Introducción: ¿Por qué Go es el lenguaje ideal para microservicios?
\n\nLa arquitectura de microservicios se ha convertido en el estándar de facto para construir aplicaciones modernas y escalables. El lenguaje Go (Golang), creado en las entrañas de Google, es ideal para esta tarea gracias a su simplicidad, rendimiento y soporte integrado para la concurrencia. En este artículo, analizaremos el ciclo completo de creación de un microservicio en Go: desde el diseño de la arquitectura hasta el despliegue en producción.
\n\nGo ofrece compilación rápida, consumo mínimo de memoria y trabajo nativo con gorutinas — hilos ligeros. Esto lo convierte en una excelente opción para sistemas distribuidos de alta carga. Revisaremos conceptos clave, escribiremos ejemplos de código y discutiremos las mejores prácticas.
\n\n1. Diseño de la arquitectura de microservicios en Go
\n\n1.1. Principios de la arquitectura de microservicios
\n\nAntes de escribir código, es necesario definir los límites de los microservicios. Principios fundamentales:
\n\n- \n
- Responsabilidad Única (Single Responsibility) — cada servicio se encarga de una función de negocio. \n
- Independencia de despliegue — cada microservicio puede actualizarse sin detener todo el sistema. \n
- Acoplamiento débil (Loose Coupling) — los servicios se comunican a través de APIs claramente definidas. \n
- Descentralización de la gestión de datos — cada servicio tiene su propia base de datos. \n
1.2. Estructura del proyecto Go para un microservicio
\n\nEstructura de carpetas recomendada para un microservicio en Go:
\n\nmy-service/\n├── cmd/\n│ └── server/\n│ └── main.go # Punto de entrada\n├── internal/\n│ ├── handler/ # Manejadores HTTP/gRPC\n│ ├── service/ # Lógica de negocio\n│ ├── repository/ # Trabajo con BD\n│ └── model/ # Estructuras de datos\n├── pkg/\n│ └── api/ # Archivos proto comunes (gRPC)\n├── config/\n│ └── config.go # Configuración\n├── migrations/ # Migraciones de BD\n├── Dockerfile\n└── go.mod\n\n1.3. Ejemplo de un microservicio simple
\n\nCrearemos un microservicio HTTP básico para la gestión de usuarios. Comencemos definiendo el modelo y el repositorio:
\n\n// internal/model/user.go\npackage model\n\ntype User struct {\n ID int64 `json:"id"`\n Name string `json:"name"`\n Email string `json:"email"`\n}\n\n// internal/repository/user_repo.go\npackage repository\n\nimport (\n "context"\n "my-service/internal/model"\n)\n\ntype UserRepository interface {\n GetByID(ctx context.Context, id int64) (*model.User, error)\n Create(ctx context.Context, user *model.User) (int64, error)\n}\n\ntype inMemoryRepo struct {\n users map[int64]*model.User\n nextID int64\n}\n\nfunc NewInMemoryRepo() UserRepository {\n return &inMemoryRepo{\n users: make(map[int64]*model.User),\n nextID: 1,\n }\n}\n\nfunc (r *inMemoryRepo) GetByID(ctx context.Context, id int64) (*model.User, error) {\n user, ok := r.users[id]\n if !ok {\n return nil, fmt.Errorf("user not found")\n }\n return user, nil\n}\n\nfunc (r *inMemoryRepo) Create(ctx context.Context, user *model.User) (int64, error) {\n user.ID = r.nextID\n r.users[user.ID] = user\n r.nextID++\n return user.ID, nil\n}\n\n2. Comunicación entre microservicios: REST, gRPC y colas
\n\n2.1. API REST en Go
\n\nPara la interacción síncrona, se suele usar REST o gRPC. Veamos un controlador REST utilizando la biblioteca estándar net/http y el enrutador chi:
// internal/handler/user_handler.go\npackage handler\n\nimport (\n "encoding/json"\n "net/http"\n "strconv"\n "my-service/internal/service"\n "github.com/go-chi/chi/v5"\n)\n\ntype UserHandler struct {\n svc *service.UserService\n}\n\nfunc NewUserHandler(svc *service.UserService) *UserHandler {\n