Registro y descubrimiento de servicios con Spring Cloud Netflix

Escrito por picodotdev el .
java planeta-codigo programacion
Comentarios

Spring
Java

Los microservicios en una aplicación con una arquitectura de microservicios son efímeros, se crean, se escalan para atender picos de mayor demanda, pueden desaparecer por problemas de la red de comunicaciones que no es fiable y volverse a crear en una ubicación diferente. Por esta naturaleza efímera es necesario un servicio con el cual los clientes de los microservicios puedan encontrarlos y que los microservicios utilizan para registrarse cuando se inician.

Este servicio de registro y descubrimiento es esencial y crítico en una aplicación orientada a microservicios ya que sin él los clientes no pueden encontrar los servicios que necesitan. Dado que es un servicio esencial es necesario que esté siempre disponible y para ello es recomendable crear un cluster de servicios de registro y descubrimiento para que en caso de que una instancia de este servicio falle estén disponibles otras instancias para los clientes.

Una implementación de registro y descubrimiento es Consul, Consul es un servicio externo creado por Hashicorp. Spring Cloud entre sus proyectos, Spring Cloud Netflix, proporciona una implementación con Eureka de servicio de registro y descubrimiento que se pueden embeber en una aplicación de Spring Boot.

Para crear un servidor Eureka con Spring y Spring Boot hay que crear una aplicación con las dependencias adecuadas y la anotación @EnableEurekaServer para habilitar el inicio del servidor de registro y descubrimiento. Además, establecer las propiedades de configuración adecuadas para que el cluster de servidores Eureka se forme. Este microservicio es el primero que ha de iniciarse en una aplicación orientada a microservicios.

Utilizando Gradle las dependencias y la anotación @EnableEurekaServer a añadir a la clase principal de la aplicación son las siguientes.

La propiedad de configuración principal para formar el cluster es eureka.client.serviceURL.defaultZone donde se especifica una lista hostnames donde están los servidores de registro y descubrimiento. Para dar a cada servidor en local un nombre de dominio distinto he usado el servicio de DNS xip.io que resuleve el nombre de dominio a la dirección IP indicada en el propio nombre de dominio, así ds1.127.0.0.1.xip.io se resuelve a 127.0.0.1 que es la dirección para la propia máquina local al igual que ds2.127.0.0.1.xip.io y ds3.127.0.0.1.xip.io. El servicio de xip.io evita tener que crear en el archivo de hosts local una correspondencia entre nombre de hostname y la dirección IP de loopback de la propia máquina local.

En el archivo de configuración hay tres perfiles distintos que varían algunas propiedades según sea el perfil que se active al iniciar la instancia del servicio. En el perfil ds1 el puerto donde se inicia el servicio es 8761, con el perfil ds2 el servicio se inicia en el puerto 8762 y con ds3 en el 8763, además se cambia el hostname para que la instancia sepa cual es.

Los comandos para arrancar tres instancias de servidor de registro y descubrimiento utilizando varios perfiles de configuración de Spring son los siguientes.

Estando disponible el servicio de registro y descubrimiento ya se puede iniciar el servicio de configuración. Con estos dos servicios de infraestructura iniciados los que sería un servicio de la aplicación ya puede iniciarse que consiste en este caso en obtener una referencia de una instancia del servicio de configuración registada en el servicio de registro y descubrimiento, con esta referencia obtiene su configuración y se inicia.

Una vez iniciados los servidores de descubrimiento en la página dashboard de cualquiera de ellos cambiando el puerto de la dirección http://ds1.127.0.0.1.xip.io:8761/ se observan varias propiedades como la lista de servidores del cluster, las réplicas registradas y disponibles y los servicios registrados con su ubicación y puerto. En este caso hay tres instancias del servicio de registro y descubrimiento, una de servidor de configuración y dos instancias de un servicio.

Servicios y su estado registrados en el servicio de registro y descubrimiento

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew discoveryserver:run --args="--spring.profiles.active=ds1".