Los Microservicios, un forma de diseñar el software que aboga por construir funcionalidades que se desplieguen de manera independiente del resto y que cooperan con el resto de manera desacoplada, son como se dice ahora, tendencia.

Tanto, que hay algunas personas que lo describen en contraposición de SOA. es decir, SOA es cosa del pasado y lo nuevo es ahora el paradigma de microservicios. Creo que este enfoque está mal encaminado, creo que más bien que Microservicios es una nueva forma de implementar SOA. Es decir, una nueva forma de llevar a la práctica los principios que consagra la orientación a servicios. ¿Por qué digo esto? veamos…

¿Qué es SOA?

Casi siempre se identifica SOA con el uso del ESB, del Enterprise Service Bus, como pieza donde se despliegan los servicios SOA cuando en realidad no es así. Lo primero que hay que tener claro es qué significa SOA.

La arquitectura orientada a servicios es, nada más y nada menos, lo que dicen sus ocho principios. Hace ya ¡8 años! escribí  esta entrada sobre los principios. Que resumidamente son estos:

  1. Contratos de servicios estandarizados
  2. Servicios con bajo acoplamiento
  3. Abstracción (ocultación de los detalles internos del servicio)
  4. Reusabilidad 
  5. Autonomía (alto grado de control sobre su entorno de ejecución y la lógica que encapsula)
  6. Sin estado
  7. Capacidad de descubrimiento
  8. Composición

Como vemos, aquí no se habla de que se tenga que usar un ESB. Aunque evidentemente el uso de este patrón, implementado por una herramienta middleware comercial, ha sido lo más habitual en los despliegues de las arquitecturas SOA que hemos visto en las empresas.

¿Qué son los Microservicios?

Para tener una definición de lo que son, lo mejor es referirse al gurú Martin Fowler del que hablé en este artículo de hace tres años:

Una arquitectura de microservicios pone cada elemento de funcionalidad en un servicio separado y escala redistribuyendo estos servicios a través de los servidores, replicandolos según se vaya necesitando.

¿Son tan diferentes?

Por más que repaso una y otra vez la lista de estos principios de SOA, no veo ninguno que vaya en contra de lo que podría ser una definición de un microservicio. En especial, teniendo en cuenta que el principio 5, el de la Autonomía, nos dice que que el servicio tiene que poder “decir” como se implementa y como hacer la lógica que contiene de una manera independiente. ¿No es esto lo que defiende la idea de microservicio que se dice que se puede hacer con cualquier tecnología independiente de los demás?

Hay que hilar muy fino para detectar posibles incongruencias entre los principios de SOA y los microservicios, si es que realmente las hay. En mi opinión quizás sea una cuestión de matices:

  1. SOA consagra la reutilización de la funcionalidad.
    ¿Cómo se logra esto?. Pues componiendo servicios y haciendo “llamadas” desde los servicios de alto nivel a aquellos con funcionalidad más atómica.
    Y quizás donde mejor se pueda ver la diferencia entre el diseño tradicional de SOA y el actual con microservicios sea la propiedad de los datos. Hasta ahora lo normal es que cuando se necesita un dato, por ejemplo el precio de un producto, un servicio llame al servicio que es propietario del dato.
    En Microservicios sin embargo se procura que cada microservicio tenga los datos suficientes que operar. Si nuestro servicio necesita el precio entonces lo guardará en su propia base de datos, no hará falta llamar a ningún servicio.
  2. SOA tiene un ámbito de toda la empresa mientras que Microservicios está acotado al dominio funcional.
    Esta afirmación puede ser discutible, pero creo que puede tener sentido. Lo importante aquí, a mi modo de ver, es que podemos verlo como que los conceptos de Microservicios pueden aplicar a lo que ocurre dentro del módulo funcional, mientras que visto desde el exterior siguen aplicando los conceptos “tradicionales” de orientación de servicios y de diseño de APIs.
  3. Microservicios se suele contraponer al concepto de monolito, donde toda la lógica de la aplicación está en un sólo desplegable o aplicación.
    ¿Es SOA un monolito? evidentemente no. Sin embargo puede haber docenas o cientos de servicios desplegados sobre un mismo bus convirtiendo lo que debería ser un conjunto de servicios débilmente desacoplados en una “pelota” del todo monolítica, de tal modo que el fallo de un servicio o un uso abusivo de los recursos de memoria o CPU que comparte con otros servicios pueda propagarse en cadena haciendo fallar todo el sistema.
  4. Nivel de acoplamiento. 
    Un punto importante en el que puede variar la concepción tradicional que tenemos de SOA es el principio 2, el que habla del bajo acoplamiento. ¿Cuando el acoplamiento es suficientemente bajo? ¿puede existir diferencia entre un diseño con bajo acoplamiento de otro totalmente desacoplado?.
    Aquí sí que veo una manera clara, al menos en la implementación. Tradicionalmente considerábamos en SOA que el bajo acoplamiento era suficiente cuando únicamente conocíamos el contrato del servicio a invocar y además mediante el registry de servicios obteníamos el endpoint con la localización del servicioSin duda, una diferencia abismal respecto a arquitecturas precedentes.
    Sin embargo, este bajo nivel de acoplamiento ya no es suficiente para los Microservicios, que impulsan el uso de mensajería asíncrona con colas de mensajes bajo un patrón de suscriptor/publicador. De este modo los mensajes se convierten en eventos. El que produce un mensaje ni siquiera sabe quien lo va a consumir, ni por supuesto tiene que invocar a otro servicio, simplemente deja el mensaje en una cola y los que estén interesados lo consumirán. Esto es un nivel de acoplamiento muy inferior al anterior.

Conclusión

A mi modo de ver, Microservicios es una implementación concreta de los principios que dieron lugar a SOA. Ojo, no me refiero a la implementación que se hizo normalmente de SOA (basado en Bus) en los últimos años, me refiero a sus principios que siguen siendo igualmente válidos si hablamos de Microservicios.

Dicho de otro modo, no todo SOA es Microservicios, pero todo Microservicios es SOA.

Anuncios