Spring Cloud Gateway
Introduction
Qu'est-ce qu'une API Gateway ?
Imaginez une API Gateway comme un réceptionniste dans un grand hôtel :
- Les clients (applications) arrivent à la réception (Gateway)
- Le réceptionniste vérifie qui ils sont (authentification)
- Il les dirige vers le bon service (routage)
- Il peut traduire les messages (transformation)
- Il surveille qui entre et sort (monitoring)
Exemple concret :
Sans Gateway :
Avec Gateway :
Qu'est-ce que Spring Cloud Gateway ?
Spring Cloud Gateway est une implémentation moderne et réactive d'API Gateway basée sur Project Reactor (programmation réactive non-bloquante).
Avantages de la programmation réactive :
- Performance : Gère plus de requêtes avec moins de ressources
- Scalabilité : S'adapte automatiquement à la charge
- Résilience : Gère mieux les erreurs et les timeouts
Architecture complète
Flux de fonctionnement :
- Enregistrement : Services A, B, C s'enregistrent auprès d'Eureka
- Découverte : Gateway récupère la liste des services depuis Eureka
- Routage : Gateway redirige les requêtes vers les bons services
- Filtrage : Gateway applique sécurité, rate limiting, etc.
- Monitoring : Toutes les opérations sont surveillées
Configuration deja fait dans le tp de eureka :
Configuration attendue :
- Eureka Server : Port 8761
- Service A : Port 8081, nom: service-a
- Service B : Port 8082, nom: service-b
- Service C : Port 8083, nom: service-c
Partie 1 : Créer le Spring Cloud Gateway
1 Créer le projet Spring Cloud Gateway via Spring Initializr
Étape 1.1 : Accéder à Spring Initializr
Rendez-vous sur https://start.spring.io
Étape 1.2 : Configurer le projet
Paramètres à sélectionner :
- Project : Maven Project (outil de build)
- Language : Java (langage de programmation)
- Spring Boot : 2.7.x ou supérieur (version du framework)
- Project Metadata :
- Group : com.example
- Artifact : api-gateway
- Name : api-gateway
- Description : Spring Cloud Gateway -reactive
- Package name : com.example.apigateway
- Packaging : Jar
- Java : 11
Étape 1.3 : Sélectionner les dépendances
Dépendances obligatoires :
- Spring Cloud Gateway -reactive : Cœur du Gateway réactif
- Eureka Discovery Client : Pour communiquer avec Eureka
Dépendances optionnelles (recommandées) :
- Spring Boot Actuator : Pour le monitoring
- Spring Boot Security : Pour la sécurité
Étape 1.4 : Générer et importer le projet
- Cliquez sur "Generate" pour télécharger le projet ZIP
- Décompressez le fichier
- Ouvrez le projet dans votre IDE
- Attendez que Maven télécharge toutes les dépendances
2 Comprendre et configurer le fichier pom.xml
Structure du fichier pom.xml - Explication ligne par ligne :
Comment Maven gère les dépendances :
- Lecture du pom.xml : Maven lit votre configuration
- Téléchargement : Il télécharge automatiquement les bibliothèques depuis des dépôts comme Maven Central
- Résolution : Il résout les dépendances transitives (dépendances des dépendances)
- Compilation : Il compile votre code avec toutes les bibliothèques
3 Configuration du Gateway avec application.properties - Explication détaillée
Créer le fichier application.properties :
Chemin : src/main/resources/application.properties
Ce fichier contient toute la configuration de votre application. Il est lu automatiquement au démarrage par Spring Boot.
Configuration ligne par ligne avec explications :
Comprendre les concepts clés :
lb://service-name :
lb= load balancingservice-name= nom logique du service dans Eureka- Gateway utilisera Eureka pour trouver l'adresse réelle
StripPrefix=2 :
- Supprime les 2 premiers segments du chemin
- Exemple :
/api/service-a/healthdevient/health - Utile pour cacher la structure interne aux clients
Predicates :
- Conditions qui déterminent si une route doit être utilisée
Path=/api/service-a/**= tous les chemins commençant par/api/service-a/- Autres exemples : Method=GET, Header=X-API-Key, etc.
4 Configuration Java alternative - Explication détaillée
Quand utiliser la configuration Java ?
La configuration Java est plus puissante et flexible que les fichiers .properties, surtout pour des configurations complexes ou dynamiques.
Créer la classe GatewayConfig.java :
Chemin : src/main/java/com/example/apigateway/config/GatewayConfig.java
Avantages de la configuration Java :
- Plus de puissance : Logique conditionnelle, boucles, etc.
- Meilleur typage : Erreurs détectées à la compilation
- Plus lisible : Structure hiérarchique claire
- Plus maintenable : Refactoring facile avec l'IDE
5 Classe principale du Gateway - Explication complète
Créer la classe ApiGatewayApplication.java :
Chemin : src/main/java/com/example/apigateway/ApiGatewayApplication.java
Comprendre les annotations :
@SpringBootApplication :
- Équivalent à
@Configuration+@EnableAutoConfiguration+@ComponentScan @Configuration: Cette classe peut définir des beans@EnableAutoConfiguration: Configure automatiquement Spring selon les dépendances@ComponentScan: Scanne les composants dans le package et ses sous-packages
@EnableDiscoveryClient :
- Active la découverte de services via Eureka
- Permet à ce service de s'enregistrer automatiquement
- Permet à ce service de découvrir les autres services
Processus de démarrage détaillé :
- JVM démarre : Charge la classe ApiGatewayApplication
- main() appelée : Point d'entrée de l'application
- SpringApplication.run() :
- Crée le contexte Spring (ApplicationContext)
- Lit le fichier application.properties
- Scanne les annotations (@Component, @Service, etc.)
- Crée et configure tous les beans nécessaires
- Configure le serveur web (Tomcat, Netty, etc.)
- Démarre le serveur sur le port configuré (8080)
- Enregistre ce service auprès d'Eureka
- Commence à écouter les requêtes HTTP
Partie 2 : Configuration Avancée des Routes - Explication pas à pas
1 Routes avec filtres avancés - Configuration détaillée
Ajout de filtres complexes dans application.properties :
Comprendre chaque filtre :
Path=/api/v1/service-a/** :
- Route toutes les requêtes dont le chemin commence par
/api/v1/service-a/ **= n'importe quel sous-chemin- Exemple :
/api/v1/service-a/users/123matchera
Method=GET,POST :
- Seules les requêtes GET et POST seront routées
- Les PUT, DELETE, etc. donneront une 404
- Utile pour restreindre les opérations autorisées
Header=X-API-Version, 1.0 :
- La requête doit avoir un header
X-API-Versionavec la valeur1.0 - Utile pour le versioning d'API
- Requêtes sans ce header ou avec une autre valeur seront rejetées
Retry=3,INTERNAL_SERVER_ERROR,SERVICE_UNAVAILABLE :
- En cas d'erreurs 500 ou 503, réessaie jusqu'à 3 fois
- Utile pour la résilience face aux pannes temporaires
- Chaque tentative est espacée de manière exponentielle
2 Filtres globaux personnalisés - Explication complète
Créer des filtres qui s'appliquent à toutes les routes :
Chemin : src/main/java/com/example/apigateway/config/GlobalFiltersConfig.java
Comprendre la programmation réactive avec Mono :
Spring Cloud Gateway est basé sur Project Reactor, qui utilise des Flux et Mono.
Mono<T> :
- Représente une opération asynchrone qui produit 0 ou 1 résultat
- Équivalent à
Promiseen JavaScript ouFutureen Java classique - Non-bloquant : ne bloque pas le thread d'exécution
chain.filter(exchange).then(Mono.fromRunnable(...)) :
chain.filter(exchange)= exécute les filtres suivants.then(...)= exécute le code après que tout est terminé- Permet de faire du post-traitement sans bloquer
Ordre d'exécution des filtres :
3 Configuration de la sécurité - Explication pas à pas
Ajouter la dépendance de sécurité dans pom.xml :
Cette dépendance ajoute Spring Security, qui fournit :
- Authentification (vérification d'identité)
- Autorisation (vérification des permissions)
- Protection contre les attaques (CSRF, XSS, etc.)
Créer la configuration de sécurité :
Chemin : src/main/java/com/example/apigateway/config/SecurityConfig.java
Comprendre l'authentification HTTP Basic :
L'authentification HTTP Basic est la méthode la plus simple :
- Le navigateur affiche une popup de login
- L'utilisateur entre username/password
- Les identifiants sont encodés en Base64 et envoyés dans un header
- Le serveur vérifie les identifiants
Header d'authentification :
Où dXNlcjpwYXNzd29yZA== est user:password encodé en Base64
Tester la sécurité :
Partie 3 : Configuration des Filtres Avancés - Explication détaillée
1 Filtres personnalisés - Création pas à pas
Pourquoi créer des filtres personnalisés ?
Les filtres intégrés ne couvrent pas tous les besoins. Les filtres personnalisés permettent :
- Ajout de headers spécifiques à votre application
- Transformation de données selon vos règles
- Logging personnalisé
- Validation spécifique
Créer un filtre personnalisé pour la transformation de requêtes :
Chemin : src/main/java/com/example/apigateway/filters/CustomRequestFilterFactory.java
Utiliser le filtre personnalisé dans la configuration :
Comment Spring déduit le nom du filtre :
- Classe :
CustomRequestFilterFactory - Nom du filtre :
CustomRequest(enlève "FilterFactory") - Utilisation :
CustomRequest=valeur
2 Filtres de rate limiting avec Redis - Explication complète
Qu'est-ce que le rate limiting ?
Le rate limiting limite le nombre de requêtes qu'un client peut faire dans une période donnée. C'est essentiel pour :
- Protéger contre les attaques DDoS
- Éviter la surcharge du système
- Fair usage entre les clients
Ajouter la dépendance Redis dans pom.xml :
Configuration Redis dans application.properties :
Configuration du rate limiter dans Java :
Chemin : src/main/java/com/example/apigateway/config/RateLimiterConfig.java
Comprendre le fonctionnement du rate limiting :
- Identification du client : KeyResolver détermine qui fait la requête
- Stockage des compteurs : Redis stocke le nombre de requêtes par client
- Vérification : Pour chaque requête, on vérifie si la limite est atteinte
- Action : Si limite dépassée, on retourne 429 Too Many Requests
Tester le rate limiting :
Partie 4 : Tester l'Architecture Gateway - Guide pas à pas
1 Démarrer l'ensemble du système - Ordre détaillé
Ordre critique de démarrage :
IMPORTANT : L'ordre de démarrage est crucial pour le bon fonctionnement !
- Eureka Server (Port 8761) : Doit démarrer en premier car c'est l'annuaire
- Microservices (Ports 8081, 8082, 8083) : S'enregistrent auprès d'Eureka
- API Gateway (Port 8080) : Découvre les services et configure les routes
Démarrer Eureka Server :
Démarrer les microservices :
Démarrer API Gateway :
2 Vérifier l'enregistrement dans Eureka - Explication détaillée
Accéder à l'interface web d'Eureka :
Ce que vous devriez voir dans l'interface Eureka :
Signification des statuts :
- UP : Service en cours d'exécution et en bonne santé
- DOWN : Service arrêté ou en erreur
- STARTING : Service en cours de démarrage
- OUT_OF_SERVICE : Service temporairement indisponible
Vérifier via l'API Eureka :
3 Tester les routes du Gateway - Guide complet
Routes automatiques via discovery locator :
Quand spring.cloud.gateway.discovery.locator.enabled=true,
Gateway crée automatiquement des routes pour chaque service enregistré dans Eureka.
Routes manuelles configurées :
Les routes définies dans application.properties ou via Java.
Différence entre routes automatiques et manuelles :
| Aspect | Routes Automatiques | Routes Manuelles |
|---|---|---|
| Configuration | Automatique via Eureka | Manuelle dans config |
| Nommage | NOM-SERVICE (majuscules) | /api/service-name (configurable) |
| Filtres | Aucun filtre par défaut | Filtres personnalisables |
| Flexibilité | Limitée | Très flexible |
4 Tester les filtres et fonctionnalités avancées
Tester les filtres personnalisés :
Tester le rate limiting :
Tester la sécurité :
5 Tester la résilience et le load balancing
Simuler une panne de service :
Tester le retry mechanism :
Comportement du load balancing :
Si vous avez plusieurs instances du même service, Gateway distribue automatiquement les requêtes.
Partie 5 : Monitoring et Actuator - Explication complète
1 Configuration des endpoints Actuator - Détails
Qu'est-ce que Spring Boot Actuator ?
Actuator fournit des endpoints de production-ready pour :
- Health : État de santé de l'application
- Info : Informations générales
- Metrics : Métriques de performance
- Env : Variables d'environnement
- Gateway : Informations spécifiques au Gateway
Configuration complète dans application.properties :
2 Utiliser les endpoints Actuator - Guide pratique
Endpoints disponibles et leur utilité :
Exemple détaillé de réponse des routes :
Comprendre la structure de la réponse :
- predicate : Condition de routage (chemin, méthode, etc.)
- route_id : Identifiant unique de la route
- filters : Filtres appliqués à cette route
- uri : Destination (lb:// = load balancing)
- order : Ordre d'évaluation des routes
3 Monitoring avancé avec Prometheus et Grafana
Configuration pour Prometheus :
Accéder aux métriques Prometheus :
Meilleures Pratiques et Améliorations - Guide détaillé
1 Structure de configuration optimale
Architecture de production recommandée :
- Load Balancer : Devant le Gateway pour haute disponibilité
- Multiple Gateways : Pour scalabilité
- Redis Cluster : Pour rate limiting distribué
- Auth Server : Service d'authentification centralisé
- Monitoring Stack : Prometheus + Grafana + AlertManager
2 Sécurité avancée - Configuration détaillée
Sécurité complète avec JWT :
Configuration JWT dans SecurityConfig :
3 Performance et monitoring - Optimisations
Configuration de performance optimale :
4 Gestion des erreurs et fallback - Configuration robuste
Configuration robuste avec fallback :
Gestionnaire d'erreurs global :
Dépannage Courant pour Débutants - Guide pas à pas
1 Routes non trouvées - Diagnostic complet
Symptôme :
"404 Not Found" pour les routes configurées
Causes possibles et solutions :
1. Vérifier les routes configurées :
2. Vérifier l'enregistrement dans Eureka :
3. Vérifier la configuration des routes :
4. Vérifier les logs du Gateway :
2 Erreurs de load balancing - Guide de résolution
Symptôme :
"503 Service Unavailable" ou "Unable to find instance"
Causes possibles et solutions :
1. Service non enregistré dans Eureka :
2. Mauvais nom de service dans l'URI :
3. Service enregistré mais DOWN :
4. Configuration Eureka incorrecte :
3 Problèmes de filtres - Diagnostic détaillé
Symptôme :
Filtres non appliqués ou erreurs de configuration
Causes possibles et solutions :
1. Syntaxe incorrecte dans .properties :
2. Filtres personnalisés non détectés :
3. Ordre des filtres :
4. Debug des filtres :
4 Problèmes de rate limiting - Guide complet
Symptôme :
Rate limiting non fonctionnel ou erreurs Redis
Causes possibles et solutions :
1. Redis non démarré :
2. Configuration Redis incorrecte :
3. Dépendance Redis manquante :
4. Configuration du rate limiter :
Conclusion et Prochaines Étapes - Guide pour aller plus loin
1 Résumé de ce que vous avez appris - Par points
Compétences acquises :
- Architecture : Compréhension de l'API Gateway et Eureka
- Configuration : Maîtrise de application.properties et configuration Java
- Routage : Routes automatiques et manuelles avec filtres
- Sécurité : Authentification, rate limiting, CORS
- Monitoring : Actuator, métriques, logging
- Déploiement : Démarrage et dépannage du système
Technologies maîtrisées :
- Spring Cloud Gateway : Routage réactif
- Eureka Client : Découverte de services
- Spring Security : Protection des APIs
- Redis : Rate limiting distribué
- Actuator : Monitoring de production
2 Prochaines étapes pour approfondir - Parcours d'apprentissage
Niveau intermédiaire :
- Spring Cloud Security :
- Authentification OAuth2/JWT avancée
- Authorization avec Spring Security
- Single Sign-On (SSO)
- Spring Cloud Stream :
- Communication par événements avec Kafka/RabbitMQ
- Event-driven architecture
- Message brokers
- Spring Cloud Sleuth :
- Tracing distribué avec Zipkin
- Corrélation de logs
- Monitoring de performance
Niveau avancé :
- Docker Compose :
- Déploiement conteneurisé de tous les services
- Orchestration locale
- Environnements de développement reproductibles
- Kubernetes :
- Orchestration dans un cluster de production
- Service mesh avec Istio
- Auto-scaling et résilience
- Service Mesh :
- Istio, Linkerd pour le micro-routage
- Observabilité avancée
- Sécurité de service à service
3 Ressources supplémentaires - Pour continuer à apprendre
Documentation officielle :
- Spring Cloud Gateway : https://spring.io/projects/spring-cloud-gateway
- Spring Cloud Netflix : https://spring.io/projects/spring-cloud-netflix
- Spring Boot Actuator : Documentation Actuator
Projets GitHub à étudier :
- Spring Cloud Samples : Exemples officiels
- Microservices Demo : Projets complets d'architecture microservices
- Spring Cloud Gateway Examples : Exemples de configurations avancées
Communautés et forums :
- Stack Overflow : Tag "spring-cloud-gateway"
- Gitter : Channels Spring Cloud
- Reddit : r/java, r/springframework
- Discord : Communautés Java/Spring
Livres recommandés :
- "Spring Microservices in Action" par John Carnell
- "Building Microservices" par Sam Newman
- "Cloud Native Java" par Josh Long et Kenny Bastani
- "Reactive Systems in Java" par Reactive Foundation
Félicitations ! 🎉
Vous avez maintenant une compréhension solide et pratique de Spring Cloud Gateway et de son intégration avec Eureka Server. Cette compétence est essentielle pour construire des architectures microservices modernes et évolutives.
Prochaines étapes recommandées :
- Pratiquez : Créez vos propres projets avec différentes configurations
- Expérimentez : Testez des filtres personnalisés et des routes complexes
- Déployez : Essayez avec Docker et Kubernetes
- Surveillez : Intégrez Prometheus/Grafana pour le monitoring
La maîtrise vient avec la pratique régulière. Continuez à explorer et à construire !