Microservicios con Spring Cloud Bus

Microservicios con Spring Cloud Bus

Microservicios con Spring Cloud Bus


En esta entrada vamos a ver una gran utilidad de Spring para cuando trabajamos con Spring Cloud y Spring Cloud Config Server, para ayudarnos a realizar cambios en caliente en nuestras propiedades y que estas sean aplicadas. Hacer uso en microservicios con Spring Cloud Bus, nos ayudará mediante una cola, a que estas propiedades sean aplicadas en tiempo real y que nuestro cliente se refresque sin necesidad de reiniciar el servicio.

Cuando trabajamos con Spring Cloud solemos tener las propiedades externalizadas en algún repositorio GIT, y a través de Spring Cloud Config Server podemos hacer uso de ellas. Esto es muy útil, pero en el momento que necesitamos realizar algún cambio en una propiedad hay que reiniciar la instancia. Para evitar este tipo de problemas, hacemos uso de Spring Cloud Bus, que nos permitirá realizar cualquier cambio de propiedades en caliente y que se aplique a la aplicación apoyándonos en un message broker.

Spring Cloud Config Bus hace uso de AMQP broker como mensajería de transporte, pero puede ser usado Redis o Kafka (el cual aplicaremos en nuestro ejemplo) como sustituto sin problema.

¿Qué es Spring Cloud Bus?

Como hemos resumido anteriormente Spring Cloud Bus, nace con la idea de independizar la configuración de los microservicios para aplicar la configuración, a través de un message broker.

Microservicios con Spring Cloud Bus
Spring Cloud Bus

Spring Cloud Bus, va siempre unido a Spring Cloud Config Server, ya que esté es el reponsable de la configuración externalizada.

Este broker puede ser usado como un canal de comunicación entre microservicios, pero la idea principal es hacer uso de este broker como un Bus. En el que la información es distribuida y permite escalar la aplicación.

Spring Cloud Bus, tendrá una serie de productores y consumidores, que se encontrarás subscritos a un topic y obtendrán los últimos cambios del config server.

Configuración Spring Cloud Bus

Para comenzar vamos a partir del ejemplo que realizamos con Spring Cloud Config Server, en el que realizamos un ejemplo con configuración externalizada en Github y vault.

Una vez hemos descargado ese proyecto vamos a añadir las dependencias maven necesarias:

Dependencias Maven para Spring Cloud Bus

Dependencias en Spring Cloud Config Servidor

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>

Como hemos comentado anteriormente, podemos utilizar diferentes tipos de broker, por lo que optamos por kafka.

Spring-cloud-config-monitor, nos proporcional el endpoint /monitor, del config server que se encuentra escuchando cualquier evento de manera que pueda enviar un mensaje a kafka. Por ejemplo añadiendo un webhook en github añadiríamos este endpoint.

Dependencias en Spring Cloud Client

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Hay que tener en cuenta, que todos los clientes se tienen que conectar a Kafka para obtener la nueva configuración. Y obtener el refresco de las configuraciones.

La dependencia de spring-boot-starter-actuator, va a añadir el endpoint  /actuator/bus-refresh, el cual que va a encargar de refrescar el cliente.

Activar Spring Cloud Bus

Para poder activar Spring Cloud Bus vamos a tener que hacerlo tanto en el cliente como en el servidor:

Spring Cloud Client

Para poder activar en el cliente el resfresco de las configuraciones, lo primero es añadir la anotación, @RefreshScope, con la que indicaremos que activamos el refresco de propiedades en nuestro cliente gracias a la dependencia de actuator. De esta manera cuando una propiedad cambie en nuestro repositorio de propiedades podrá ser aplicado el cambio.

@SpringBootApplication
@RestController
@RefreshScope
public class SpringCloudConfigClientApplication {
}

Una vez hemos añadido la anotación tenemos que activarlo en nuestro bootstrap.yml:

spring:
  cloud:
    bus:
      enabled: true
      refresh:
        enabled: true
    kafka:
      bootstrap-servers: ${KAFKA_ADDR:http://localhost:9092}

Hay configuración adicional que se podrá ver completo en el ejemplo. Aquí hemos activado Spring Cloud Bus y kafka.

Spring Cloud Config Server

Al igual que hemos hecho en el cliente, tenemos que activar la configuración en el servidor, para ello añadimos la configuración con kafka.

  cloud:
    bus:
      enabled: true
    kafka:
      bootstrap-servers: ${KAFKA_ADDR:http://localhost:9092}

Hay configuración adicional que se podrá ver completo en el ejemplo. Aquí hemos activado Spring Cloud Bus y kafka.

GitHub Webhook

Toda la configuración tanto de la parte cliente como servidora la tenemos finalizada.

Cada vez que se produzca un cambio un mensaje a nuestra cola de kafka será enviado. El cliente escuchará el mensaje y actualizará su configuración.

Tan solo nos faltaría, ya que estamos usando github, crear un webhook, para que el servidor sea consciente de que algo ha cambiado.

Para ello en nuestro Github, vamos a settings y a Webhook y pulsamos. Hay que añadir el payload url que es nuestro endpoint /monitor (ver más arriba) y cambiar el content type a application/json. Finalmente dejar el secret vació y pulsar añadir.

Ahora cada cambio será notificado al endpoint /monitor, proporcionado por la dependencia Spring-cloud-config-monitor. Lo único que habrá que tener en cuenta que la IP que escribas tiene que ser alcanzable. Por ejemplo: http://root:s3cr3t@REMOTE_IP:8888/monitor

Conclusión

La externalización de propiedades en una arquitectura de microservicios, es de vital importancia para tener un único punto de control. Y si le añadimos la posibilidad de realizar cambios y autorefrescar las propiedades de nuestros microservicios con Spring Cloud Bus, estamos añadiendo simplicidad a nuestra arquitectura.

Si quieres ver el ejemplo completo de nuestro ejercicio de microservicios con Spring Cloud Bus, puedes mirarlo en nuestro Github.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!


No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.


Deja una respuesta

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