Spring Cloud Gateway
Sections
Réglages de lecture
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
Code et termes techniques en anglais
Désactivé : la voix de la page lit tout, sans pause entre deux voix.
Aucune voix pour cette langue dans ce navigateur.
Plus de voix
D’autres voix : Microsoft Edge propose des voix naturelles en ligne, et Windows (Paramètres › Heure et langue › Voix), macOS et Android en installent d’autres.
Spring Cloud Gateway est le pendant réactif de YARP : les prédicats choisissent une route, les filtres transforment l’échange et l’URI cible choisit la destination.
Une route périphérique étroite
Section intitulée « Une route périphérique étroite »La gateway expose /api/scales/**, retire le préfixe public /api et ajoute un en-tête traçable :
@BeanRouteLocator courseRoutes(RouteLocatorBuilder routes, @Value("${course.scales-uri}") String scalesUri) { return routes.routes() .route("scales", route -> route.path("/api/scales/**") .filters(filters -> filters.stripPrefix(1) .addRequestHeader("X-Course", "spring-cloud-gateway")) .uri(scalesUri)) .build();}La route porte la politique de transport, pas les décisions musicales. Authentification, limites et corrélation conviennent à la périphérie; construire un accord, non. Chaque filtre modifie aussi les pannes possibles : gardez la chaîne courte et observable.
Un vrai test sans service externe
Section intitulée « Un vrai test sans service externe »Le test d’intégration lie les deux processus à des ports attribués par l’OS. Un petit upstream Reactor Netty renvoie son chemin et l’en-tête; la gateway démarre avec @SpringBootTest et reçoit l’URI via @DynamicPropertySource.
upstream = HttpServer.create().port(0) .route(routes -> routes.get("/scales/C", (request, response) -> response .sendString(Mono.just(request.uri() + "|" + request.requestHeaders().get("X-Course"))))) .bindNow();GET /api/scales/C -> /scales/C|spring-cloud-gatewayGET /other -> 404mvn -B -pl l06-gateway -am testCela couvre prédicat, ordre des filtres, transfert et chemin sans route. Cela ne prouve ni latence de production, ni terminaison TLS, ni confiance envers les en-têtes proxy.
Exercices
Section intitulée « Exercices »- Ajoutez
/api/progressions/**en conservant le chemin après retrait de/api.
Solution
Ajoutez une route avec un ID distinct, path("/api/progressions/**") et stripPrefix(1). Testez l’URI reçue par l’upstream plutôt que l’objet route.
- Ajoutez à la réponse l’ID de la route choisie.
Solution
Employez addResponseHeader("X-Route", "scales") et WebTestClient.expectHeader(). N’exposez pas les noms d’hôtes internes.
- Pourquoi ne pas appliquer automatiquement un retry à toutes les requêtes ?
Solution
Un retry peut dupliquer un effet non idempotent et multiplier la charge pendant une panne. Restreignez méthodes et erreurs, bornez les tentatives et mesurez l’amplification. La leçon 9 traite la résilience explicitement.