radar

Consul es una herramienta de red proporcionada por Hashicorp que nos permite disponer de Service Mesh, Service Discovery o comprobar el estado de nuestros servicios a través de un endpoint health check.

En éste post vamos a ver como podemos aprovechar la integración Spring Cloud Consul para poder contar con un Service Discovery en nuestro Sistema Microservicios utilizando Spring.

Service Discovery

A medida que nuestro sistema de Microservicios empieza a crecer, se hace complejo que cada nodo conozca la dirección IP de cada servicio al que debe llamar. Si bien es cierto que podemos establecer variables en nuestro config-server, no es una solución aceptable.
La cosa se agrava aún más si está desplegado en cloud, ya que cada nodo se asigna de forma dinámica.
Para dar solución a éste problema, hay varios patrones como client-discovery, server-discovery o service-registry, utilizado por Consul.
Service-Registry consiste en proporcionar una API Rest a través de la cual los clientes quedarán registrados en el sistema.

Health-Check

Consul nos permite añadir un endpoint al que irá haciendo llamadas en el intervalo que nosotros le indiquemos para asegurarse de que el servicio está funcionando correctamente.

Instalación de Consul

Podemos instalar Consul descargando y compilando el código fuente, ejecutando el binario o mediante los repositorios de software de vuestra distribución GNU/Linux.
Para éste ejemplo descargaremos el binario .
Una vez descargado y descomprimido ejecutaremos:

$ ./consul agent -dev -node machine

Es importante destacar que de éste modo estamos ejecutando en local y en modo desarrollo una instancia de Consul. En producción se debe implementar de un modo totalmente distinto, debiendo ser añadido al PATH, a systemd, asignar los permisos necesarios, etc.
Si todo ha ido correctamente, ya podremos acceder a http://localhost:8500 y ver el panel de control de Consul.

consul control panel

Dependencias

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

Configuración

En el fichero application.properties incluiremos el nombre de nuestra aplicación, activaremos el endpoint de control y le indicaremos el path y el intervalo para health-check:

spring.application.name=client
management.endpoint.consul.enabled=true
spring.cloud.consul.discovery.health-check-path=/
spring.cloud.consul.discovery.health-check-interval=15s

Será necesario añadir la anotación “@EnableDiscoveryClient” a nuestra clase principal, ya que hemos iniciado el servicio Consul en local y con su puerto por defecto.

package com.juanmorschrott.consul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConsulApplication.class, args);
	}

}

Resultado

Una vez configurado e iniciado el servicio, estará registrado en consul. Para hacer una prueba rápida, he añadido un endpoint “/instances” a través del cual puedo consultar a Consul mediante DiscoveryClient:

@GetMapping("/instances")
public String serviceUrl() {
    List<ServiceInstance> list = discoveryClient.getInstances("client");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri().toString();
    }
    return null;
}

Si ejecuto una llamada a dicho endpoint, puedo obtener la URI del servicio consultado:

CURL

Conclusión

Con Spring Cloud Consul podemos contar con service discovery para nuestro sistema de microservicios, disponiendo así de un servicio central al que consultar sobre el resto de aplicaciones.
Además nos proporciona un panel de control para comprobar el estado de los diferentes servicios.
Podéis encontrar el código del ejemplo aquí .

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate