Los microservicios son un estilo de arquitectura informática y de programación de software que se caracterizan principalmente por la división de sus aplicaciones en elementos más pequeños e independientes unos de otros. Este enfoque añade flexibilidad y dinamismo, ya que es más fácil agregar funciones nuevas a un programa informático dividiéndolo en múltiples partes que si se organiza en una única aplicación (arquitectura monolítica). Pero por otro lado también supone retos y problemas a los que hay que encontrar solución, como la comunicación entre microservicios.
¿Qué es la comunicación entre microservicios?
Uno de los aspectos más importantes en el desarrollo de una aplicación o un software basado en los microservicios es la comunicación que se va a establecer entre ellos, un proceso que puede resultar bastante complejo.
En un software de arquitectura monolítica y que por lo tanto se ejecuta en un único proceso, los distintos componente se comunican entre ellos mediante llamadas a nivel del lenguaje. Dichos componentes pueden estar estrechamente ligados entre sí en el caso de que se creen objetos concretos con código, o bien pueden establecerse conexiones de un modo desacoplado si se usan referencias de abstracciones utilizando una inserción de dependencias. Pero en ambos casos, los objetos se ejecutan en un mismo proceso.
Una aplicación o un software basado en microservicios es un sistema que, a su vez, se ejecuta en diferentes procesos, servicios y, la mayoría de las veces, también en varios servidores o hosts. Como lo habitual es que cada instancia de servicio funcione como un proceso diferenciado, los servicios tienen que actuar mediante un protocolo de comunicación entre procesos. En función de la naturaleza de cada servicio, estos protocolos pueden ser HTTP, AMQP o un protocolo binario TCP.
Todo esto implica que en la arquitectura de microservicios sea necesario cambiar los mecanismos de comunicación. Existen diversas soluciones posibles y es importante elegir la más adecuada para cada software desarrollados a través de microservicios, puesto que algunos de los sistemas de comunicación posibles resultan ineficaces y conducen a un mal rendimiento del software o la aplicación.
En realidad, no existe un única solución de comunicación entre microservicios, sino varias. A continuación, pasamos a desarrollar las diferentes opciones.
Tipos de comunicación entre microservicios
La comunicación entre el cliente y los diferentes microservicios puede realizarse a través de diferentes tipos de comunicación, cada uno de ello enfocado a un escenario diferente. En general, existen dos criterios para clasificar estos sistemas de comunicación:
- Por clase de protocolo: sincrónico o asincrónico.
- Por número de receptores: uno o varios.
Protocolo sincrónico o protocolo asincrónico.
Estas son las diferencias entre ambos:
- Protocolo sincrónico. Se caracteriza por ser un sistema que implica aislar lo máximo posible cada microservicio, puesto que se produce un bloqueo de los subprocesos. El HTTP/HTPS sería un ejemplo típico de protocolo de comunicación entre microservicios de tipo sincrónico, donde el cliente únicamente puede continuar su tarea en el momento que recibe una respuesta del servidor.
- Protocolo asincrónico. En este caso, los subprocesos no están bloqueados y se utilizan protocolos compatibles con muchos sistemas operativos y entornos en la nube. Un ejemplo sería el protocolo AMQP, en el que normalmente el código del cliente o el remitente del mensaje no espera ninguna respuesta. Simplemente lo que hace es enviar un mensaje a una cola RabbitMQ o a cualquier otro agente de mensajes.
-Integración de datos con arquitecturas monolíticas o de microservicios-
Receptor único o varios receptores
Un segundo criterio de clasificación de los protocolos de comunicación entre microservicios es en función del número de receptores, distinguiéndose entre un único receptor o varios.
- Receptor único. En este caso, cada solicitud ha de ser procesada por un receptor o un servicio. Un ejemplo de este tipo de comunicación es el patrón Command.
- Varios receptores. Un ejemplo de este tipo es la arquitectura de microservicios controlada por eventos, la cual se basa en un agente de mensajes o interfaz de bus de eventos que se dedica a propagar las actualizaciones de datos entre diferentes microservicios a través de eventos. Por lo general, este interfaz se implementa a través de un bus de servicio o algún dispositivo similar, como Azure Service Bus, mediante temas y suscripciones.
Estilos de comunicación entre microservicios
Una vez elegido el tipo de comunicación entre microservicios que se quiere utilizar, existe una amplia diversidad de protocolos y opciones distintas: es lo que se conoce como estilos de comunicación entre microservicios.
Por ejemplo, si se va a usar un mecanismo de comunicación sincrónico, basado por lo tanto en el método de solicitud-respuesta, tenemos la posibilidad de usar diferentes enfoques o estilos de comunicación. En este caso, el protocolo HTTP y el protocolo REST son los que se utilizan con una mayor frecuencia.
Pero existen otras opciones, como el host de Docker o el clúster de microservicios, para establecer servicios de comunicación de forma interna o los mecanismos de comunicación de formato binario, como WCG mediante TCP. Otra opción es usar mecanismos de comunicación asincrónicos basados en mensajes como AMQP.
Algunos programadores optan por usar un formato binario no estándar para la comunicación interna entre los microservicios. Esta opción es posible tanto para el host de Docker como para el clúster de microservicios (por ejemplo, orquestadores de Docker), y también para las aplicaciones propiedad del cliente que se comunican con los microservicios.
Normalmente, las aplicaciones basadas en microservicios suelen usar sistemas que combinan diferentes estos estilos de comunicación. El tipo más común es la comunicación de un único receptor a través de un protocolo sincrónico, siendo el HTTP/HTTPS uno de los más utilizados. De forma complementaria, los microservicios también suelen usar protocolos de mensajería en la comunicación asincrónica entre microservicios.