Spring Boot Eureka (Netflix) Discovery Server - Microservicios/Microservices

En la arquitectura de Microservices o Microservicios, se define cada servicio como una unidad de procesamiento de una sola tarea simple y que se puedan comunicar con otros microservicios; básicamente siguiendo el mismo paradigma del sistema operativo unix (procesos que realicen una sola tarea simple, pero que la realicen bien y que se pueda comunicar con otros procesos iguales).

Dicho lo anterior, cada microservicio debe realizar una tarea simple y debe ser posible descubrir otros microservicios y ser descubierto por otros. Para lo anterior han salido unos cuantos servicios como Eureka, que escribió el equipo de Netflix para el balanceo de cargas y tolerancia a fallos en sus sistemas; afortunadamente para nosotros liberaron ese proyecto como Open Source y ahora lo podemos utilizar para descubrir servicios en la nube.

 

- Prerequisitos

Estar familiarizado con la construcción de proyectos simples con Spring Boot - Initializr

Un microservicio que se dedique a administrar la configuración en la nube.

* Spring Boot - Servicio de configuracion en la nube (github o svn) / Spring Cloud Config Server

Un microservicio que consulte productos (a construir)

Servidor Eureka para descubrir el microservicios de productos (a construir); Eureka de Netflix?

 

Servidor Eureka

- Generar el proyecto simple con Spring Boot Initializr

* spring-cloud-starter-config

* spring-cloud-starter-eureka-server

 

1. Configuración Maven

<groupId>com.ledzedev</groupId>
<artifactId>ledzedev-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ledzedev-eureka-server</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

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

2. Properties de configuración.

Eliminar el archivo application.properties y crear uno nuevo que se llame bootstrap.properties (también puedes simplemente renombrarlo y listo). Por convención el archivo se debe llamar bootstrap.properties.

spring.application.name=eureka-service #agregamos el id del servidor, así buscará su configuración
spring.cloud.config.uri=http://localhost:8888 #asumimos que el servidor de configuración se levantó en el puerto 8888 (por convención ahí se levantan los servicios de configuración).

 

3. Código Java

Simplemente agregamos a la clase principal la anotación @EnableEurekaServer, para habilitar el servicio.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 24/Nov/2016.
*/
@SpringBootApplication
@EnableEurekaServer
public class LedzedevEurekaServerApplication {


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

 

4. Levantando Eureka.

NOTA: En este momento ya debe estar levantado el Spring Boot - Servicio de configuracion en la nube (github o svn) / Spring Cloud Config Server

Ejecutamos la clase principal LedzedevEurekaServerApplication, comprobamos que levanta correctamente y que la herramienta está expuesta en su propio servidor.

 

 

Microservicio de consulta de productos

- Generar el proyecto simple con Spring Boot Initializr

* spring-cloud-starter-config

* spring-cloud-starter-eureka-server

* spring-boot-starter-actuator

* spring-cloud-starter-eureka

* spring-boot-starter-data-jpa

* spring-boot-starter-data-rest

* spring-boot-starter-web

* h2

1. Configuración Maven.

<groupId>com.ledzedev.demo</groupId>
<artifactId>ledzedev-microservice-spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ledzedev-microservice-spring-cloud</name>
<description>Proyecto demo de un micro servicio con jpa, datarest, RESTful, Spring cloud config server y Eureka</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

2. Properties de configuración

Eliminar el archivo application.properties y crear uno nuevo que se llame bootstrap.properties (también puedes simplemente renombrarlo y listo). Por convención el archivo se debe llamar bootstrap.properties.

spring.application.name=producto-service
spring.cloud.config.uri=http://localhost:8888

3. Código Java

* Agregamos la entidad de Productos

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 24/Nov/2016.
*/
@Entity
public class Producto {


@Id
@GeneratedValue
private Long id;


private String nombreProducto;

private Long cantidadExistente;

public Producto(String nombreProducto, Long cantidadExistente) {
this.nombreProducto = nombreProducto;
this.cantidadExistente = cantidadExistente;
}

public Producto() {//nadie sabe por qué, pero es requisito de JPA
}


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getNombreProducto() {
return nombreProducto;
}

public void setNombreProducto(String nombreProducto) {
this.nombreProducto = nombreProducto;
}

public Long getCantidadExistente() {
return cantidadExistente;
}

public void setCantidadExistente(Long cantidadExistente) {
this.cantidadExistente = cantidadExistente;
}

@Override
public String toString() {

return "Producto{" +
"id=" + id +
", nombreProducto='" + nombreProducto + '\'' +
", cantidadExistente=" + cantidadExistente +
'}';
}
}

* Agregamos la interfaz que hable con la BD (h2 para el ejemplo pero puede ser cualquier otro manejador soportado por Spring)

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 16/Nov/2016.
*/
@RepositoryRestResource
public interface RepositorioProductosDB extends JpaRepository<Producto, Long> {

@RestResource(path = "by-np")
Collection<Producto> findByNombreProducto(@Param("np") String nombreProd);

}

* Anotamos la clase principal como cliente de Eureka con @EnableEurekaClient y le agregamos una carga inicial de productos a la BD.

/**
* Código generado por Gerado Pucheta Figueroa
* Twitter: @ledzedev
* http://ledze.mx
* 24/Nov/2016.
*/
@EnableEurekaClient
@SpringBootApplication
public class LedzedevMicroserviceSpringCloudApplication {


private static final Logger log = LoggerFactory.getLogger(LedzedevMicroserviceSpringCloudApplication.class);

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

@Bean
CommandLineRunner runner(RepositorioProductosDB db){

return args -> {
Arrays.asList(
new Producto("Queso Oaxaca", 50L),
new Producto("Queso Cotija", 4L),
new Producto("Queso Panela", 20L),
new Producto("Crema entera", 10L),
new Producto("Crema deslactosada", 18L),
new Producto("Gelatina", 7L),
new Producto("Yakult", 80L),
new Producto("Refresco", 12L)
)
.forEach(db::save);
log.info("Carga inicial terminada.");
};
}
}

4. Levantando el microservicio de consulta de productos

NOTA: En este momento ya debe estar levantado el Spring Boot - Servicio de configuracion en la nube (github o svn) / Spring Cloud Config Server

Ejecutamos la clase principal LedzedevMicroserviceSpringCloudApplication, comprobamos que levanta correctamente y que el servicio de consulta está expuesto en la red.

 

 

CONCLUYENDO

El servidor de Eureka registra automáticamente en la nube la aplicación con el Id dado en configuración, en este caso PRODUCTO-SERVICE. Esto hace nuestro microservicio en estado "descubrible", por lo que otros microservicios se podrán comunicar sin problemas para realizar una consulta de productos.

 

Al refrescar nuestra herramienta de Eureka, podemos observar que hay actualmente una instancia que se llama PRODUCTO-SERVICE que corresponde con el microservicio que acabamos de crear.

 

Te puedes descargar mi código directamente del repositorio:

Ledzedev Eureka Server     ->     github / formato zip

Ledzedev Microservicio Consulta de Productos     ->     github / formato zip

 

Artículos Relacionados

- Spring Boot Microservicio Proxy

- Spring Boot Microservicio Gateway