En el post anterior se comenzó explicando posibles configuraciones del servidor y cliente Eureka, que rematamos en esta segunda y última parte con la configuración de un cluster de servidores.

Eureka Peer Cluster

En la configuración hasta ahora mostrada del servidor Eureka en modo ‘standalone’, éste consta de una única instancia que combinada con el uso de las dos cachés (de cliente y servidor) añaden fiabilidad y resistencia a fallos al sistema, pero no toda la necesaria teniendo en cuenta que Eureka es la pieza central de nuestro ecosistema de microservicios.

Por ello, Eureka puede ser configurado como un cluster de instancias peer aumentando así la fiabilidad y resistencia a fallos. Estas instancias se registrarán las unas en las otras durante el arranque e intercambiarán la información del registro entre ellas.

Aclaración: Eureka distingue las diferentes instancias de un mismo microservicio (o de sí mismo como servidor) en base al hostname en el que se ejecuta cada instancia. Al hacer la prueba en local, si levantamos dos instancias de un microservicio, aunque el servidor reciba heartbeat de las dos, entenderá que se trata de una única por tener el mismo nombre y hostname. Esto es el comportamiento normal, ya que las instancias de cualquier microservicio no deberían ejecutarse en la misma máquina (ya sea virtual o física). Por tanto, para poder realizar esta prueba en local, deberemos editar nuestro fichero de hosts para definir un nuevo hostname para nuestra máquina, en este caso hemos utilizado demo.eureka.com. Otra forma de hacerlo sería utilizar Docker para cada una de las instancias.

MicroS3 Eureka 7

Como se puede ver se han definido dos perfiles:

  • Node1: se ejecutará en el puerto 8761 y no tiene definido nombre de máquina (como hemos visto en previas capturas del dashboard de Eureka utilizará abraham-laptop como nombre de máquina)
  • Node2: se ejecutará en el puerto 8762 y utilizará como hostname demo.eureka.com (propiedad eureka.instance.hostname)

Cosas importantes a destacar de la configuración:

  • Los dos microservicios tienen el mismo nombre eureka-server y al tener hostnames diferentes se identificarán como dos instancias del mismo microservicio.
  • Los dos microservicios aún siendo servidores Eureka, también son clientes Eureka y se registrarán en sí mismo y en el otro nodo y recuperarán el registro (propiedades eureka.client.XXX).
  • Propiedad eureka.instance.leaseRenewalIntervalSeconds: el proceso de registro de un microservicio puede implicar un tiempo considerable ya que éste no estará disponible para que otros lo descubran hasta que las cachés de los clientes, servidor e instancia estén sincronizadas, lo que puede requerir tres heartbeats. Esta propiedad permite indicar cada cuantos segundos se envían los heartbeats en lugar de los 30 por defecto, reduciendo así el tiempo necesario para el proceso de registro.
  • Propiedad eureka.server.enableSelfPreservation es explicada en más detalle en la siguiente sección del artículo.
MicroS3 Eureka 8
MicroS3 Eureka 9
MicroS3 Eureka 10

En esta situación podría parecer que todo se ha ejecutado de la forma correcta. Nada más lejos de la realidad. Según la configuración actual, el microservicio security solo enviará heartbeats al nodo 1, por lo que si éste se cayera por el motivo que fuera, no podríamos tener constancia de la existencia de security.

MicroS3 Eureka 11

La forma correcta es por tanto incluir todos los nodos de Eureka Server en la configuración de security (eureka.client.serviceUrl.defaultZone=http://abraham-laptop:8761/eureka/,http://demo.eureka.com:8762/eureka).

…y más a fondo

Ya hemos visto unos cuantos conceptos avanzados sobre Eureka, pero para aquellos que todavía estén sedientos de más, esta sección aglutina algunos detalles adicionales sobre el funcionamiento de Eureka:

  • Los clientes Eureka utilizan una caché para almacenar el registro de forma que no tienen que solicitarlo al servidor cada vez que necesitan invocar a otro microservicio. Esta información se actualiza cada 30 segundos con cada heartbeat.
  • Durante su parada, una instancia de microservicio enviará al servidor una notificación de apagado, de forma que Eureka eliminará dicha instancia del registro.
  • Se pueden añadir tantos peers como se desee siempre y cuando estén todos conectados entre sí por al menos un punto, de forma que puedan sincronizar sus registros. Si los peers no pudiesen comunicarse podríamos llegar a una situación ‘split-brain’ donde cada uno tiene registro de un conjunto de microservicios diferentes.
  • Cuando se arranca una nueva instancia peer esta intenta recuperar la información de registro de un nodo vecino, y en caso de no ser posible intentará con todos los demás.
  • Si en cualquier momento la tasa de notificaciones cae por debajo de un determinado valor (85% durante 15 minutos) el servidor parará de eliminar instancias del registro. Esto es conocido como el modo self-preservation y es utilizado para proteger el registro ante situaciones donde pueda existir una partición de red entre diferentes instancias de Eureka Server. Así mismo, esto puede provocar que se recuperen instancias de microservicios que ya no existen, por tanto los microservicios deben implementarse teniendo en cuenta posibles fallos debido a dicha situación.

Conclusiones

Eureka es una herramienta, aunque relativamente joven, madura. Diseñada para trabajar en entornos distribuidos con alta disponibilidad y tolerancia a fallos.

Dispone de una gran cantidad de opciones de personalización, sin tener en cuenta la posibilidad de extender o sobreescribir funcionalidades. Lo exquisitamente bien diseñada que está y todas las posibilidades que ofrece nos hace pensar en cómo hemos podido trabajar sin Eureka hasta ahora.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.