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 *