Introducción a la arquitectura de microservicios

La arquitectura de software es un concepto difícil de definir, la IEEE lo define como “el concepto de más alto nivel de un sistema en su entorno. La arquitectura de un sistema de software (en cualquier momento en el tiempo) es su organización o estructura de los componentes importantes que interactúan a través de interfaces, y estos componentes se componen de componentes e interfaces sucesivamente más pequeños”, esta concepción en cambio no es aceptada por todos. 

Buscando en el libro “Patterns of Enterprise Application Architecture” de Martin Fowler quien es a nuestro criterio uno de los científicos del desarrollo de software que más conocimiento teórico a aportado al tema de microservicios explica sobre la complejidad de la definición conceptual de “Arquitectura de Software” y el gran desacuerdo que existe para llegar a un pleno entendimiento de todos. A partir de la diversidad de criterios para los fines de este material vamos a quedarnos con la parte de “el concepto de más alto nivel de un sistema en su entorno…”.

Sistemas monolíticos

El desarrollo de software estuvo marcado hasta el tiempo reciente por desarrollar aplicaciones monolíticas. Una aplicación monolítica es un software que implementa toda la lógica de negocio en un mismo ejecutable, estas aplicaciones son, inicialmente, fáciles de desarrollar, desplegar y ejecutar, pues todo está concentrado en un único lugar, en cambio a medida que el sistema comienza a crecer se complica su mantenibilidad, modificabilidad y escalabilidad. Los complejos monolitos se comunican entre sí en un ambiente de SOA (Arquitectura Orientada a Servicios), quien fue el predecesor de las arquitecturas basadas en microservicios. Para leer un poco más sobre SOA hay reglas que deben tenerse en cuenta, las mismas fueron descritas por Thomas Erl en el material “Principios del diseño de servicios”, que a nuestro criterio tienen alto grado de validez en el diseño y construcción de microservicios.

Arquitectura monolítica y su paso a los microservicios

Tradicionalmente las aplicaciones se han desarrollado bajo el principio de un único sistema complejo, generalmente modular y fuertemente acoplado, cuyo costo de desarrollo y deuda técnica crecen a la par, normalmente este tipo de aplicaciones se despliegan en un ejecutable único, a las aplicaciones desarrolladas con estas características se les clasifican como monolitos o implementadas con una arquitectura monolítica. 

El desarrollo monolítico tiene un grupo de inconvenientes:

  • Dificultades para la ejecución de pruebas a los componentes.
  • Equipo de desarrollo difícil de gestionar (Regla de las 2 pizzas).
  • La incorporación de nuevas características puede impactar en todo el sistema debido al alto acoplamiento.
  • Limitación para aprovechar la diversidad tecnológica y las ventajas particulares que ofrece cada tecnología para solucionar problemas específicos que suelen tener lugar.
  • Al estar todo unido el rendimiento puede verse comprometido, a la vez que la escalabilidad es más costosa toda vez que deben desplegarse instancias completas del sistema para aumentar sus capacidades de respuesta antes volúmenes de uso creciente.

Estos inconvenientes dieron lugar a los microservicios.

¿Qué son los microservicios?

Los microservicios son un término del que se habla hace apenas unos 5 años, sin embargo hemos desarrollado varios sistemas empleando este estilo y los resultados han sido muy positivos, conceptualmente retomemos la figura de Martin Fowler quien definió un concepto que nos parece adecuado: “es un enfoque para desarrollar una sola aplicación como un conjunto de pequeños servicios, cada uno de los cuales se ejecuta en su propio proceso y se comunica con mecanismos ligeros, a menudo una API de recursos HTTP. Estos servicios se basan en el negocio y se pueden implementar de forma independiente. Existe un mínimo de gestión centralizada de estos servicios, que pueden escribirse en diferentes lenguajes de programación y utilizar diferentes tecnologías de almacenamiento de datos.”

Patrones para la implementación de microservicios

Hay un grupos de buenas prácticas para implementar un ecosistema de microservicios que se han convertido en patrones casi obligatorios a tener en cuenta para obtener un máximo aprovechamiento de este tipo de sistemas. A continuación se listan los principales, próximamente lanzaremos un ebook completamente en español con una detallada explicación de cada uno de estos patrones, cuando usarlos y que tecnologías posibles usar para soportarlos desde el punto de vista tecnológico.

  • Un base de datos por servicio.
  • CQRS.
  • Eventos del dominio (Event Driven).
  • Fuentes de eventos (Event sourcing).
  • API Gateway.
  • Descubrimiento de servicios (Lado del cliente, lado del servidor).
  • Configuración centralizada.
  • Backend for frontend (BFF)
  • Microfrontend.
  • Orquestación.
  • Circuit Breaker.
  • Reintentos (Retry).
  • Cache.
  • Control de acceso basado en token.
  • Balance de carga.

¿ Crees que la arquitectura basado en microservicios es útil para todos los escenarios ?

Si tienes alguna duda, cuéntanos en los comentarios, te responderemos a la brevedad. También puedes regalarme una cerveza 🙂

38 comentarios en «Introducción a la arquitectura de microservicios»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

SACAViX Tech