Arquitectura de software: microservicios, contenedores y orquestación

Cuando tenemos un proyecto de envergadura entre manos, es posible que podamos vernos sobrepasados en algún momento por la inmensa cantidad de tareas a llevar a cabo hasta alcanzar la meta. Aún no hemos comenzado a escalar la montaña, pero tan sólo pensamos en la cima, en vez de visualizar el primer avituallamiento en el que recargar energías… En estos casos, suele ser recomendable dividir el proyecto en pequeñas tareas para ir superando etapas que nos permitan avanzar y llegar a las siguientes. De lo contrario, podemos caer en el riesgo de que las tareas se nos amontonen y ahogarnos así en un mar de confusión que nos haga abandonar, o que no nos permita obtener los resultados deseados.

Pues, en muchos casos y cada vez más, con las tecnologías de la información y la comunicación sucede algo parecido. Cuando los departamentos TI desarrollan aplicaciones, herramientas digitales o cualquier otro desarrollo software, pueden lograr esta “división por partes” gracias a la arquitectura de microservicios. Pero, ¿qué son y qué papel juegan en los desarrollos software? ¿De qué forma se relacionan con los contenedores y la orquestación? ¿Son aptas para cualquier equipo TI? Lo vemos en el siguiente artículo del blog tecnológico de Bilib.

¿Qué son los microservicios o la arquitectura de microservicios?

Siguiendo la filosofía de “divide y vencerás”, muchos desarrollos software serán más sencillos de implementar si los descomponemos y dividimos en diferentes partes que, finalmente, formen un todo compacto y robusto. Empleando un enfoque de arquitectura de microservicios para el desarrollo de aplicaciones software, trabajamos en el desarrollo de pequeños componentes modulares que actúan de forma independiente y se actualizan por separado, pero que a su vez forman parte de un todo, se comunican entre sí y forman un engranaje de procesos y servicios integrados.

A partir del enfoque de microservicios, los equipos TI pueden desarrollar aplicaciones software en base a una serie de pequeños servicios que se ejecutan de forma autónoma, pero que se comunican constantemente mediante peticiones HTTP hacia las API´s.

De esta forma, los microservicios dan un paso más allá respecto a las aplicaciones monolíticas (arquitectura monolítica) que se desarrollan en bloque y sin divisiones, en base a una unidad de implementación única que lo hacía todo, dando como resultado desarrollos más complejos y difíciles de mantener, especialmente si intervenía un número elevado de programadores al código único.

Por este motivo, la arquitectura monolítica puede ser adecuada para desarrollos que impliquen a un pequeño grupo de profesionales, pero presentan problemas cuando los equipos se amplían. En estas situaciones, se hace complicado realizar cambios ya que el código es más extenso y son muchas las personas que intervienen. Con la arquitectura de microservicios, cada servicio o proceso mantiene su propio código (no forma parte de una “gran cadena” de código único) por lo que el equipo encargado del servicio puede modificarlo y mantenerlo de forma más práctica y ágil.

Las principales ventajas que ofrece la arquitectura de microservicios respecto a la arquitectura monolítica son las siguientes:

  • Facilita pruebas y mantenimiento de la aplicación software desarrollada.
  • Son aplicaciones más sencillas de comprender.
  • Mejoran los procesos de producción: mayor agilidad y reducción de tiempos.
  • Incluyen componentes escalables.
  • Incrementan las posibilidades de automatización.
  • Los microservicios son especialmente útiles para grandes equipos de trabajo distribuidos entre diferentes sedes o que trabajen en remoto.
  • Mejoran los ciclos de entrega.
  • Se desarrollan ciclos de lanzamiento independiente para cada equipo (Cultura DevOps). Si quieres saber más sobre cultura DevOps, puedes leer el siguiente artículo: “¿Qué es DevOps y cómo influye en la transformación digital de las empresas?”.

Sin embargo, también encontramos algunos inconvenientes:

  • Dificultad de comprensión del sistema en su conjunto.
  • Posibilidad de fallas en cascada y dificultad para rastrear el error.
  • Los pequeños desarrollos pueden funcionar mejor con arquitectura monolítica.

