Ir al contenido principal

Destacado

Introducción a Axon Framework - Parte 1

Investigando sobre arquitecturas CQRS encontre el Axon Framework.  Te comparto mis apuntes en mi camino a aprender este framework.


¿Que es CQRS?
CQRS es una forma de crear sistemas de software que hace hincapié en separar la parte  que cambia el estado de la aplicación y la parte que consulta el estado de la aplicación. 

¿Que es el Framework Axon? Es un framework para implementar CQRS en Java. Se describe asi mismo como un framework que te permite construir aplicaciones escalables, extensibles y mantenibles; permitiendo a los desarrolladores aplicar el patrón arquitectónico Command Query Responsibility Segregation (CQRS). El cual nos da ciertos bloques importantes con sus implementaciones respectivas para crear estos sistemas como: agregados, repositorios y bus de eventos (el mecanismo de envío para eventos).  Estos últimos términos provienen del Domain Driven Design (DDD). 
En palabras simples: CQRS es escribir y leer en forma separada. 
En búsqueda de tener bajo acoplamiento, el tr…

Monitoreando tus micro servicios con Spring Boot Admin


Este nuevo joetip es para aquellos que tienen en su arquitectura algunos micro servicios desarrollados con spring boot y ya estan usando algunos proyectos de Spring Cloud como Spring Cloud Config y Spring Cloud Eureka como Discovery server

El Spring Boot Admin es un proyecto desarrollado por CodeCentric el cual esta disponible de forma gratuita en https://github.com/codecentric/spring-boot-admin para que podamos monitorear nuestros micro servicios. 

Para que dichos micro servicios puedan ser monitoreados tenemos 2 opciones:


  1. Colocando la dependencia de spring boot admin client en cada proyecto
  2. O configurando el Eureka (Consul o Zookeeper) para que a partir de este se pueda monitorear a los micro servicios que ya están registrados en el. 
Voy a explicar paso a paso lo que se tiene que hacer para trabajar con el spring boot admin en nuestro cluster de micro servicios. Pero, si eres impaciente y ya quieres probarlo, aquí te dejo el repositorio de github: https://github.com/joedayz/spring-boot-admin-cloud-finchley.   

Para mis demos usare los siguientes proyectos y las siguientes versiones:
  1. Spring Boot 2.0.1.RELEASE
  2. Spring Cloud Finchley.RC1
  3. Spring Boot Admin 2.0.2

Spring Cloud Config

En una arquitectura de micro servicios es muy común que la configuración este descentralizada de ellos mismos. Es decir, en lugar de tener la configuración a BD, SMTP, JPA, Seguridad en tu micro servicio junto con el código fuente o en otras palabras en el mismo JAR, esta se encuentra en un repositorio GIT externo de donde tus micro servicios la deben obtener al iniciar (startup) para que puedan ejecutarse sin problemas. 

En resumen:



El Spring Cloud Config es un proyecto de Spring Cloud que cumple esa función de brindar la configuración a los micro servicios vía http.

Crear un Spring Config Server

Para crear un servidor de configuración crearemos un proyecto spring boot desde cero con  https://start.spring.io/ con las siguientes dependencias.



Con dicho setup tendremos lo necesario para iniciar un servidor Spring Cloud Config. El siguiente paso es configurar las versiones de spring boot y spring cloud que describí al iniciar el articulo.



El código completo lo puedes ver en el pom.xml del config-server.

Luego en la clase Appliation habilitamos el rol de servidor de configuración con la anotación @EnableConfigServer.


Finalmente, pasamos a configurar el acceso al repositorio GIT desde el cual obtendremos los parámetros.  La ruta del application.yml que estará disponible para mis micro servicios estará en este link https://github.com/joedayz/spring-boot-admin-cloud-finchley/blob/master/ConfigData/application.yml.

Veamos la configuración:


Ejecutamos el proyecto y vemos si expone la data en formato json para cualquier micro servicio que lo solicite.

