Explorando el nuevo Spring Cloud Gateway

1. Información general

En este artículo, exploraremos las características principales del proyecto Spring Cloud Gateway, una nueva API basada en Spring 5, Spring Boot 2 y Project Reactor.

La herramienta proporciona mecanismos de enrutamiento listos para usar que a menudo se utilizan en aplicaciones de microservicios como una forma de ocultar múltiples servicios detrás de una sola fachada.

Para obtener una explicación del patrón Gateway sin el proyecto Spring Cloud Gateway, consulte nuestro artículo anterior.

2. Controlador de enrutamiento

Al centrarse en las solicitudes de enrutamiento, Spring Cloud Gateway reenvía las solicitudes a un Mapeo de controlador de puerta de enlace, que determina qué se debe hacer con las solicitudes que coinciden con una ruta específica.

Comencemos con un ejemplo rápido de cómo el controlador de puerta de enlace resuelve las configuraciones de ruta usando RouteLocator:

@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("r1", r -> r.host("**.baeldung.com") .and() .path("/baeldung") .uri("//baeldung.com")) .route(r -> r.host("**.baeldung.com") .and() .path("/myOtherRouting") .filters(f -> f.prefixPath("/myPrefix")) .uri("//othersite.com") .id("myOtherID")) .build(); }

Observe cómo hicimos uso de los componentes principales de esta API:

  • Ruta: la API principal de la puerta de enlace. Está definido por una identificación (ID) dada, un destino (URI) y un conjunto de predicados y filtros.
  • Predicado - un Java de 8 predicado - que se utiliza para hacer coincidir las solicitudes HTTP usando encabezados, métodos o parámetros
  • Filtro: un WebFilter estándar de Spring

3. Enrutamiento dinámico

Al igual que Zuul, Spring Cloud Gateway proporciona medios para enrutar solicitudes a diferentes servicios.

La configuración de enrutamiento se puede crear usando Java puro ( RouteLocator , como se muestra en el ejemplo en la sección 2.1) o usando la configuración de propiedades:

spring: application: name: gateway-service cloud: gateway: routes: - id: baeldung uri: baeldung.com - id: myOtherRouting uri: localhost:9999

4. Fábricas de enrutamiento

Spring Cloud Gateway coincide con las rutas que utilizan la infraestructura Spring WebFlux HandlerMapping .

También incluye muchas fábricas de predicados de ruta incorporadas. Todos estos predicados coinciden con diferentes atributos de la solicitud HTTP. Se pueden combinar varias fábricas de predicados de ruta mediante el "y" lógico.

La coincidencia de rutas se puede aplicar tanto mediante programación como mediante un archivo de propiedades de configuración utilizando un tipo diferente de fábricas de predicados de ruta.

Nuestro artículo Spring Cloud Gateway Routing Predicate Factories explora las fábricas de enrutamiento con más detalle.

5. WebFilter Factories

Los filtros de ruta hacen posible la modificación de la solicitud HTTP entrante o la respuesta HTTP saliente.

Spring Cloud Gateway incluye muchas WebFilter Factories integradas, así como la posibilidad de crear filtros personalizados.

Nuestro artículo Spring Cloud Gateway WebFilter Factories explora las fábricas de WebFilter con más detalle.

6. Soporte de Spring Cloud DiscoveryClient

Spring Cloud Gateway se puede integrar fácilmente con bibliotecas de registro y descubrimiento de servicios, como Eureka Server y Consul:

@Configuration @EnableDiscoveryClient public class GatewayDiscoveryConfiguration { @Bean public DiscoveryClientRouteDefinitionLocator discoveryClientRouteLocator(DiscoveryClient discoveryClient) { return new DiscoveryClientRouteDefinitionLocator(discoveryClient); } }

6.1. LoadBalancerClient Filter

Los LoadBalancerClientFilter miradas para un URI en la propiedad de atributo de cambio usando ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.

Si la URL tiene un esquema lb (por ejemplo, lb: // baeldung-service) , usará Spring Cloud LoadBalancerClient para resolver el nombre (es decir, baeldung-service) en un host y puerto reales.

La URL original sin modificar se coloca en el atributo ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR .

7. Seguimiento

Spring Cloud Gateway hace uso de Actuator API, una conocida biblioteca Spring-Boot que proporciona varios servicios listos para usar para monitorear la aplicación.

Una vez que la API del actuador está instalada y configurada, las funciones de supervisión de la puerta de enlace se pueden visualizar accediendo a / gateway / endpoint.

8. Implementación

Ahora crearemos un ejemplo simple del uso de Spring Cloud Gateway como un servidor proxy usando el predicado de ruta .

8.1. Dependencias

Spring Cloud Gateway se encuentra actualmente en el repositorio de hitos, en la versión 2.0.0.RC2. Esta es también la versión que estamos usando aquí.

Para agregar el proyecto, usaremos el sistema de administración de dependencias:

   org.springframework.cloud spring-cloud-gateway 2.0.0.RC2 pom import   

A continuación, agregaremos las dependencias necesarias:

 org.springframework.boot spring-boot-actuator   org.springframework.boot spring-boot-starter-webflux   org.springframework.cloud spring-cloud-starter-gateway  

8.2. Implementación de código

Y ahora creamos una configuración de enrutamiento simple en el archivo application.yml :

spring: cloud: gateway: routes: - id: baeldung_route uri: //baeldung.com predicates: - Path=/baeldung/ management: endpoints: web: exposure: include: "*' 

Y el código de la aplicación Gateway:

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

Una vez iniciada la aplicación, podemos acceder a la url: “// localhost / actuator / gateway / route / baeldung_route” para verificar toda la configuración de enrutamiento creada:

{ "id":"baeldung_route", "predicates":[{ "name":"Path", "args":{"_genkey_0":"/baeldung"} }], "filters":[], "uri":"//baeldung.com", "order":0 }

Vemos que la URL relativa: "/ baeldung" está configurada como una ruta,así que presionando la url “// localhost / baeldung” seremos redirigidos a “ //baeldung.com ”, como se configuró en nuestro ejemplo.

9. Conclusión

En este artículo, exploramos algunas de las características y componentes que forman parte de Spring Cloud Gateway. Esta nueva API proporciona herramientas listas para usar para el soporte de gateway y proxy.

Los ejemplos presentados aquí se pueden encontrar en nuestro repositorio de GitHub.