En artículos anteriores se han identificado los principales componentes de la arquitectura de microservicios de Spring Cloud enumerando las ventajas que cada uno aporta (El 'who is who'). En el siguiente post, y otros que se publicarán próximamente, se pretende profundizar en dichas ventajas metiéndonos en harina con uno de los componentes: Eureka. Para ello se han configurado y probado las diferentes funcionalidades que se pueden ver a continuación.

Configuración básica

Se ha partido de una configuración básica en la que se dispone de lo siguiente:

% block:image

Configuración avanzada y metadatos

La configuración que se puede ver en la anterior imagen nos proporciona lo necesario (más algún pequeño añadido) para ejecutar nuestro servidor Eureka y que el microservicio security se registre en él. En esta sección vamos a profundizar en configuración adicional, que nos permite personalizar nuestro microservicio security.

Además de la información típica (nombre, IP, estado ...) Eureka almacena en su registro información adicional sobre cada microservicio. Por ejemplo existen dos propiedades para definir el path del endpoint de estado y el path del endpoint de información. Estos endpoints sirven para que otros microservicios puedan recuperar el estado del microservicio e información adicional sobre el mismo respectivamente.

Eureka configura por defecto estas propiedades con los valores ‘/info’ y ‘/health’ aunque nuestra aplicación no los implemente. Estos valores se pueden sobreescribir con las propiedades eureka.instance.statusPageUrlPath y eureka.instance.healthCheckUrlPath. En nuestro caso hemos definido los valores ‘/my_info’ y ‘/my_health’.

Otras propiedades relevantes son las referentes al http seguro. Aunque éste está habilitado por defecto en Eureka, será necesario configurar dos properties explícitamente:
eureka.instance.nonSecurePortEnabled=false y eureka.instance.securePortEnabled=true para que se trabaje con la conexión segura. Esto hará que Eureka publique la información de la instancia mostrando preferencia por la conexión segura.

Existe otra propiedad interesante que nos permite definir el estado inicial que será transmitido a Eureka en la primera notificación para el registro. Se trata de eureka.instance.initialStatus que en nuestro caso hemos definido con el valor UNKNOWN. De esta forma podemos registrar microservicios sin ponerlos inmediatamente disponibles utilizando los diferentes estados (se analizan en profundidad más adelante). En la siguiente captura del dashboard de Eureka podemos ver cómo efectivamente nuestro microservicio se registra con dicho estado:

MicroS3 Eureka 2

Eureka nos permite así mismo proporcionarle información adicional como metadatos. Para ello dispone de la propiedad eureka.instance.metadataMap. En nuestro caso hemos añadido dos propiedades al mapa de metadatos: ‘appOwner=abraham’ y ‘description=eureka tutorial’. También hemos añadido otra propiedad eureka.instance.virtualHostName con el valor myOtherHostName.

La lista de propiedades que se pueden configurar se pueden consultar en las clases org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean y org.springframework.cloud.netflix.eureka.EurekaClientConfigBean. A continuación podemos ver cómo queda el fichero de configuración de nuestro microservicio security al configurar algunas de estas propiedades:

MicroS3 Eureka 3

Podremos comprobar los datos de los microservicios registrados por Eureka en http://localhost:8761/eureka/apps. También podemos ver los datos de un microservicio concreto añadiendo /{nombre de microservicio} al final de la anterior URL, en nuestro caso http://localhost:8761/eureka/apps/security. La siguiente imagen muestra los datos en el registro para la configuración correspondiente a la anterior dada:

MicroS3 Eureka 4

Como se puede observar, tanto el status como el overriddenstatus tienen el valor UNKNOWN. También se puede ver que se han incluido nuestros datos en la sección metadata, así como actualizado las URL para statusPageUrl y healthCheckUrl y el vipAddress.

Gestión del estado

El registro de los microservicios se realiza por medio de notificaciones llamadas heartbeat que se realizan cada 30 segundos. Cada microservicio deberá enviar una notificación al Eureka Server cada 30 segundos para que éste sepa que el microservicio sigue activo. Si el servidor no recibe una notificación después de 90 segundos eliminará al microservicio del registro.

Éste es el comportamiento por defecto, pero nuestro microservicio podría querer notificar diferentes estados más allá de estos dos. Podríamos querer que nuestro microservicio se registrase como no disponible para que no se le derivaran peticiones durante un periodo de tiempo, por ejemplo para realizar tareas de mantenimiento, pruebas... Para esta finalidad Eureka soporta cinco estados diferentes: OUT_OF_SERVICE, DOWN, STARTING, UNKNOWN y UP.

Nosotros mismos podemos gestionar el estado devuelto por nuestro microservicio implementando la interfaz com.netflix.appinfo.HealthCheckHandler. Deberemos habilitar también esta opción en nuestra configuración, para ello añadiremos la propiedad eureka.client.healthcheck.enabled=true.

La siguiente captura muestra una implementación que se ha realizado para las pruebas. Su funcionamiento consiste en ir retornando un estado diferente cada vez que sea consultada (cada 30 segundos), y una vez retornados todos volver siempre al estado ‘UP’:

MicroS3 Eureka 5

A continuación se pueden ver dos capturas que reflejan estos cambios de estado del microservicio:

MicroS3 Eureka 6

Esta funcionalidad nos abre la puerta a controlar dinámicamente el estado de nuestro microservicio. Podríamos definir un método REST securizado para cambiarlo, o recuperarlo de una base de datos, o de una caché, incluso podríamos definirlo como una propiedad de configuración y cambiarla en caliente gracias a cloud-config.

Esto nos proporciona una serie de ventajas:

Cuéntanos qué te parece.

Enviar.

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.