http://localhost:8001/application/default

La salida es la siguiente:


Si has llegado a este punto, felicitaciones, ya sabes como crear un Spring Cloud Config Server.


Spring Cloud Eureka

En una arquitectura de micro servicios con Spring Cloud tenemos el Servidor de Descubrimiento de Servicios (Discovery Server) quien tiene el registro de todos los micro servicios de tu arquitectura. El es que el sabe en que servidor, puerto, número de instancias del mismo, estado actual (UP o DOWN) se encuentra el micro servicio. Existen varios en el mercado, pero, nosotros vamos a usar el Eureka.

Los micro servicios en general se registran a si mismos en el Eureka. De eso hablaremos mas adelante.

Crear un Spring Cloud Eureka

Para crear un servidor Eureka usaremos https://start.spring.io/ para crear un proyecto Spring Boot con la siguiente configuración:


Con dicho setup tendremos lo necesario para iniciar un servidor Spring Cloud Eureka. El siguiente paso es configurar las versiones de spring boot y spring cloud que describí al iniciar el articulo.

El código completo lo puedes ver en el pom.xml del config-server. 

Para convertir a este proyecto en un servidor Eureka usamos esta anotación @EnableEurekaServer.


Luego, vamos a configurar al servidor con autenticación básica para que puedan entrar a él usando como usuario: eureka y password: password.


Finalmente para que esto funcione configuramos el application.yml de la siguiente manera:


El archivo lo pueden ver en este link.

Ejecutamos el proyecto y luego vamos a http://localhost:8010, luego de ingresar el usuario (eureka) y clave (password) obtendremos este resultado.


NOTA: Aquí se verán los micro servicios registrados. Ojo la recomendación es tener varios Eureka para tener alta disponibilidad, ya que de caerse el eureka, se vuelve inconsistente tu arquitectura. En este artículo por motivos didácticos solo estamos corriendo un único eureka.

Si llegaste a este punto, felicitaciones, ya sabes crear y ejecutar un Spring Cloud Eureka, el Discovery Server de tu arquitectura.

Ejemplo con arquitectura de Micro Servicios

Una arquitectura de micro servicios usa en general como fachada o entrada a tu cluster de micro servicios un gateway. Y es, por medio del gateway que accedemos a los micro servicios.


Por motivos didacticos, nosotros haremos una solución simple. El gateway mostrará una oración que es el resultado de invocar a micro servicios subject + verb + article + adjective + noun.


El resultado debe ser algo así:

Explicado el ejemplo de @kennyk65 que al final vamos a monitorear con Spring Boot Admin, pasamos a explicar como crear los micro servicios y el gateway, los cuales usaran el spring cloud config para obtener sus configuraciones e iniciar correctamente, así como también, registrarse ellos mismos en el Eureka (más adelante veremos porque esto es importante).


Micro Servicio

Requisitos: Antes de crear y ejecutar los micro servicios, asegurate de tener el Spring Cloud Config y Eureka ejecutandose.

Para crear los micro servicios: subject (nos devolverá sujetos), verb (nos devolverá verbos), article (nos devolverá articulos), adjective (nos devolverá adjetivos)  y noun (nos devolverá sustantivos) usamos la pagina https://start.spring.io/ con las siguientes dependencias:



Modificamos el archivo pom.xml con las versiones de spring boot y spring cloud que describimos al inicio del articulo. 

De ahí configuramos el proyecto Spring Boot para que se registre en el Discovery Server Eureka con la anotación @EnableDiscoveryClient.


La Clase para modelar cada palabra es de la siguiente manera:


package demo;

/**
 * 'Word' object is nicely represented in JSON over a regular String.
 */
public class Word {

 public String word;

 public Word() {
  super();
 } 
 
 public Word(String word) {
  this();
  this.word = word;
 }

 public String getWord() {
  return word;
 }

