Spring Cloud: Enrutamiento con Zuul y Gateway

En este artículo, le presentaremos cómo enrutar sus aplicaciones a través de Zuul y Spring Cloud Gateway de Netflix. En una arquitectura típica de microservicios tenemos...

Visión general

En este artículo, te presentaremos cómo enrutar tus aplicaciones a través de Zuul de Netflix y Puerta de enlace de la nube de primavera.

En una arquitectura típica de microservicios, 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. Al usar esto, no solo liberamos a los clientes de conocer los detalles de implementación sobre todos los servicios de back-end, 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 equilibrar la 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 un desarrollo significativo en el lado de los microservicios finales.

Servidores perimetrales {#servidores perimetrales}

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

Nota: Netflix lanzó recientemente Zuul 2, pero Spring aún no lo ha agregado a su ecosistema. Debido a esto, usaremos Zuul 1 en este artículo.

Spring también lanzó su propio enrutador llamado Spring Cloud Gateway. Tiene API que no bloquean y admite conexiones de larga duración como WebSockets.

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

spring-cloud-routing-with-zuul-gateway

Configuración

Este artículo asume que ya tienes conocimiento del Proyecto Eureka de Netflix, el cual se utiliza como registro de servicios y balanceo de carga . Tenemos la siguiente configuración para el servicio backend:

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

spring-cloud-routing-with-zuul-gateway-eureka-setup

Netflix Zuul

La mejor manera de comenzar con un proyecto básico 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:

spring-zuul-server-setup

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

1
2
3
4
5
6
7
8
@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 Eureka. Así que en application.properties agregaremos lo siguiente:

1
2
3
4
5
server.port=8050

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

Iniciemos este servidor y naveguemos su navegador al servidor Eureka en http://localhost:8761/:

spring-zuul-server-display

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 [http://localhost:8050/servicio-de-usuario/getPublicAddress](http:// localhost:8050/user-service/getPublicAddress) punto final:

spring-zuul-route-user-service

De igual forma, para el producto-servicio navegue en su navegador a http://localhost:8050/producto-servicio/categorías:

spring-zuul-route-product-service

Como puede ver, estamos llamando a los servicios de back-end 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 producto-servicio en Eureka. Si está allí, obtendrá la URL del servicio y agregará la parte restante de la URL original, /categories y realizará la llamada.

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

Por supuesto, los valores predeterminados se pueden cambiar ajustando el archivo de propiedades, que se puede encontrar aquí. Tampoco es necesario que todos los servicios backend estén registrados en Eureka. También podemos enrutar a otros dominios también.

Puerta de enlace de Spring Cloud

Veamos otro servidor de borde popular llamado Spring Cloud Gateway, que está construido sobre Spring Framework 5, proyecto 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:

spring-gateway-server-setup

Ejecutaremos el servidor Zuul en el puerto 8060 y también necesita registrarse en el servidor Eureka. Así que en application.properties agregaremos:

1
2
3
4
5
6
7
8
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. Entonces lo habilitamos agregando un par de propiedades adicionales.

Iniciemos este servidor y naveguemos su navegador al servidor Eureka en http://localhost:8761/:

spring-zuul-server-display

Similar al ejemplo anterior, podemos probar nuestro enrutamiento a servicio-usuario y servicio-producto navegando nuestro navegador a [http://localhost:8060/servicio-de-usuario/getPublicAddress](http://localhost:8060/ user-service/getPublicAddress) y http://localhost:8060/producto-servicio/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 están 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 los 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 en función de é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.