01 - Arquitecturas de software

Una aplicación puede clasificarse según distintos criterios. Por ejemplo, puede desplegarse como monolito modular y organizarse internamente por capas con inversión de dependencias.

La arquitectura limpia protege las reglas del negocio de los detalles técnicos y externos:

Principio Idea clave
Independencia de frameworks El framework es una herramienta, no el centro de la aplicación
Testeable Las reglas se prueban sin levantar interfaz, base de datos ni framework
Independencia de la interfaz La misma lógica puede exponerse mediante interfaces distintas
Independencia de la base de datos Se puede cambiar la persistencia sin reescribir las reglas
Independencia de agentes externos El negocio no depende de servicios externos concretos
Regla de dependencia El código depende hacia las políticas de negocio, no hacia los detalles
Inversión de dependencias (DIP) El núcleo define las abstracciones que necesita; los detalles externos las implementan

controllerdomainpersistenceControllerServiceServiceImplModelRepositoryRepositoryImplBase de datosinvocaaplica reglasutilizaaccede

La arquitectura limpia es un concepto general: protege las reglas de negocio y dirige las dependencias hacia el núcleo. La arquitectura hexagonal, la arquitectura de cebolla y la arquitectura por capas con inversión de dependencias son enfoques distintos que aplican estas ideas.

La arquitectura por capas agrupa componentes por responsabilidad. En esta arquitectura de referencia:

Capa Componentes y responsabilidad
controller Controladores y DTO de entrada y salida; comunica la aplicación con clientes externos
domain Interfaces e implementaciones de servicios, modelos e interfaces de repositorio; contiene las reglas del negocio
persistence Implementaciones de repositorio y DAO; accede a la base de datos

controllerdomainpersistenceControllerServiceServiceImplModelRepositoryRepositoryImplDAODAOImplBase de datosinvocaaplica reglasutilizautilizaaccede

Service y Repository son interfaces; ServiceImpl y RepositoryImpl las implementan. DAO también se separa en interfaz e implementación, ambas dentro de persistence.

domain define la interfaz Repository que necesita; persistence la implementa. Esta inversión de dependencias evita que el dominio dependa de la tecnología de persistencia y aplica un principio de arquitectura limpia.
Las capas son una división lógica, no una estructura rígida. Se pueden añadir, dividir o reorganizar según las necesidades de la aplicación.

La arquitectura hexagonal separa el núcleo de los sistemas externos mediante puertos (interfaces que definen cómo se usa o qué necesita el núcleo) y adaptadores (componentes que conectan esas interfaces con tecnologías concretas).

Adaptadores de entradaNúcleo de la aplicaciónAdaptador de persistenciaAdaptador de servicio externoRestControllerInputPortBusinessServiceModelRepositoryPortNotificationPortRepositoryAdapterEmailAdapterBase de datosServicio de correoinvocaaplica reglasutilizaimplementautilizaimplementa

La arquitectura de cebolla organiza el sistema en anillos alrededor del dominio. Las dependencias apuntan desde los anillos externos hacia el núcleo.

Infraestructura (anillo exterior)Aplicación (anillo intermedio)Dominio (núcleo)RepositoryImplServiceRepositoryModelusaaplica reglasimplementa

Enfoque Idea principal Observación
Capas Agrupa por responsabilidad y delega entre capas Evitar que el dominio dependa directamente de tecnologías
Hexagonal Aísla el núcleo mediante puertos y adaptadores Facilita sustituir tecnologías y probar el núcleo
Cebolla Organiza el sistema en anillos alrededor del dominio Las dependencias apuntan hacia el centro

La arquitectura de despliegue describe cómo se empaqueta, ejecuta y despliega una aplicación; es un criterio distinto de su organización interna.

Estilo Despliegue Límites y datos Coste o ventaja
Monolito Una aplicación desplegable Los componentes pueden compartir proceso y almacenamiento Operación sencilla; puede crecer con alto acoplamiento
Monolito modular Una aplicación desplegable Módulos con límites y APIs internas explícitas Modularidad sin multiplicar despliegues
Microservicios Varios servicios desplegables Cada servicio controla sus datos y se comunica por red Despliegue independiente; más complejidad operativa

Un monolito no implica código desordenado y puede ser adecuado para una aplicación pequeña, como un CRUD. En un monolito modular, los módulos colaboran dentro del mismo proceso mediante sus APIs públicas.

Monolito: un despliegueMonolito modular: un despliegueAplicaciónMicroservicios: varios desplieguesAplicación(módulos juntos)Base de datosBase de datos compartida(datos propiedad de cada módulo)Módulo A(API pública)Módulo B(API pública)Servicio AServicio BServicio CBD ABD BBD Csolo sus datossolo sus datosAPI internaHTTP / mensaje

No hay que confundir cómo se organiza el código (por capas, hexagonal o cebolla) con cómo se despliega (monolito, monolito modular o microservicios). Un monolito puede aplicar principios de arquitectura limpia.
Los microservicios no son simplemente módulos separados en carpetas o proyectos: cada servicio debe poder desplegarse y evolucionar de forma autónoma, y la comunicación pasa por la red.
Tipo Funcionamiento Característica
Síncrona El emisor hace una llamada y espera una respuesta Depende de la disponibilidad y el tiempo de respuesta del receptor
Asíncrona El emisor publica un mensaje o evento para que se procese después Desacopla temporalmente; puede haber retrasos o entregas duplicadas

Los módulos de una aplicación pueden comunicarse mediante llamadas a APIs internas o eventos. Los microservicios se comunican por red, mediante HTTP o un intermediario de mensajes como RabbitMQ o Kafka.

Los eventos entre módulos no implican comunicación de red ni crean por sí solos aislamiento o una transacción independiente. La comunicación distribuida debe contemplar fallos de red.

ClienteServicio AServicio BBroker de mensajesConsumidorClienteServicio AServicio BBroker de mensajesConsumidorClienteServicio AServicio BBroker de mensajesConsumidorComunicación síncrona entre módulos (mismo proceso)API pública (llamada directa)resultadoComunicación síncrona entre microservicios (HTTP)solicitudpetición HTTPrespuestaresultadoComunicación asíncrona mediante eventospublicar eventoentregar eventoconfirmar procesamiento

La mensajería desacopla al emisor del momento en que se procesa el evento, pero no garantiza que cada mensaje se procese exactamente una vez. Los consumidores deben tolerar entregas duplicadas.
Durante el curso se estudiarán las capas y sus componentes en temas separados. Como referencia, se seguirá una arquitectura por capas desplegada como monolito modular.
  • clase/daw/dws/1eval/arquitecturas.txt
  • Última modificación: 2026/10/03 10:20
  • por cesguiro