Aunque suene a disrupción, la arquitectura de microservicios no es un concepto nuevo en el ámbito TI. De hecho, la arquitectura orientada a servicios (SOA) también trabaja en base al paradigma de programación de dividir el desarrollo de aplicaciones software en partes más pequeñas, independientes, pero que se comunican entre sí. Sin  embargo, lo que sí podemos decir es que este tipo de arquitecturas se están extendiendo debido a la creciente necesidad de las empresas de crear aplicaciones que ofrezcan experiencias digitales mejoradas al usuario, basadas en la integración de funcionalidades. Si quieres ampliar más información sobre “SOA vs. Microservices, aplicaciones y diferencias” puedes consultar el siguiente artículo del blog tecnológico de Bilib.

Pero el auge de los microservicios no responde únicamente a la necesidad de las empresas de desarrollar aplicaciones que mejoren las experiencias digitales integradas que demandan los usuarios, también tiene que ver con la cultura DevOps que está calando cada vez más en los departamentos de TI de todo el mundo. Esta filosofía o cultura refuerza el trabajo en equipo de todos los miembros implicados en el desarrollo de aplicaciones software.

Amazon o Netflix emplean la arquitectura de microservicios, ya que sus aplicaciones de software se dividen en servicios autónomos que se integran a través de una interfaz única. Por ejemplo, Amazon.com se divide en pequeños servicios a través de la arquitectura de microservicios: carrito de compra, área de recomendaciones, inventario, facturación, etc. De esta forma, cada uno de los equipos de desarrollo se encarga de una parte, por lo que las aplicaciones resultan, en términos generales, más sencillas de administrar, probar, desplegar y mantener gracias a la arquitectura distribuida.

Los contenedores y la orquestación, compañeros ideales de los microservicios

Visto el rompecabezas de componentes independientes de la arquitectura de microservicios, nos encontramos con la orquestación. Los diferentes elementos que forman una aplicación software desarrollada en microservicios deben orquestarse, o lo que es lo mismo, relacionarse entre sí para actuar como un todo robusto que realice la funciones para las que ha sido creado.

La tecnología de contenedores responde a estas capacidades de orquestación. De hecho, los contenedores están diseñados para ejecutar cualquier funcionalidad en base a pequeñas piezas. Con la “contenerización” unida a los microservicios, se hace más fácil administrar y actualizar cada uno de los servicios que se integran en una aplicación software.

Docker ha sido la tecnología de contenedores más empleada durante los últimos tiempos, ya que permitía aislar los contenedores por procesos y servicios de forma efectiva. Sin embargo, cuando es necesario administrar escenarios más complejos que coordinan múltiples servicios y procesos, Docker no resulta tan efectivo. Por este motivo, durante los últimos años, han surgido nuevas tecnologías de código abierto como Kubernetes que son más eficientes en escenarios más complejos.

Kubernetes actualiza de forma constante los contenedores e implementa el equilibrio de carga. Está ganando terreno gracias a su respaldo por parte del gigante Google y a sus funcionalidades avanzadas. Permite administrar e implementar una gran cantidad de contenedores Docker mediante el etiquetado inteligente. Mediante este sistema de etiquetado, se describen las características de la imagen a desplegar, que se asigna en función de las disponibles en el conjunto de hosts.

Además del etiquetado inteligente, Kubernetes emplea otro sistema de coordinación de contenedores: el nivel de agrupación pods, que consulta de forma constante el conjunto de contenedores que puedan contener una o varias etiquetas. Al actualizarse de forma continua los contenedores, se implementa asimismo un equilibrio de carga entre los contenedores para facilitar el acceso a cualquier miembro del equipo.

En definitiva, podemos determinar que la arquitectura de microservicios ha llegado para quedarse, especialmente ante desarrollos de aplicaciones de software complejos. La tecnología que respalda este tipo de arquitectura sería la de los contenedores que, como hemos visto, da un paso más allá gracias a nuevas tecnologías como Kubernetes que superan las funcionalidades de Docker.

Con todo ello, se consiguen ciclos más cortos de desarrollo en los equipos de TI; se facilita el mantenimiento de las aplicaciones software; se potencian los ciclos de lanzamiento independiente de cada equipo y son más sencillas de comprender. Sin embargo, no podemos obviar algunas desventajas ya comentadas como la posibilidad de fallas en cascada o la dificultad para encontrar el error entre los diversos componentes.