Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Spring Cloud: Descubrimiento de servicios con Eureka

Visión general

En este artículo, conoceremos el descubrimiento de servicios del lado del cliente y el equilibrio de carga a través de Spring Cloud Netflix Eureka .
En una arquitectura de microservicio típica, tenemos muchas pequeñas aplicaciones implementadas por separado y, a menudo, necesitan comunicarse entre sí. Específicamente, cuando decimos servicio al cliente , nos referimos a un servicio que necesita hacer llamadas REST a otro servicio final.
El problema en este tipo de arquitectura es cómo el servicio del cliente encuentra todos sus servicios finales. Podríamos codificar el nombre de host / puerto en algún archivo de propiedad, pero esto no siempre es práctico o factible en un entorno de nube. Podría haber cualquier cantidad de microservicios, y es una tarea difícil consumir tiempo y recursos cuando hay una cantidad incierta de ellos y cuando sus ubicaciones pueden cambiar.
Para aumentar aún más la complejidad, los servicios pueden tener múltiples instancias de ellos mismos (según la carga). La instancia que realmente sirva para la respuesta podría ser un desafío, ya que queremos tener una distribución de carga igual.

Netflix Eureka

Netflix Eureka es un servidor de búsqueda (también llamado registro). Todos los microservicios en el clúster se registran ellos mismos en este servidor.
Al realizar una llamada REST a otro servicio, en lugar de proporcionar un nombre de host y un puerto, solo proporcionan el nombre del servicio.
El enrutamiento real se realiza en tiempo de ejecución junto con la distribución equitativa de la carga entre los servicios finales. Hay otros clientes de descubrimiento de servicios como Cónsul , Zookeeper, etc., pero usaremos Eureka en este artículo.
Para entender este concepto, estaremos construyendo tres servicios en nuestro ejemplo:
  • Eureka Server : actúa como un registro de servicios.
  • Servicio de películas : un servicio REST simple que proporciona información de películas.
  • Servicio de recomendaciones : un servicio REST simple, pero llama internamente al Servicio de películas para completar sus solicitudes.

Configuración del servidor Eureka

