Introducción a las aplicaciones nativas en la nube
Sugerencia
Este contenido es un extracto del libro electrónico “Architecting Cloud Native .NET Applications for Azure” (Diseño de la arquitectura de aplicaciones .NET nativas en la nube para Azure), disponible en Documentos de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.
Otro día más en la oficina, trabajando en "el próximo gran hito".
Suena el móvil. Le llaman, como casi a diario, con nuevas y emocionantes oportunidades.
Pero esta vez es diferente: empresa emergente, capital y solvencia de sobra.
La sola mención de nube, microservicios y tecnología de vanguardia le provoca mareos.
Unas pocas semanas más tarde ya es un nuevo y flamante empleado que participa en una sesión de diseño para crear una aplicación de comercio electrónico de primer nivel. Competirá con los principales sitios de comercio electrónico existentes.
¿Cómo la creará?
Si sigue las directrices de los últimos 15 años, lo más probable es que cree el sistema que se muestra en la figura 1.1.
Figura 1-1. Diseño monolítico tradicional
Crea una aplicación principal de gran tamaño que contiene toda la lógica de dominio. Incluye módulos como el de identidad, el de catálogo, el de pedidos, etc. Estos módulos se comunican directamente entre sí en un mismo proceso de servidor. También comparten una base de datos relacional grande. El núcleo expone la funcionalidad a través de una interfaz HTML y una aplicación móvil.
¡Enhorabuena! Ya tiene su aplicación monolítica.
Pero no todo es malo. Las aplicaciones monolíticas ofrecen algunas ventajas. Por ejemplo, son fáciles de...
- build
- test
- implementar
- corregir si hay problemas
- escalar verticalmente
Muchas de las aplicaciones de éxito de hoy día se crearon como aplicaciones monolíticas. La aplicación es un éxito y continúa evolucionando, iteración tras iteración, incorporando a ella más funcionalidad.
Pero llega un momento en que empieza una sensación de incomodidad. Está perdiendo el control de la aplicación. Con el tiempo, la sensación se intensifica, y acaba cayendo en un estado conocido como Fear Cycle
:
- La aplicación se ha vuelto tan abrumadoramente complicada que nadie la entiende.
- Teme hacer cambios, ya que cada uno de ellos conlleva efectos secundarios imprevistos y costosos.
- Incorporar nuevas características y correcciones resulta una tarea complicada, lenta y costosa de implementar.
- Cada versión se vuelve lo más pequeña posible y requiere una implementación completa de toda la aplicación.
- Un componente inestable puede bloquear todo el sistema.
- Las nuevas tecnologías y plataformas no son una opción.
- Resulta difícil implementar metodologías de entrega ágiles.
- La erosión arquitectónica se instala a medida que la base de código se deteriora con interminables "correcciones en el momento".
- Al final entran en escena los asesores y le piden que la reescriba.
¿Le resulta familiar?
Muchas organizaciones han abordado este miedo recurrente "monolítico" adoptando un enfoque nativo de nube para crear sistemas. En la figura 1-2 se muestra el mismo sistema, pero creado con técnicas y prácticas nativas de nube.
Figura 1-2. Diseño nativo de nube
Fíjese en cómo se descompone la aplicación en un conjunto de microservicios aislados pequeños. Cada uno es autocontenido y encapsula su código, datos y dependencias propios. Cada uno se implementa en un contenedor de software y lo administra un orquestador de contenedores. En lugar de una base de datos relacional grande, cada servicio posee su propio almacén de datos, de la clase que varía en función de las necesidades de los datos. Observe cómo algunos servicios dependen de una base de datos relacional y otros, de las bases de datos NoSQL. Un servicio almacena su estado en una caché distribuida. Fíjese en que todo el tráfico se enruta a través de un servicio de puerta de enlace de API, que se encarga de enrutar el tráfico a los servicios back-end principales y de aplicar muchos aspectos transversales. Y lo que es más importante, la aplicación aprovecha al máximo las características de escalabilidad, disponibilidad y resistencia que se encuentran en las modernas plataformas en la nube.
Informática nativa de nube
Vaya... acabamos de usar el término nativo de nube. Lo primero que podríamos pensar es: "¿Qué significa eso exactamente? ¿Se trata de la enésima palabra de moda en el sector concebida por los proveedores de software para aumentar sus ventas?"
Por suerte es algo bien distinto, y espero que este libro le ayude a convencerle.
En poco tiempo, el término "nativo de nube" se ha convertido en todo un motor impulsor dentro del sector del software. Es una nueva manera de construir sistemas grandes y complejos. El enfoque aprovecha al máximo las prácticas, las tecnologías y la infraestructura de nube del desarrollo de software de hoy día. El concepto "nativo de nube" cambia la forma de diseñar, implementar operar sistemas.
A diferencia de las constantes expectativas que caracterizan a nuestro sector, lo nativo de nube es real. Piense si no en la Cloud Native Computing Foundation (CNCF), un consorcio de más de 400 grandes corporaciones cuya hoja de ruta es hacer que la informática nativa de nube esté omnipresente en todas las pilas tecnológicas y de nube. En tanto que uno de los grupos de código abierto más influyentes, alberga muchos de los proyectos de código abierto de crecimiento más rápido en GitHub. Estos proyectos incluyen, entre otros, Kubernetes, Prometheus, Helm, Envoy y gRPC.
El CNCF fomenta un ecosistema de código abierto e independiente del proveedor. Al calor de esta iniciativa, los principios, patrones y procedimientos recomendados nativos de nube incluidos en este libro son independientes de la tecnología. Al mismo tiempo, se describen los servicios y la infraestructura disponibles en la nube de Microsoft Azure para crear sistemas nativos de nube.
Entonces, ¿qué es exactamente "nativo de nube"? Siéntese, relájese y déjenos ayudarle a explorar este nuevo mundo.