Het verkennen van de nieuwe Spring Cloud Gateway

1. Overzicht

In dit artikel zullen we de belangrijkste kenmerken van het Spring Cloud Gateway-project verkennen, een nieuwe API gebaseerd op Spring 5, Spring Boot 2 en Project Reactor.

De tool biedt kant-en-klare routeringsmechanismen die vaak worden gebruikt in microservicetoepassingen als een manier om meerdere services achter één gevel te verbergen.

Bekijk ons ​​vorige artikel voor een uitleg van het Gateway-patroon zonder het Spring Cloud Gateway-project.

2. Routing-handler

De Spring Cloud Gateway is gefocust op routeringsverzoeken en stuurt verzoeken door naar een Gateway Handler Mapping - die bepaalt wat er moet gebeuren met verzoeken die overeenkomen met een specifieke route.

Laten we beginnen met een snel voorbeeld van hoe de Gateway Handler routeconfiguraties oplost met behulp van RouteLocator:

@Bean openbare 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"). en () .path ("/ myOtherRouting") .filters (f -> f.prefixPath ("/ myPrefix")) .uri ("// othersite.com") .id ("myOtherID")) .build (); }

Merk op hoe we gebruik hebben gemaakt van de belangrijkste bouwstenen van deze API:

  • Route - de primaire API van de gateway. Het wordt gedefinieerd door een bepaalde identificatie (ID), een bestemming (URI) en een reeks predikaten en filters
  • Predikaat - een Java 8's Predikaat - die wordt gebruikt voor het matchen van HTTP-verzoeken met behulp van headers, methoden of parameters
  • Filter - een standaard lente WebFilter

3. Dynamische routering

Net als Zuul biedt Spring Cloud Gateway middelen om verzoeken naar verschillende services te routeren.

De routeringsconfiguratie kan worden gemaakt met behulp van pure Java (RouteLocator, zoals getoond in het voorbeeld in sectie 2.1) of door de configuratie van eigenschappen te gebruiken:

lente: applicatie: naam: gateway-service cloud: gateway: routes: - id: baeldung uri: baeldung.com - id: myOtherRouting uri: localhost: 9999

4. Routing fabrieken

Spring Cloud Gateway matcht routes met behulp van de Spring WebFlux HandlerMapping infrastructuur.

Het bevat ook veel ingebouwde routepredicaatfabrieken. Al deze predicaten komen overeen met verschillende kenmerken van het HTTP-verzoek. Meerdere Routepredicaatfabrieken kunnen worden gecombineerd via de logische "en".

Routeafstemming kan zowel programmatisch als via configuratie-eigenschappenbestand worden toegepast met behulp van een ander type Routepredicaatfabrieken.

Ons artikel Spring Cloud Gateway Routing Predicate Factories gaat dieper in op routeringsfabrieken.

5. WebFilter-fabrieken

Routefilters maken de wijziging van het inkomende HTTP-verzoek of uitgaande HTTP-antwoord mogelijk.

Spring Cloud Gateway bevat veel ingebouwde WebFilter-fabrieken, evenals de mogelijkheid om aangepaste filters te maken.

In ons artikel Spring Cloud Gateway WebFilter Factories worden WebFilter-fabrieken in meer detail verkend.

6. Spring Cloud DiscoveryClient-ondersteuning

Spring Cloud Gateway kan eenvoudig worden geïntegreerd met Service Discovery- en Registerbibliotheken, zoals Eureka Server en Consul:

@Configuration @EnableDiscoveryClient openbare klasse GatewayDiscoveryConfiguration {@Bean openbare DiscoveryClientRouteDefinitionLocator discoveryClientRouteLocator (DiscoveryClient discoveryClient) {retourneer nieuwe DiscoveryClientRouteDefinitionLocator (discoveryClient); }}

6.1. LoadBalancerClient Filter

De LoadBalancerClientFilter zoekt naar een URI in de eigenschap exchange attribuut met behulp van ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.

Als de URL een pond schema (bijv. lb: // baeldung-service) het zal de Spring Cloud gebruiken LoadBalancerClient om de naam op te lossen (d.w.z. baeldung-service) naar een daadwerkelijke host en poort.

De ongewijzigde originele URL wordt in de ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR attribuut.

7. Toezicht

Spring Cloud Gateway maakt gebruik van de Actuator API, een bekende Spring-Boot-bibliotheek die verschillende out-of-the-box services biedt voor het monitoren van de applicatie.

Nadat de Actuator API is geïnstalleerd en geconfigureerd, kunnen de gatewaybewakingsfuncties worden gevisualiseerd door te openen /poort/ eindpunt.

8. Implementatie

We zullen nu een eenvoudig voorbeeld maken van het gebruik van Spring Cloud Gateway als een proxyserver met behulp van de pad predikaat.

8.1. Afhankelijkheden

De Spring Cloud Gateway bevindt zich momenteel in de mijlpalenrepository, op versie 2.0.0.RC2. Dit is ook de versie die we hier gebruiken.

Om het project toe te voegen, gebruiken we het afhankelijkheidsbeheersysteem:

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

Vervolgens voegen we de nodige afhankelijkheden toe:

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

8.2. Code Implementatie

En nu maken we een eenvoudige routeringsconfiguratie in het application.yml het dossier:

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

En de Gateway-applicatiecode:

@SpringBootApplication openbare klasse GatewayApplication {openbare statische leegte hoofd (String [] args) {SpringApplication.run (GatewayApplication.class, args); }}

Nadat de applicatie is gestart, hebben we toegang tot de url: "// localhost / actuator / gateway / routes / baeldung_route" om alle gemaakte routeringsconfiguraties te controleren:

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

We zien dat de relatieve url: "/ Baeldung" is geconfigureerd als een route,dus het raken van de url "// localhost / baeldung" we worden omgeleid naar '//baeldung.com“, Zoals was geconfigureerd in ons voorbeeld.

9. Conclusie

In dit artikel hebben we enkele van de functies en componenten onderzocht die deel uitmaken van Spring Cloud Gateway. Deze nieuwe API biedt kant-en-klare tools voor gateway- en proxy-ondersteuning.

De voorbeelden die hier worden gepresenteerd, zijn te vinden in onze GitHub-repository.