 public void setWord(String word) {
  this.word = word;
 }
 
 
}


El Micro servicio al ser invocado vía REST devolverá una palabra según sea el profile activo (subject , verb, article, adjective, noun). Para ello tendrá que obtener una serie de palabras o alternativas que se asignarán al String words desde el Spring Cloud Config con @Value("${words}").




Pero, como se logra todo eso, pues, con la configuración que encontraremos en application.yml y bootstrap.yml del proyecto.

application.yml

Es necesario tener la referencia a words así no sea la fuente real, sino,  la aplicación fallará. Recordemos que será el spring cloud config el que nos dará la lista real de words según el profile que este activo. 


bootstrap.yml

Esta es la configuración clave, la que nos permitirá trabajar con el Spring Cloud Config (el URI) para obtener las palabras, con que service ID se registrará en Eureka y el nombre del micro servicio  y profiles disponibles con el cual podemos ejecutarlo. 

Si observamos ahí se configura lo descrito anteriormente. 

Para poder ejecutar los micro servicios con distintos profiles. Se tiene el siguiente shell para correr el micro servicio como subject, verb, article, adjective y noun.


Si revisamos el Eureka veremos todos los micro servicios levantados. 


Si llegaste a este punto ya tiene 5 micro servicios ejecutandose y obtieniendo su configuración del Spring Cloud Config y registrados en el Eureka. Felicitaciones.

Gateway

Requisito para esta parte: Los micro servicios words en sus diferentes perfiles deben estar ejecutandose.

No es buena práctica permitir que el mundo exterior acceda a tus micro servicios directamente, no hay excepciones, aún así sean  APIs que van a exponer datos hacia afuera de tu sistema. Para ello la buena práctica es tener un Gateway. Para tener uno existe un proyecto denominado Spring Cloud Zuul el cual usaremos en esta demo que hace router y filter.

Para crearlo igualmente vamos a https://start.spring.io/ y creamos un proyecto Spring Boot con esta dependencia.


El pom.xml luego de hacer los cambios de versión queda así.

Convertimos este proyecto con Spring Boot en Gateway con la anotación @EnableZuulProxy.


En el proyecto iremos a una vista donde llamaremos a los micro servicios. Para ello basta un simple @Controller.


En la vista sentence.html con thymeleaf usaremos jquery para hacer las llamadas a los servicios de esta manera:


Y con Jquery llamar al servicio y colocar el resultado en el respectivo span.


Para que todo esto funcione, la magia nuevamente esta en el application.yml donde indicamos si deseamos permitir a thymeleaf hacer cache o no, así como el prefijo a utilizar cuando queramos llamar los microservicios /services/web por ejemplo.



y en el bootstrap.yml colocamos el nombre del micro servicio gateway y su asociación con el Spring Cloud Config.



Levantamos el Gateway y el resultado debe ser:

(Como puedes ver ya se esta llamando a los micro servicios)

Si llegaste a este punto felicitaciones, ya sabes crear un gateway.

Spring Boot Admin

Y llego el momento. En este punto dirás, y ¿a que hora a lo que vine?, mi plata. 



Luego de acomodar las versiones y dependencias el pom.xml queda  como en secciones anteriores.  

De la misma manera para convertir este proyecto spring boot en spring boot  admin usamos la anotación @EnableAdminServer.



Para brindarle algo de seguridad (autenticación HTTP básica) usaremos las credenciales: admin como usuario y clave password.


Finalmente en el application.yml hacemos la magia: Puerto donde se ejecutará, nombre de la aplicación, la seguridad http básica y su conexión con el Eureka.



Pasamos a ejecutar el proyecto.


(Login)



(Lista de Micro servicios)


(Panel de micro servicios)


(toda la información de tu micro servicio)

Si llegaste a este punto. Felicitaciones ya sabes ejecutar un spring boot admin.

Nos vemos luego con la versión en ingles.

Enjoy!

Joe





Calificación:

Comentarios