Diseñar aplicaciones en la nube flexibles, mantenibles y fácilmente escalables. Este es sin duda uno de los grandes objetivos de todas aquellas empresas y profesionales que se dedican al desarrollo de software modernos.
Conseguir esto en la actualidad es algo relativamente sencillo gracias a patrones de diseño conocidos como la arquitectura hexagonal, la cual combinada con tecnologías de contenedores cloud como Kubernetes y arquitectura de microservicios, ofrecen resultados excelentes sin necesidad de invertir grandes cantidades de recursos.
En colaboración con EY, consultoría líder en transformación tecnológica a nivel mundial, en este artículo te explicaremos cómo puedes implementar estos conceptos en tus proyectos. Analizaremos la arquitectura hexagonal y otros patrones de diseño similares, o cómo Kubernetes facilita la escalabilidad y la disponibilidad de las aplicaciones en la nube.
¿Qué es la arquitectura hexagonal?
La arquitectura hexagonal es un patrón de diseño moderno de software que apuesta por separar la lógica de negocio de los componentes externos, lo que se traduce en una mayor flexibilidad y capacidad de adaptación.
También conocida como puertos y adaptadores, esta arquitectura permite a los desarrolladores centrarse en la lógica de negocio, dejando la interacción con el mundo exterior (bases de datos, sistemas de archivos, etc.) a los adaptadores. Este patrón de desarrollo fue inventado por Alistair Cockburn en 2005, conocido también por formar parte del equipo original que dio vida al popular Manifiesto Agile y, en consecuencia, las metodologías de desarrollo de software.
Inspirado en otros patrones de diseño como la Inversión de Control (IoC), la Inyección de Dependencias (DI) y el patrón de Capas (Layers), Cockburn trataba de resolver problemas tradicionales que afectaban comúnmente a los programadores, como por ejemplo la estratificación, el acoplamiento o el entrelazamiento.
¿Cómo funciona la arquitectura hexagonal?
La arquitectura hexagonal, desde su inicio, ha marcado un antes y un después en el mundo del desarrollo de software. Se le reconoce por ser efectiva en la construcción de sistemas escalables, adaptables y fáciles de mantener. Su principal objetivo es separar las responsabilidade, proporcionando interfaces estandarizadas para interactuar con ellos
Imagina la arquitectura hexagonal como un hexágono. En su centro situamos la lógica de negocio, el corazón de la aplicación.
Cada lado del hexágono es un puerto, ya sea de entrada o salida, que puede interactuar con la lógica de negocio mediante algo llamado adaptadores. Estos podrían ser una API, una interfaz de usuario, una base de datos, etc.
Los adaptadores trabajan como traductores entre la lógica de negocio y el mundo exterior, facilitando una clara separación entre estos dos o futuros cambios y adaptaciones.
- Los puertos de entrada proporcionan información o datos a la lógica de negocio. Estos pueden ser interfaces de usuario, como APIs o GUIs, que permiten al usuario interactuar con la lógica de negocio.
- Por otro lado, los puertos de salida son los que recogen información de la lógica de negocio y la envían a otras partes del sistema. Estos pueden ser bases de datos, servicios web, etc.
La verdadera potencia de la arquitectura hexagonal radica en que cualquier cambio en los puertos no afecta a la lógica de negocio central. Esto permite una mayor flexibilidad y escalabilidad, ya que los cambios en la tecnología o en las interfaces de usuario no tienen por qué afectar al núcleo de la aplicación. Además, facilita la prueba, el desarrollo y la evolución de los componentes de la aplicación de forma independiente.
Variaciones de arquitectura hexagonal: Onion y Clean
Con el paso de los años, e inspiradas en la arquitectura hexagonal, han surgido variaciones como la Arquitectura de Cebolla (Onion) y la Arquitectura Limpia (Clean). Ambas enfocan la separación de responsabilidades y la inversión de dependencias, aunque difieren ligeramente en su implementación. La mayoría de estas arquitecturas se inspiran en el diseño basado en dominios (DDD) de Eric Evans.
La arquitectura de Cebolla o Onion Architecture, ideada por Jeffrey Palermo, se organiza en capas concéntricas que representan diferentes niveles de abstracción. El software se diseña de tal forma que recuerda a las capas de una cebolla, donde el núcleo, que es donde se encuentra la lógica de negocio, está rodeada por capas de infraestructura y servicios de aplicación. La dependencia es siempre hacia el interior, por lo que las capas exteriores pueden ser modificadas o reemplazadas sin afectar a las interiores.
La Arquitectura Limpia o Clean Architecture, propuesta por Robert C. Martin, se centra en la separación de intereses y la inversión de dependencias. Es similar a la arquitectura de cebolla, pero con una estructura más definida y simplificada, garantizando que la lógica de negocio permanezca intacta y sin contaminar por cambios en elementos externos.
Ventajas de la arquitectura hexagonal y sus variables
- Flexibilidad: la arquitectura hexagonal nos da la libertad de intercambiar entre distintas tecnologías, frameworks o bases de datos sin perjudicar la lógica de negocio.
- Mantenibilidad: con una clara división de responsabilidades, el sistema se vuelve más comprensible, manejable y escalable.
- Pruebas simplificadas: separando la lógica de negocio de los detalles técnicos, facilita la automatización de pruebas unitarias y de integración.
- Ciclo de desarrollo: al facilitar la realización de pruebas y la incorporación de nuevas funcionalidades, se acelera el ciclo de desarrollo y favorece la entrega continua (CI/CD).
- Escalabilidad: permite que los componentes de la aplicación se desarrollen y evolucionen de forma independiente, lo que facilita su escalabilidad.
- Colaboración mejorada: con componentes bien definidos, los equipos pueden trabajar más eficazmente en distintas partes del sistema.
- Independencia: los componentes pueden ser alterados o reemplazados sin afectar a otros elementos del sistema, facilitando la incorporación de nuevas funcionalidades o la corrección de errores.
- Robustez: gracias a su diseño modular, la arquitectura hexagonal es más resistente a fallos, ya que un problema en un componente no suele afectar a todo el sistema.
Patrones de diseño basado en dominios, aplicaciones cloud native y Kubernetes
Las innovadoras ideas que implantaron este tipo de arquitecturas de software impulsaron su popularidad e importancia en la industria gracias a las facilidades ofrecidas por la nube y la computación en contenedores.
Kubernetes, como plataforma líder en la orquestación de contenedores, se ha convertido en un fuerte aliado para implementar estas arquitecturas en aplicaciones nativas de la nube. Esto permite a los desarrolladores centrarse en la lógica de negocio, en lugar de invertir tiempo en la gestión de la infraestructura subyacente.
Es relativamente sencillo crear aplicaciones nativas y modulares que se estructuran en torno a servicios de microservicios independientes y desacoplados, cada uno de ellos representando un dominio de negocio específico. Se comunican con el núcleo de la aplicación a través de APIs y pueden escalar de forma independiente según las demandas de carga de trabajo. Estos microservicios pueden ser fácilmente integrados con plataformas de CI/CD, permitiendo una entrega continua y un desarrollo ágil.
Proveedores de la nube pública como Amazon Web Services (AWS), Google Cloud Platform (GCP) y Microsoft Azure, permiten trabajar fácilmente con Kubernetes, ofreciendo servicios administrados que facilitan aún más la implementación de aplicaciones nativas en la nube basadas en una arquitectura hexagonal.
Por ejemplo, podemos utilizar AWS Elastic Kubernetes Service (EKS) para orquestar nuestros contenedores, AWS RDS para administrar nuestras bases de datos y AWS Lambda para ejecutar código sin tener que administrar servidores. Esto nos permite concentrarnos en desarrollar y mejorar nuestra lógica de negocio, mientras que la infraestructura es administrada por AWS
Así, gracias a las facilidades que ofrece, la contenerización de aplicaciones basada en microservicios se ha convertido en el estándar en el sector, lo que ha llevado a una rápida adopción de Kubernetes y las arquitecturas basadas en dominios. Esta tendencia continúa creciendo a medida que más organizaciones se dan cuenta de los beneficios que ofrece la arquitectura hexagonal en combinación con Kubernetes para la creación de aplicaciones en la nube.