Esplorazione del nuovo Spring Cloud Gateway

1. Panoramica

In questo articolo esploreremo le caratteristiche principali del progetto Spring Cloud Gateway, una nuova API basata su Spring 5, Spring Boot 2 e Project Reactor.

Lo strumento fornisce meccanismi di instradamento pronti all'uso spesso utilizzati nelle applicazioni di microservizi come un modo per nascondere più servizi dietro un'unica facciata.

Per una spiegazione del pattern Gateway senza il progetto Spring Cloud Gateway, consulta il nostro articolo precedente.

2. Routing Handler

Essendo concentrato sulle richieste di instradamento, Spring Cloud Gateway inoltra le richieste a un mapping handler gateway, che determina cosa deve essere fatto con le richieste che corrispondono a una route specifica.

Cominciamo con un rapido esempio di come il gestore del gateway risolve le configurazioni di route utilizzando 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(); }

Nota come abbiamo utilizzato i principali elementi costitutivi di questa API:

  • Route: l'API principale del gateway. È definito da una data identificazione (ID), una destinazione (URI) e un insieme di predicati e filtri
  • Predicate - un predicato di Java 8 - che viene utilizzato per abbinare le richieste HTTP utilizzando intestazioni, metodi o parametri
  • Filter: un WebFilter standard di Spring

3. Routing dinamico

Proprio come Zuul, Spring Cloud Gateway fornisce mezzi per instradare le richieste a diversi servizi.

La configurazione del routing può essere creata utilizzando Java puro ( RouteLocator , come mostrato nell'esempio nella sezione 2.1) o utilizzando la configurazione delle proprietà:

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

4. Stabilimenti di instradamento

Spring Cloud Gateway abbina le rotte utilizzando l' infrastruttura Spring WebFlux HandlerMapping .

Include anche molte fabbriche di predicati di percorso integrate. Tutti questi predicati corrispondono a diversi attributi della richiesta HTTP. È possibile combinare più fabbriche di predicati del percorso tramite la logica "e".

La corrispondenza del percorso può essere applicata sia a livello di programmazione che tramite il file delle proprietà di configurazione utilizzando un tipo diverso di fabbriche predicato del percorso.

Il nostro articolo Spring Cloud Gateway Routing Predicate Factories esplora le fabbriche di routing in modo più dettagliato.

5. Fabbriche di WebFilter

I filtri di route rendono possibile la modifica della richiesta HTTP in entrata o della risposta HTTP in uscita.

Spring Cloud Gateway include molte fabbriche WebFilter integrate, nonché la possibilità di creare filtri personalizzati.

Il nostro articolo Spring Cloud Gateway WebFilter Factories esplora le factory WebFilter in modo più dettagliato.

6. Supporto Spring Cloud DiscoveryClient

Spring Cloud Gateway può essere facilmente integrato con le librerie di Service Discovery e Registry, come Eureka Server e Consul:

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

6.1. LoadBalancerClient Filter

I LoadBalancerClientFilter cerca un URI nella proprietà dell'attributo scambio utilizzando ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR.

Se l'URL ha uno schema lb (ad esempio, lb: // baeldung-service) utilizzerà Spring Cloud LoadBalancerClient per risolvere il nome (ovvero, baeldung-service) in un host e una porta effettivi.

L'URL originale non modificato viene inserito nell'attributo ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR .

7. Monitoraggio

Spring Cloud Gateway utilizza l'API Actuator, una nota libreria Spring-Boot che fornisce diversi servizi pronti all'uso per il monitoraggio dell'applicazione.

Una volta installata e configurata l'API dell'attuatore, le funzionalità di monitoraggio del gateway possono essere visualizzate accedendo a / gateway / endpoint.

8. Attuazione

Creeremo ora un semplice esempio dell'utilizzo di Spring Cloud Gateway come server proxy utilizzando il predicato del percorso .

8.1. Dipendenze

Spring Cloud Gateway è attualmente nel repository delle pietre miliari, nella versione 2.0.0.RC2. Questa è anche la versione che stiamo usando qui.

Per aggiungere il progetto, useremo il sistema di gestione delle dipendenze:

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

Successivamente, aggiungeremo le dipendenze necessarie:

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

8.2. Implementazione del codice

E ora creiamo una semplice configurazione di routing nel file application.yml :

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

E il codice dell'applicazione Gateway:

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

Dopo l'avvio dell'applicazione, possiamo accedere all'URL: "// localhost / actualator / gateway / routes / baeldung_route" per controllare tutte le configurazioni di routing create:

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

Vediamo che l'URL relativo: "/ baeldung" è configurato come un percorso,quindi premendo l'url "// localhost / baeldung" verremo reindirizzati a " //baeldung.com ", come è stato configurato nel nostro esempio.

9. Conclusione

In questo articolo, abbiamo esplorato alcune delle funzionalità e dei componenti che fanno parte di Spring Cloud Gateway. Questa nuova API fornisce strumenti pronti all'uso per il supporto di gateway e proxy.

Gli esempi presentati qui possono essere trovati nel nostro repository GitHub.