BFF con Go (Parte 4): Métricas, CI/CD y Control de Acceso

Apr 1, 2025 10 min

BFF con Go (Parte 4): Métricas, CI/CD y Control de Acceso 📊🔄🔐

Ya tienes un BFF en Go documentado, seguro y dockerizado. En esta cuarta parte, te mostraré cómo llevarlo al siguiente nivel:

  • 📊 Exponer métricas con Prometheus
  • 🔄 Automatizar despliegues con GitHub Actions
  • 🔐 Validar roles y scopes en JWT para control de acceso

📊 1. Exponer métricas con Prometheus

Instala Prometheus middleware para Go:

go get github.com/prometheus/client_golang/prometheus/promhttp

Agrega el endpoint /metrics en main.go:

import "github.com/prometheus/client_golang/prometheus/promhttp"

r.Handle("/metrics", promhttp.Handler())

Esto permite que Prometheus scrapee métricas de tu app, como:

  • Requests totales
  • Latencias
  • Uso de memoria

Puedes agregar tus propias métricas:

var totalUsers = prometheus.NewCounter(
  prometheus.CounterOpts{
    Name: "total_user_requests",
    Help: "Total de requests a /users",
  },
)

func init() {
  prometheus.MustRegister(totalUsers)
}

🔄 2. CI/CD con GitHub Actions

Crea el archivo .github/workflows/deploy.yml:

name: Build and Deploy BFF

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v4
        with:
          go-version: '1.21'
      - run: go build -o bff ./cmd/main.go

  docker:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/checkout@v3
      - run: docker build -t bff-go .
      - run: echo "Desplegado exitosamente 🎉"

Esto automatiza el build en cada push a main. Puedes extenderlo para publicar en un registro de contenedores o desplegar a GCP/AWS.


🔐 3. Control de acceso con Roles en JWT

Supongamos que tu JWT incluye un role en los claims:

{
  "sub": "user123",
  "role": "admin"
}

Puedes validar así:

claims := token.Claims.(jwt.MapClaims)
role := claims["role"].(string)
if role != "admin" {
  http.Error(w, "No autorizado", http.StatusForbidden)
  return
}

Esto te permite proteger rutas específicas según el tipo de usuario:

r.With(JWTMiddleware, AdminOnly).Get("/admin/dashboard", handler.AdminDashboard)

🚀 ¿Qué sigue?

Tu BFF ya está:

  • 🧪 Testeado
  • 🔁 Concurrencia optimizada
  • 🔐 Seguro con JWT
  • 📄 Documentado con Swagger
  • 📦 Dockerizado
  • 📊 Monitoreado con Prometheus
  • 🔄 Automatizado con CI/CD

💡 Puedes integrarlo ahora con frontend React, Flutter o aplicaciones móviles.


Sígueme en codeIA.cl para más contenido práctico de arquitectura con Go y microservicios. ¿Quieres una Parte 5 enfocada en monitoreo avanzado o feature flags? ¡Te leo!

~devjaime