¿Qué es el desarrollo de software Cloud Native?
El Desarrollo Cloud Native (en español, nativo en la nube) es un conjunto de metodologías de desarrollo del software que aprovecha al máximo las ventajas del modelo computacional de la nube para crear y ejecutar aplicaciones, administrando la complejidad de la arquitectura requerida y permitiendo una mayor velocidad de entrega de funcionalidades y actualizaciones.
El enfoque de Cloud Native se centra en dividir un problema grande en problemas más pequeños y automatizar cada proceso de las operaciones necesarias reduciendo el tiempo de inactividad, haciendo un sistema más productivo y eficiente, a la vez que nos brinda un mayor control sobre la implementación en los diferentes entornos de nuestra aplicación. También nos facilita herramientas que nos informan de la salud de nuestro aplicativo agilizando la depuración en caso de errores, pudiendo así solucionar problemas de forma rápida y eficaz, como también auditar el rendimiento de nuestro software con los diferentes servicios en la nube.
También hay que tener en cuenta que los diferentes proveedores de servicios de la nube tienen como máxima prioridad la seguridad de la aplicación y sus datos, así como que estas estén accesibles con la menor latencia, de modo que proporcionan diferentes herramientas con las que el desarrollador pueda garantizar la seguridad de su aplicación, así como también el poder desplegarla en cualquier país o región de manera muy sencilla.
La encuesta anual 2022 que realiza la comunidad de Stack Overflow sobre el porcentaje de desarrolladores profesionales que utilizan los diferentes proveedores de plataformas en la nube nos muestra cuál es su tendencia de uso en la siguiente imagen:
Ilustración 1: Survey 2022 Stack Overflow – Cloud platforms
[https://survey.stackoverflow.co/2022/#most-popular-technologies-platform-prof]
¿Por qué confiamos en Python para el desarrollo nativo en la nube?
Python es unos de los lenguajes de programación más populares a la fecha y desde su creación mantiene una filosofía que hace énfasis en una sintaxis legible, limpia y fácil de aprender. A diferencia de otros lenguajes de programación que se enfocan más en paréntesis, corchetes, dos puntos y comas, Python usa saltos de líneas y se agrupa una dentro de otra con tabulaciones (4 espacios), donde los desarrolladores se pueden centrar más en dedicar tiempo a la programación y menos tiempo a depurar sintaxis.
Su modo interactivo nos ayuda a depurar el código directamente desde la Shell y probar cada fragmento del código de una manera rápida y fluida.
Cuenta con una variedad de librerías que se pueden ampliar fácilmente en base a lo que requiera tu aplicación, que se encuentran soportadas por una gran comunidad activa que colabora día a día en la creación de estas librerías.
Es escalable, por lo que proporciona una mejor estructura para mantener programas grandes de una manera más sistemática.
Python es un lenguaje muy versátil ya que se puede usar en diferentes ámbitos como es el desarrollo web, Big Data, Machine Learning, scripting, desarrollo de aplicaciones de escritorio o videojuegos, entre otros. También hay que resaltar que es un lenguaje open source y multiplataforma (Linux, Windows y Mac).
El indicador de popularidad de los lenguajes de programación de la comunidad de programadores de TIOBE, coloca en primer lugar a Python en el mes de julio de 2022. Este índice se mantiene actualizado de manera mensual y muestra el número de ingenieros de software capacitados para llevar a cabo desarrollos de manera global, cursos y proveedores disponibles.
Ilustración 3 TIOBE Index for July 2022
[https://www.tiobe.com/tiobe-index/]
Si se compara la tendencia de búsquedas en España usando el buscador de Google sobre los lenguajes de programación Python, Java y .Net podremos observar en el siguiente gráfico:
Ilustración 4 Google trends – Python, Java, .Net
[https://trends.google.es/trends/explore?date=2022-01-01%202022-12-31&geo=ES&q=python,java,.net]
Todo ello permite establecer que tanto el lenguaje como la comunidad de profesionales que lo soportan sustentan la decisión de utilizarlo para un desarrollo Cloud Native.
Volviendo al Cloud Native: ejemplo de servicios y arquitectura
Una guía con la que podemos ajustar nuestras aplicaciones nativas en la nube con Python sería la metodología “The twelve-factor App” o 12-factor (https://12factor.net/es/), que es un manifiesto que los desarrolladores deben seguir para la creación de aplicaciones web modernas o aplicaciones basadas en servicios (SaaS, por sus siglas en inglés).
Se centra en el desarrollo, despliegue, velocidad, coste, seguridad y escalabilidad que supone la creación de una nueva aplicación, destacando la configuración declarativa en ella.
Una manera de explicar “12-factor” sin tener que abordar cada uno de sus puntos, es imaginar un puzzle que está dividido en diferentes piezas (que serían cada uno de nuestros servicios) que son independientes entre sí y que al conectarse (en nuestro caso sería la comunicación entre cada servicio) conforman nuestra aplicación.
Cada entorno que sea definido para un proyecto, como pueden ser los entornos de desarrollo, QA y producción, deben ser idénticos, esto asegura que obtengamos resultados similares en cada uno de ellos, lo que nos permitirá la entrega continua desde el desarrollo hasta la producción.
Lograr crear una arquitectura con lo mencionado anteriormente sin usar los servicios cloud es muy complicado y aumentaría tanto el porcentaje de errores como el tiempo de su implementación. Sin mencionar la monitorización en tiempo real de los registros de log y del rendimiento, ya sea a nivel de plataforma o de aplicación, lo que volvería nuestro ecosistema muy complejo, y que sin embargo es muy sencillo de aplicar al usar Cloud Native.
La arquitectura Cloud Native con Python se puede construir de diferentes maneras dependiendo de los requerimientos del proyecto y del objetivo que quiere alcanzar el negocio.
Una de las alternativas para el diseño de la arquitectura es la creación de microservicios donde una aplicación está dividida en pequeños servicios independientes, pero que se comunican entre sí, ya sea mediante API REST, eventos o gRPC (una implementación Open Source de llamadas a procedimiento remoto RPC diseñada originalmente por Google). En un caso típico, las herramientas o servicios Cloud que se pueden utilizar en los principales proveedores serían:
- Amazon Web Service: EC2 Container Registry (ECR), EC2 Container Service (ECS), Elastic Container Service para Kubernetes (EKS)
- Microsoft Azure: Azure Container Registry, Azure Kubernetes Service (AKS)
- Google Cloud: Container Registry, Container Registry
Aunque también se podría utilizar un enfoque serverless (sin servidor) para lo que se contaría con servicios como Cloud Foundry, Heroku, Amazon Beanstalk, Amazon Lambda, Azure Functions,…
Es importante destacar que no son todos los servicios en la nube que se requieren, tanto para una arquitectura basada en microservicios como para una serverless, ya que una aplicación también requiere de base de datos, espacio de almacenamiento, gestión de colas, manejo de caché, entre muchos otros, donde cada proveedor de Cloud ofrece diferentes alternativas.
Para entender un poco más sobre Cloud Native, vamos a crear una pequeña arquitectura de microservicios serverless, para una aplicación de tienda online de venta de libros (que es un ejemplo de aplicación con la que casi todo el mundo está familiarizado). La arquitectura, al tratarse de un ejemplo, sólo contará con carrito de compras, catálogo de libros y un servicio de recomendaciones, aunque una tienda online está conformada por muchos más servicios.
Nos aseguraremos de que nuestra arquitectura sea sólida y fácil de implementar para los desarrolladores.
Pero antes vamos a establecer el siguiente escenario a tener en cuenta: contamos con un equipo de 10 desarrolladores y cada uno de ellos está incorporando una nueva funcionalidad al proyecto, como lo es administrar el carrito de compras, agregar nuevos campos al modelo de libros, agregar una vista de recomendaciones.
Y sobre ese escenario deberíamos tener en cuenta las siguientes preguntas de cara a seleccionar la mejor solución:
- ¿Queremos que todo este código esté en una sola aplicación (monolítica)?
- ¿Se podrá mantener el código y los esquemas de la base de datos de manera sencilla al tratar de incorporar nuevas funcionalidades?
- ¿Cuál sería el coste que implica mantener una infraestructura estable que soporte nuestras aplicaciones? ¿Cómo serían los servidores, base de datos, comunicaciones, la gestión de almacenamiento, actualizaciones, seguridad y monitorización para todos los entornos necesarios?
- ¿Cómo de sencillo será conservar el talento humano que permita mantener el stack tecnológico requerido a lo largo del ciclo de vida de nuestra aplicación?
Para garantizar la mejor respuesta a estas preguntas se planteará una arquitectura de ejemplo basada en microservicios enfocada a serverless y apoyada en la Cloud, siendo estos los servicios que podrían usarse si empleásemos una arquitectura definida sobre el proveedor de servicios AWS:
Ilustración 5 – Arquitectura de ejemplo sobre AWS
Como podemos observar, se dispone de:
- Un API Gateway que permitirá ayudará a crear, publicar y mantener la API REST de la tienda online.
- El servicio de Amazon Cognito, que incorpora el registro, inicio de sesión y el control de accesos de usuarios de nuestra aplicación, delegando la seguridad de los datos sensibles a nuestro proveedor de servicio Cloud.
- Con CloudFormation se crea modelo dónde se describen los recursos y dependencias necesarios en cada uno de nuestros microservicios y que permitirán su desplegarlo de manera sencilla, automatizaba y fiable.
- En AWS Lambda se ejecutará cada función de nuestro código y se aplicará la lógica de negocio necesaria sin requerir de un servidor.
- Como base de datos se utiliza Amazon DynamoDB, que es una base de datos NoSql sin servidor y completamente administrada por el proveedor de servicios Cloud, donde almacenaremos los datos de cada microservicio.
- Amazon Neptune, es un servicio de base de datos de grafos rápido y fiable, con el que modelar las recomendaciones de los distintos libros.
- Y por último, pero no menos importante, contamos con Amazon CloudWatch como servicio de monitorización y observabilidad de todo lo que ocurra con nuestro servicios.
Con esta arquitectura podríamos contar con una tienda online, dónde solo sería necesario preocuparse en desarrollar nuevas funcionalidades y mantener la calidad de nuestro software, minimizando los costes de operación de la infraestructura y todo lo que ello implica.
Si bien es un ejemplo simplificado de lo que puede llegar a ser una aplicación de negocio, tampoco se han detallado los numerosos tipos de servicios que los proveedores de Cloud disponen para llevar a cabo de manera nativa en la Cloud cualquier tipo de arquitectura que de soporte a las variadas necesidades de negocio existentes.
Desde SATEC, llevamos años diseñando, gestionando, migrando y desplegando arquitecturas complejas para nuestros clientes, así como también contribuyendo al soporte, operación, mantenimiento y evaluación de estas, tanto en entornos Cloud puros, como híbridos.
Todo ello, nos hace un aliado ideal para la transformación digital de todos los procesos de negocios de cualquier empresa hacia la Cloud nativa, pudiendo personalizar una infraestructura en función del requisito de cada proyecto y el desarrollo de los diferentes servicios de manera rápida, efectiva y garantizar la alta calidad de las aplicaciones, que sean fiables y eficientes, con entregas continuas dentro del marco de las metodologías ágiles.
Si quieres más información sobre Satec no dudes ponerte en contacto aquí 👈