Spring Cloud: descubrimiento de servicios con Eureka

    Visi贸n general

    En este art铆culo, nos presentaremos al descubrimiento de servicios del lado del cliente y al equilibrio de carga a trav茅s de Spring Cloud Netflix Eureka.

    En una arquitectura de microservicio t铆pica, tenemos muchas aplicaciones peque帽as implementadas por separado y, a menudo, necesitan comunicarse entre s铆. Espec铆ficamente, cuando decimos servicio al cliente, nos referimos a un servicio que necesita realizar llamadas REST a alg煤n otro servicio final.

    El problema en este tipo de arquitectura es c贸mo el servicio al 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 tiempo y requiere mucho tiempo codificarlos cuando hay una cantidad incierta de ellos y cuando sus ubicaciones pueden cambiar.

    Para aumentar a煤n m谩s la complejidad, los servicios podr铆an tener varias instancias de s铆 mismos (seg煤n la carga). Qu茅 instancia realmente servir谩 para la respuesta podr铆a ser un desaf铆o, ya que queremos tener una distribuci贸n de carga equitativa.

    Netflix Eureka

    Netflix Eureka es un servidor de b煤squeda (tambi茅n llamado registro). Todos los microservicios del cl煤ster se registran 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 comprender este concepto, crearemos tres servicios en nuestro ejemplo:

    • Servidor Eureka: act煤a como un registro de servicios.
    • Servicio de cine: un servicio REST simple que proporciona informaci贸n sobre pel铆culas.
    • Servicio de recomendaci贸n: un servicio REST simple pero que llama internamente al Movie Service para completar sus solicitudes.

    Configuraci贸n del servidor Eureka

    La mejor manera de comenzar con un proyecto esqueleto es usar Spring Initializr. Seleccione su versi贸n preferida de Spring Boot y agregue la dependencia “Eureka Server” y genere como un proyecto Maven:

    Para crear un servidor Eureka, todo lo que necesitamos hacer es agregar el @EnableEurekaServer anotaci贸n a nuestra clase principal:

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    

    Ejecutaremos el servidor en el puerto 8761, que es el puerto recomendado por el equipo de Spring. Entonces en application.properties agregaremos:

    server.port = 8761
    

    Para probar este punto final, navegue en su navegador hasta http: // localhost: 8761 /:

    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 Maven:

    Para convertirlo en un cliente, todo lo que tenemos que hacer es agregar el @EnableEurekaClient anotaci贸n a nivel de clase:

    @SpringBootApplication
    @EnableEurekaClient
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    Como alternativa, podr铆amos utilizar el @EnableDiscoveryClient anotaci贸n, que proviene de spring-cloud-commons. Elige la implementaci贸n (Consul, Zookeeper, Eureka) de acuerdo con la ruta de clase. En nuestro caso, autom谩ticamente elegir铆a Eureka.

    Con eso fuera del camino, podemos definir nuestro Movie modelo:

    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);
        }
    }
    

    Arriba, creamos un punto final simple que devuelve una lista de Movie objetos, simulando una llamada a una base de datos.

    Tenemos el Eureka Discovery jar de cliente en este proyecto. Al ver esto en la ruta de clases, 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 necesitamos especificar el nombre de la aplicaci贸n. Ser谩 este nombre el que utilizar谩n otros servicios para realizar llamadas REST.

    Con eso, hemos registrado nuestro servicio en el servidor, y cualquier otro servicio registrado puede llamarlo usando spring.application.name.

    Actualicemos el punto final del servidor Eureka:

    Junto con el registro con el servidor Eureka, el jar del cliente Eureka tambi茅n env铆a latidos peri贸dicos al servidor Eureka para informarle que todav铆a est谩 disponible.

    Configuraci贸n del servicio de cliente (servicio de recomendaci贸n)

    Ahora construyamos nuestro servicio al cliente que llamar谩 movie-service. Una vez m谩s, creemos un nuevo proyecto con Spring Initializr con las mismas dependencias que antes:

    En su application.properties nuevamente 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 RestTemplate frijol y marcarlo como @LoadBalanced. Esto le dice a Spring que queremos aprovechar el equilibrio de carga del lado del cliente, que en este caso lo hace Cinta.

    El equilibrio de carga del lado del cliente decide a qu茅 instancia (en caso de que se ejecuten varios servicios finales en el cl煤ster al que el cliente puede llamar) llamar.

    Ribbon fue desarrollado por Netflix y luego de c贸digo abierto. Su dependencia viene autom谩ticamente con la dependencia de Eureka Discovery. Se integra autom谩ticamente con Spring y distribuye cargas seg煤n el estado del servidor, el rendimiento, la regi贸n, etc.

    No se nos pedir谩 que usemos Ribbon directamente, ya que se integra autom谩ticamente RestTemplate, Zuul, Fingir, etc. Usando @LoadBalanced nosotros hicimos RestTemplate cinta consciente.

    Vamos a escribir RecommendationController clase que llama internamente 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, nosotros @Autowired la cinta habilitada RestTemplate y util铆celo para llamar al movie-service. Tenga 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 hicimos una llamada de REST al movie-service de esta manera (en lugar de proporcionar un nombre de host y un puerto), sustituye las URL de los extremos reales de la lista almacenada previamente y luego realiza la llamada REST.

    Por supuesto, la lista de servicio 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 en absoluto y todas estas cosas son manejadas por Spring internamente.

    Probemos el punto final de recomendaci贸n, navegue en su navegador (o usemos curl, cartero, etc.) para http: // localhost: 8050 / recomendaciones, ver谩 una respuesta similar a:

    Conclusi贸n

    En este art铆culo, hemos cubierto c贸mo usar Spring Cloud Eureka para el descubrimiento de servicios en el entorno de microservicios / nube. Creamos dos servicios REST simples que se comunican entre s铆 sin codificar ning煤n nombre de host / puerto mientras se realizan llamadas REST.

    Como siempre, el c贸digo de los ejemplos utilizados en este art铆culo se puede encontrar en Github.

    Etiquetas:

    Deja una respuesta

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