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
postsousers. - 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/mepor middleware conmethod,path,status,ip,userydurationMs. - 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:
- La API recibe acción (
like,view,comment). - Actualiza contador en Redis para respuesta rápida.
- Publica evento en Kafka.
- 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,readinessy 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:
@WebMvcTestpara controladores, seguridad y contratos HTTP.@DataJpaTestpara repositorios y reglas de persistencia.@SpringBootTestcon 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
- SSL en Spring Boot: https://docs.spring.io/spring-boot/reference/features/ssl.html
- Scope de beans: https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html#beans-factory-scopes-singleton
- Lazy initialization: https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-lazy-init.html
- Testing: https://docs.spring.io/spring-boot/reference/testing/test-modules.html
- Logging: https://docs.spring.io/spring-boot/reference/features/logging.html#page-title