Follow Stelut on X (Twitter) Go to Stelut's GitHub repo Connect on LinkedIn Suscribirse al RSS

Springram


Springram: demo social con Spring Boot

Demostración de Stelut Grigore Tomoiaga.

Springram es una mini red social orientada a demostrar arquitectura backend realista con Spring Boot: API REST, seguridad JWT, persistencia con PostgreSQL y una capa Redis + Kafka para absorber carga social sin romper el contrato de la API.

Demo: https://springram.steluttomoiaga.com
Repo: https://github.com/StemiTomy/springram

Qué problema resuelve

La app simula un escenario típico de producto social donde likes, views y comments pueden crecer rápido y castigar la base de datos principal. El objetivo no es solo exponer endpoints, sino diseñar un flujo que responda rápido y mantenga consistencia razonable.

Arquitectura técnica

  • Backend principal en Spring Boot con enfoque stateless para poder escalar por réplicas.
  • Base de datos remota (PostgreSQL gestionado) como fuente de verdad final.
  • Redis para contadores y acceso de baja latencia.
  • Kafka para desacoplar escritura social y persistencia definitiva.
  • Frontend separado en Preact para consumir la API y validar el flujo end-to-end.

La base de datos se mantiene externa para no mezclar responsabilidades con los servicios efímeros de ejecución local.

API (v1)

La API está agrupada por dominios:

  • Auth: registro, login, refresh, perfil actual y preferencias de idioma.
  • Posts: creación, feed paginado, likes idempotentes, views y comentarios.
  • Search: sugerencias y resultados paginados por posts o users.
  • Analytics público: resumen agregado con palabras top, posts top, heatmap horario y evolución temporal.

Documentación interactiva de endpoints: http://localhost:8080/swagger-ui/index.html.

Seguridad y trazabilidad

  • Autenticación por JWT para endpoints privados.
  • Endpoints de perfil y preferencias protegidos por token Bearer.
  • Auditoría de GET /api/v1/auth/me por middleware con method, path, status, ip, user y durationMs.
  • Esta traza permite inspeccionar accesos anónimos/autenticados y tiempos reales de respuesta en logs.

Redis + Kafka para aliviar cuello de botella

Flujo de interacción social:

  1. La API recibe acción (like, view, comment).
  2. Actualiza contador en Redis para respuesta rápida.
  3. Publica evento en Kafka.
  4. Consumidor persiste en PostgreSQL con estrategia idempotente (INSERT ... ON CONFLICT).

Comportamiento de fallback:

  • Si Kafka no está disponible, se escribe directo en PostgreSQL.
  • Si Redis no está disponible, se calculan/leen contadores desde PostgreSQL.

Con async activo, el sistema es eventually consistent para el estado persistido, pero mantiene buena latencia percibida en la capa de lectura.

Métricas y salud operativa

Se usa observabilidad nativa de Spring:

  • Actuator para health, readiness y estado operativo.
  • Micrometer para métricas técnicas y de negocio.
  • Métricas sociales específicas para cache Redis, publicación/consumo Kafka y fallback a base de datos.

En entornos reales, los endpoints de Actuator deben estar protegidos y no expuestos públicamente.

Migraciones y modelo de datos

El proyecto usa Flyway como sistema de versionado de esquema:

  • Migraciones SQL versionadas en src/main/resources/db/migration.
  • Aplicación automática de cambios pendientes al iniciar la app.
  • Flujo recomendado: modelar entidades, generar DDL de apoyo, curar SQL y consolidarlo en una nueva versión Vx__...sql.

Decisión de diseño:

  • Flyway por simplicidad y control explícito en SQL.
  • Liquibase se valora para escenarios con mayor necesidad de despliegues condicionados y precondiciones complejas.

Testing strategy

Estrategia por capas para feedback rápido:

  • @WebMvcTest para controladores, seguridad y contratos HTTP.
  • @DataJpaTest para repositorios y reglas de persistencia.
  • @SpringBootTest con MockMvc para integración completa cuando se necesita.

Se validan casos críticos de autenticación (401 sin token), validación de entrada y restricciones únicas en persistencia.

Escalado sin Kubernetes

El enfoque de despliegue prioriza simplicidad:

  • App stateless replicable horizontalmente en Docker Compose.
  • Reinicio automático y operación en host único.
  • Base de datos externa y stateful mantenida como servicio gestionado.

Para crecimiento sostenido, el camino natural es mover balanceo y autoscaling a un orquestador dedicado, manteniendo el mismo contrato API.

Frontend (Preact)

El frontend Springram by Stelut Tomoiaga cubre el flujo principal de producto:

  • Landing informativa del proyecto.
  • Auth (registro/login).
  • Vista de app con perfil, feed y acciones sociales.
  • Configuración por variable de entorno para apuntar a distintos dominios de API.

Stack principal

  • Spring Web
  • Spring Security
  • Spring Data JPA
  • Spring Data Redis
  • Spring Kafka
  • PostgreSQL Driver
  • Flyway
  • Micrometer
  • Spring Boot Actuator
  • Lombok
  • Docker Compose Support

Referencias técnicas