Spring Cloud: enrutamiento con Zuul y Gateway

    Visi贸n general

    En este art铆culo, le presentaremos c贸mo enrutar sus aplicaciones a trav茅s de Zuul de Netflix y Spring Cloud Gateway.

    En una arquitectura de microservicio t铆pica, tenemos muchas aplicaciones peque帽as que se ejecutan en diferentes hosts y puertos. El problema en este tipo de arquitectura es c贸mo los clientes (aplicaciones web en navegadores, aplicaciones m贸viles, aplicaciones de terceros que realizan una llamada de servicio web, etc.) pueden acceder a estos microservicios finales sin conocer sus hosts y puertos. Por ejemplo, el navegador restringe las llamadas a diferentes dominios (tambi茅n conocido como CORS).

    Lo que necesitamos es un punto de entrada com煤n a nuestros microservicios. Con esto, no solo liberamos a los clientes de conocer los detalles de implementaci贸n de todos los servicios de backend, sino que tambi茅n reducimos el esfuerzo de desarrollo en el lado del servidor. Al mismo tiempo, si un microservicio final tiene varias instancias en ejecuci贸n, podemos realizar el equilibrio de carga en este punto de entrada.

    Adem谩s, tambi茅n podemos escribir todos los mecanismos de autenticaci贸n y autorizaci贸n en este nivel. Esto reduce el desarrollo significativo en el lado de los microservicios finales.

    Servidores perimetrales

    Para resolver este problema, Netflix cre贸 el servidor Zuul y luego lo abri贸. Spring proporcion贸 un envoltorio agradable a su alrededor para incorporarlo f谩cilmente a la pila de Spring.

    Nota: Netflix lanzado recientemente Zuul 2, pero Spring a煤n no lo ha agregado a su ecosistema. Por eso usaremos Zuul 1 en este art铆culo.

    Spring tambi茅n lanz贸 su propio enrutador llamado Spring Cloud Gateway. Tiene API sin bloqueo y admite conexiones de larga duraci贸n como WebSockets.

    Analizaremos ambas soluciones en este art铆culo. El diagrama de arquitectura se ve as铆:

    Preparar

    Este art铆culo asume que ya tiene conocimiento del proyecto Eureka de Netflix, que se usa como registro de servicios y para balanceo de carga. Tenemos la siguiente configuraci贸n para el servicio de backend:

    • Servidor Eureka: Act煤a como un registro de servicios y se ejecuta en el puerto 8761.
    • Servicio al usuario: Un servicio REST simple que tiene un 煤nico punto final de /getPublicAddress y corriendo en el puerto 8100.
    • Servicio de producto: Un servicio REST simple que tiene un 煤nico punto final de /categories y corriendo en el puerto 8200.

    Netflix Zuul

    La mejor manera de comenzar con un proyecto esqueleto es usar Spring Initializr. Seleccione su versi贸n preferida de Spring Boot y agregue las dependencias “Zuul” y “Eureka Discovery”, y genere como un proyecto Maven:

    Para convertirlo en un servidor proxy Zuul, todo lo que tenemos que hacer es agregar el @EnableZuulProxy anotaci贸n a nuestra clase principal:

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

    Ejecutaremos el servidor Zuul en el puerto 8050 y tambi茅n necesita registrarse en el servidor de Eureka. Entonces en application.properties agregaremos lo siguiente:

    server.port=8050
    
    spring.application.name=zuul-edge-server
      
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    

    Iniciemos este servidor y naveguemos con su navegador hasta el servidor Eureka en http: // localhost: 8761 /:

    Ahora que Zuul se ha registrado con Eureka, probemos el enrutamiento a nuestro servicio de usuario a trav茅s de 茅l navegando el navegador a la http: // localhost: 8050 / user-service / getPublicAddress punto final:

    Del mismo modo, para el producto-servicio, navegue su navegador para http: // localhost: 8050 / producto-servicio / categor铆as:

    Como puede ver, estamos llamando a los servicios de backend a trav茅s de Zuul. De forma predeterminada, los ID de cliente de Eureka pasan a formar parte de los URI. Por ejemplo, aqu铆 hicimos una llamada a Zuul usando /product-service/categories. Zuul comprobar谩 si hay alg煤n servicio registrado como product-service en Eureka. Si est谩 all铆, obtendr谩 la URL del servicio y agregar谩 la parte de URL original restante, /categories a 茅l y hacer la llamada.

    Adem谩s, Zuul es Cinta consciente, por lo que autom谩ticamente equilibrar谩 la carga de la llamada si hay varias instancias del servicio backend en ejecuci贸n.

    Los valores predeterminados pueden, por supuesto, cambiarse ajustando el archivo de propiedades, que se puede encontrar aqu铆. Tampoco es necesario que todos los servicios de backend est茅n registrados en Eureka. Tambi茅n podemos enrutarnos a otros dominios.

    Spring Cloud Gateway

    Veamos otro servidor de borde popular llamado Spring Cloud Gateway, que se basa en Spring Framework 5, Project Reactor y Spring Boot 2.0. Una vez m谩s, creemos un nuevo proyecto con Spring Initializr. Seleccione su versi贸n preferida de Spring Boot y agregue las dependencias “Gateway” y “Eureka Discovery”, y genere como un proyecto Maven:

    Ejecutaremos el servidor Zuul en el puerto 8060 y tambi茅n necesita registrarse en el servidor de Eureka. Entonces en application.properties agregaremos:

    server.port=8060
    
    spring.application.name=gateway-edge-server
      
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    
    spring.cloud.gateway.discovery.locator.enabled=true
    spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true
    

    A diferencia de Zuul, Spring Cloud Gateway no busca autom谩ticamente en Eureka el enrutamiento de llamadas. As铆 que lo habilitamos agregando un par de propiedades adicionales.

    Iniciemos este servidor y naveguemos con su navegador hasta el servidor Eureka en http: // localhost: 8761 /:

    Al igual que en el ejemplo anterior, podemos probar nuestro enrutamiento al servicio de usuario y servicio de producto navegando nuestro navegador a http: // localhost: 8060 / user-service / getPublicAddress y http: // localhost: 8060 / product-service / categor铆as, respectivamente.

    Al igual que Zuul, Spring Cloud Gateway busca un servicio en Eureka mediante la primera variable de ruta. Otras formas de cambiar el valor predeterminado se encuentran en su documentaci贸n, que se puede encontrar aqu铆.

    Conclusi贸n

    En este art铆culo, hemos cubierto c贸mo usar Spring Cloud Zuul y Gateway para enrutar el tr谩fico a microservicios de back-end. Creamos dos servicios REST simples que se registraron con el servidor Eureka. Luego creamos el servidor Zuul que tambi茅n se registr贸 con Eureka y luego enruta el tr谩fico basado en 茅l. Luego vimos un enfoque alternativo con Spring Cloud Gateway.

    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 *