La mejor manera de comenzar con un proyecto de esqueleto es usar Spring Initializr . Seleccione su versión preferida de Spring Boot y agregue la dependencia del "Servidor Eureka" y genérela como un proyecto de Maven:
spring-eureka-spring-initializer
Para hacer un servidor Eureka, todo lo que tenemos que hacer es agregar la @EnableEurekaServeranotación a nuestra clase principal:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {  
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
Estaremos ejecutando el servidor en el puerto 8761, que es el puerto recomendado por el equipo de Spring. Así que en application.propertiesañadiremos:
server.port = 8761  
Para probar este punto final, navegue su navegador a http: // localhost: 8761 / :
spring-eureka-server-display

Finalizar la configuración del servicio (Servicio de películas)

Nuevamente, estamos usando Spring Initializr para crear nuestro proyecto. Seleccione su versión preferida de Spring Boot y agregue las dependencias "Web" y "Eureka Discovery" y genere como un proyecto de Maven:
spring-eureka-movie-service-init
Para que esto sea un cliente, todo lo que tenemos que hacer es agregar la @EnableEurekaClientanotación en el nivel de clase:
@SpringBootApplication
@EnableEurekaClient
public class Application {  
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Como alternativa, podríamos usar la @EnableDiscoveryClientanotación, que viene de spring-cloud-commonsSelecciona la implementación (Cónsul, Guardián del zoológico, Eureka) de acuerdo con el classpath. En nuestro caso, elegiría automáticamente a Eureka.
Con eso fuera del camino, podemos definir nuestro Moviemodelo:
public class Movie {  
    private Integer id;

    private String name;

    private String synopsis;

    // getters and setters
}
Y finalmente, podemos definir un controlador:
@RestController
public class MovieController {

    private static List<Movie> movieList = new ArrayList<>();
    static {
        movieList.add(new Movie(1, "movie-1", "summary-1"));
        movieList.add(new Movie(2, "movie-2", "summary-2"));
        movieList.add(new Movie(3, "movie-3", "summary-3"));
    }

    @GetMapping("/movies")
    public ResponseEntity<?> getMovies() {
        return ResponseEntity.ok(movieList);
    }
}
Anteriormente, creamos un punto final simple que devuelve una lista de Movieobjetos, simulando una llamada a una base de datos.
Tenemos la Eureka Discoveryjarra del cliente en este proyecto. Al ver esto en el classpath, Spring intentará encontrar un servidor Spring Eureka en ejecución. Necesitamos especificar esto en el application.properties:
server.port = 8060  
spring.application.name = movie-service  
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/  
Además de especificar la URL del servidor, también debemos especificar el nombre de la aplicación. Será este nombre que otro servicio usará para hacer llamadas REST.
Con eso, hemos registrado nuestro servicio en el servidor, y cualquier otro servicio registrado puede usarlo spring.application.name.
Vamos a actualizar el punto final del servidor Eureka:
spring-eureka-movie-service-registers
Junto con el registro con el servidor Eureka, el contenedor del cliente Eureka también envía latidos periódicos al servidor Eureka para avisarle que todavía está disponible.

Configuración del servicio al cliente (Servicio de recomendación)

Ahora vamos a construir nuestro servicio al cliente que llamará movie-serviceUna vez más, vamos a crear un nuevo proyecto con Spring Initializr con las mismas dependencias que antes:
primavera-eureka-recomendación-servicio-init
En su application.propertiesnuevo tenemos que especificar el nombre de la aplicación y los detalles de Eureka:
server.port = 8050  
spring.application.name = recommendation-service  
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/  
Luego anotamos la clase principal con @EnableEurekaClient:
@SpringBootApplication
@EnableEurekaClient
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
También necesitamos crear un RestTemplatebean y marcarlo como @LoadBalancedEsto le indica a Spring que queremos aprovechar el equilibrio de carga del lado del cliente, que en este caso se realiza mediante Ribbon .
El equilibrio de carga del lado del cliente decide a qué instancia (en caso de que se ejecuten varios servicios de extremo en el clúster al que el cliente puede llamar) llamar.
La cinta de opciones fue desarrollada por Netflix y posteriormente fue de código abierto. Su dependencia viene automáticamente con la dependencia de Eureka Discovery. Se integra automáticamente con Spring y distribuye las cargas según el estado del servidor, el rendimiento, la región, etc.
No se nos pedirá que utilicen la cinta directamente, ya que se integra automáticamente RestTemplateZuul , Feign , etc. Usando @LoadBalancedesto hicimos que la RestTemplatecinta sea consciente.
Escribamos una RecommendationControllerclase que internamente llama a nuestro servicio de películas:
@RestController
public class RecommendationController {  
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/recommendations", method = RequestMethod.GET)
    @ResponseBody
    public Movie[] recommendations() {
        Movie[] result = restTemplate.getForObject("http://movie-service/movies", Movie[].class);
        return result;
    }
}
Arriba, tenemos @Autowiredla cinta habilitada RestTemplatey la usamos para llamar a la movie-serviceTenga en cuenta que no tenemos que especificar el nombre de host o el puerto en ninguna parte.
Lo que Spring hace internamente aquí es porque está registrado con el servidor Eureka, almacena la lista de todos los servicios y sus instancias en ejecución localmente. Cuando realizamos una llamada REST a la movie-servicesiguiente (en lugar de proporcionar un nombre de host y un puerto), sustituye las URL de punto final reales de la lista almacenada anteriormente y luego realiza la llamada REST.
Por supuesto, la lista de servicios almacenada junto con sus instancias en ejecución se actualiza periódicamente. La mejor parte de todo esto es que no tenemos que encargarnos de esto y Spring Man se encarga de todas estas cosas internamente.
Probemos el punto final de la recomendación, navegamos por su navegador (o usamos curl, cartero, etc.) a http: // localhost: 8050 / recomendaciones , verá una respuesta que se parece a algo como:
eureka-recomendación-servicio-resultado

Conclusión

En este artículo, hemos cubierto cómo utilizar Spring Cloud Eureka para el descubrimiento de servicios en el entorno de microservicio / nube. Creamos dos servicios REST simples que se comunican entre sí sin codificar de forma rígida ningún nombre de host / puerto al realizar llamadas REST.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas