Durante el pasado he mencionado en varias ocasiones el término microservicios, dando por hecho que todo el mundo sabe lo que son, pero he recibido un par de mensajes preguntando por los mismos, y que ventajas tienen, etc.
En este post vamos a ver un análisis sobre lo que son los microservicios, Cabe destacar que lo que llamamos microservicios es en realidad una arquitectura de programación por lo que nos sirve en cualquier lenguaje de la web, tanto C#, Java, php o los frameworks de javascript.
Índice
1 - Qué es una aplicación monolítica?
Antes de comenzar a descubrir que es la arquitectura de microservicios debemos entender que estos no aparecieron de la nada, sino que son una evolución de lo que era la arquitectura monolítica.
La cual es una arquitectura que se basa en tener una sola aplicación para toda la estructura del sistema.
Esta arquitectura tiene varios problemas y en su mayoría son mucho más “gordos” que los beneficios que nos puede traer.
La principal característica que una aplicación monolítica tiene es que todo el proyecto y por ende el código del mismo está en el mismo sitio. Todo bien juntito y apretujado.
1.1 - Ventajas y desventajas de las aplicaciones monolíticas
Esto nos trae varias desventajas:
- El código se vuelve muy largo en tamaño, lo cual parece que no, pero trae un problema a la hora de cargarlo en nuestro pc por ejemplo, y por supuesto lo hace mucho más difícil de modificar o administrar.
- Un cambio mínimo, como puede ser una palabra en el front end, va a causar que tengamos que desplegar la aplicación completa, y si el proyecto es muy grande, puede tardar minutos, depende del tamaño, incluso horas. Es común ver en empresas que tienen arquitecturas de monolito, que se haga un único deploy al mes, o menos incluso y además ese deploy sea muy crítico ya que la aplicación no funciona, los clientes no pueden acceder, etc.
- Escalar o replicar este tipo de aplicaciones no es que sea imposible, pero es extremadamente más caro y complicado, más que nada, porque posiblemente lo que tengamos que escalar sea un 1% de la aplicación, pero al estar todo en un único bloque debemos hacer la réplica de la aplicación completa.
- Casi imposible el migrar a otra tecnología o utilizar otras tecnologías en general si la aplicación es del año 2000 y fue originariamente escrita en .NET Framework 1, es casi imposible que la veas migrada a .NET core y ni que decir tiene utilizar Blazor por ejemplo.
Pero también nos trae algunos beneficios, no son muy allá, pero los tiene:
- Los despliegues, pese a ser críticos suelen ser “simples”, únicamente hay que hacer un único despliegue, si la aplicación es muy muy grande es un problema, pero si es un nivel medio, pues bueno, en 5 minutos está todo desplegado.
- No hay problemas con caídas parciales del sistema uno de los problemas de los microservicios es que puede ser que uno esté caído o la red no funcione bien, por lo que puede tardar, en los monolitos no tenemos ese problema, toda la aplicación va igual, si se cae, no funciona nada.
Nota: Hay que tener en cuenta que siempre hablo en forma de un entorno laboral, para un proyecto personal pequeño como puede ser un blog, no hace falta hacer microservicios.
2 - Qué es un microservicio
Ahora que hemos visto que es un monolito y tenemos claro que es una arquitectura de principios de siglo, vamos a pasar a la más común ahora mismo, los microservicios.
Nota: Existen más, como puede ser la arquitectura serverless, pero ello nos da para otro post.
Podemos decir que la arquitectura de microservicios es un estilo en el que hacemos pequeños servicios que se comunican entre ellos, principalmente utilizando protocolos ligeros como el HTTP
. Normalmente utilizando APIs, comunmente, api rest.
Una de las características principales de los microservicios es que cada uno tiene (si utiliza) su propia base de datos, su propio sistema de ficheros, etc. la idea es que estos servicios sean independientes (la lógica), esto puede llevar (y lleva) a que en ciertas ocasiones duplicamos información.
Nota personal: Cuando estábamos empezando el proyecto en el que estoy ahora, el que era jefe de desarrollo dijo lo siguiente “no os preocupeis en duplicar la información, 10 veces si es necesario, el espacio de almacenamiento es muy barato, lo que es caro es enviarla”
2.1 - Características de un microservicio
Antes de pasar a las ventajas y a los inconvenientes quiero explicar qué debemos pensar antes de crear un microservicio.
A - Responsabilidad: Debemos pensar que es lo que va a hacer nuestro microservicio, la forma más fácil (en mi opinión) de detectar qué parte debe estar en un microservicio o en otro es basándonos en la lógica de negocio (en este caso la empresa).
Fijándonos en el ejemplo de la imagen anterior vemos que tenemos un microservicio que contiene la información de las películas, otro el de las series y otro el de los actores.
Y de ellos dependen otros microservicios.
B - Prevenir caídas completas: una de las grandes características de los microservicios es que podemos hacer que funcionen parcialmente (obviamente no en todos los casos).
Con esto que quiero decir, volvemos al ejemplo de la imagen anterior.
Imaginémonos que el microservicio de “películas” está caído, Por lo que “novedades” y “continuar viendo” estarán parcialmente caídos, mientras que “series más vistas” estará completamente funcional.
Eso quiere decir que en nuestra pantalla de inicio, el usuario debe poder ver todo lo referente a las series, incluso aunque el resto esté caído.
Cuando desarrollamos microservicios debemos hacerlo pensando en que existe la posibilidad de que uno no funcione, y si es posible, funcionar sin él.
2.2 - Ventajas y desventajas de los microservicios
Como en el caso de la arquitectura monolítica, también tenemos ventajas, como desventajas, pero en este caso las ventajas son mucho mejores.
2.2.1 - Ventajas de los microservicios
- Micro: La palabra micro en microservicios no está ahí de casualidad, la idea es que sean servicios muy pequeños en términos de código, lo que lo harán fácil de modificar.
- Al ser “micro” hace que su lógica sea mucho menor, por ende los cambios son más sencillos.
- Los microservicios son independientes lo que indica que los despliegues son de forma individual, así como si tenemos que escalar un servicio en concreto, únicamente escalaremos este.
- Podemos crear cada microservicio en la tecnología que más necesitemos
- Como lo explicado en la imagen anterior, no porque un microservicio esté caído la aplicación no debe funcionar, sino que puede estar parcialmente disponible.
2.2.2 - Desventajas de los microservicios
- Un sistema distribuido en forma de microservicios suele ser más difícil de comprender ya que a más microservicios encontraremos una mayor complejidad, así como dependencias entre los mismos.
- Hay que tener en cuenta que los microservicios van por la red, lo que implica que puede haber cierta latencia llamando de unos a otros.
- Detectar que debe ser un microservicio o qué parte debe estar dentro de un microservicio ya existente es la parte más difícil de la arquitectura.
- Es crucial tener un buen sistema de logs y de seguimiento del flow y de la aplicación, ya que un error en un microservicio puede aparecer en otro, por lo que es difícil hacer debug.
Conclusión
En este post hemos visto la diferencia entre la arquitectura de monolito y la arquitectura de microservicios.
Dependiendo de nuestros requerimientos utilizaremos una o la otra, pero en la gran mayoría de escenarios utilizaremos microservicios.
Finalmente hemos visto los beneficios y contras de la arquitectura de microservicios.