Registro y descubrimiento de servicios con Spring Cloud y Consul

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Tradicionalmente el conectar un servicio con sus servicios dependientes se ha realizado por configuración, normalmente mediante un nombre de dominio y su puerto. Esta configuración estática es suficiente para unos pocos servicios y que no varían durante su funcionamiento. Con el advenimiento de los microservicios con su estado y número cambiantes en el tiempo han surgido varias herramientas para en vez de usar configuración usar descubrimiento. Una de estas herramientas Consul para la que Spring Cloud proporciona integración.

Spring
Java

En una aplicación con una arquitectura de microservicios esta se compone de múltiples partes cambiantes. Los microservicios pueden aparecer, desaparecer, variar en número o cambiar de ubicación, la aplicación debe ser tolerante a esos cambios y seguir proporcionando su servicio. Por tanto, la configuración de red de los servicios no se puede realizar usando direcciones IP ya que no se conocen las que utilizarán los microservicios y usar nombres de dominio de DNS puede no ser viable ya que los cambios tardan en propagarse. Conocer el nombre de host y puerto reales de los microservicios es proporcionado por la funcionalidad de descubrimiento de servicios o service discovery que proporcionan algunos servicios como Eureka, Consul o Apache Zookeper.

En este artículo explicaré como usar la parte de descubrimiento de servicios de Consul usando una aplicación con Spring Boot y con Spring Cloud. Spring Cloud proporciona varias cosas comunes para aplicaciones basadas en microservicios. Si aún no conoces las herramientas en las que se basará el ejemplo puedes consultar los siguientes artículos específicos como introducción:

Consul además de descubrimiento de servicios proporciona otras funcionalidades como detección de fallos o caídas para prevenir enviar peticiones a máquinas fuera de servicio y almacenamiento básico clave/valor para configuración dinámica o activación de características. Dispone de una aplicación web en la que podemos ver el estado de los servicios, una API REST con la que comunicarse con Consul en una aplicación o en cada microservicio y un servidor de nombres DNS, podemos usar cualquiera de las dos interfaces de consulta, la basada en la API REST o la basada en DNS para obtener las direcciones IP con la ubicación de los servicios.

Consul

Instalar Consul es muy sencillo basta con descargar un binario y descargar la interfaz web si queremos tener el dashboard con la información del servicio. Descargados y descomprimidos Consul se inicia con el siguiente comando. Podemos acceder al panel dashboard con la dirección http://localhost:8500 con un navegador web. Inicialmente en el panel de servicios solo se encuentra el propio de Consul cuando aún no se ha registrado ningún servicio, aplicación o microservicio.

Una aplicación que use Spring Boot y que quiera hacer pública su disponibilidad en Consul basta con que use la anotación @EnableDiscoveryClient en la clase de inicio de la aplicación junto con las dependencias adecuadas. Con la declaración de esta anotación y la dependencia spring-cloud-starter-consul-all Spring se comunicará con Consul a través de la API REST para registrar cuando se inicie la aplicación, su nombre, nombre de máquina y puerto en el que estará disponible.

Spring Cloud proporciona además un servicio que podemos usar para conocer los servicios registrados en Consul, con la clase DiscoveryClient podemos conocer los nombres de los servicios, su nombre de máquina y puerto desde una aplicación Java. En el método run de la clase Main se usa en este ejemplo para imprimir en la salida el listado de servicios registrados en Consul. Uno de esos servicios esta aplicación de ejemplo, ya que se registra en Consul cuando se inicia.

Servicios registrados en Consul

Consul para conocer que los servicios siguen en funcionamiento hace una petición HTTP cada ciertos segundos a una ruta de la aplicación, Spring Boot proporciona una dependencia, spring-boot-starter-actuator, que usada provee del endpoint /health para que Consul monitorice el estado del servicio.

Endpoint de estado de servicio

Esta es la salida en la consola listando los servicios disponibles, siendo uno de ellos esta aplicación.

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 ./consul/consul.sh y ./gradlew run.