Spring Cloud Gateway est un projet de l'écosystème Spring Cloud qui offre une solution moderne pour la gestion des routes API dans les architectures microservices. Conçu avec Spring 6.0+, Spring Boot 3.0 et Project Reactor, il centralise les focntions essentielles comme le contrôle d'accès, le routage dynamique, la répartition de charge et la limitation de débit.
- Présentation de la Passerelle
Pour implémenter une passerelle avec Spring Cloud Gateway, suivez ces étapes :
- Créez un projet Spring Boot avec les dépendances nécessaires.
- Développez une classe principale d'application.
- Configurez les routes et les filtres via un fichier YAML.
Exemple de Configuration
server:
port: 8080
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: order-route
uri: lb://order-app/
predicates:
- Path=/orders/**,/api/feign/**
- After=2024-04-01T00:00:00.000+02:00[Europe/Paris]
filters:
- AddRequestParameter=user, demo
- name: CustomFilter
args:
key: sample_key
- id: product-route
uri: lb://product-app/
predicates:
- Path=/items/**
default-filters:
- name: RetryFilter
args:
retries: 2
statuses: SERVICE_UNAVAILABLE
management:
endpoints:
web:
exposure:
include: health, info
- Comprendre les Prédicats de Route
Les prédicats (Predicates) sont des conditions qui déterminent si une requête correspond à une route spécifique. Ils utilisent des expressions logiques pour filtrer les requêtes en fonction de critères tels que le chemin, la méthode HTTP, les en-têtes ou les paramètres de requête.
2.1 Prédicats de Chemin
Ce prédicat filtre les requêtes basées sur l'URL :
spring:
cloud:
gateway:
routes:
- id: path-based-route
uri: https://api.example.com
predicates:
- Path=/resources/**
2.2 Prédicats de Méthode
Route selon le type de méthode HTTP, comme GET ou POST :
spring:
cloud:
gateway:
routes:
- id: method-route
uri: https://api.example.com
predicates:
- Method=POST
2.3 Prédicats d'En-tête
Condition basée sur les en-têtes HTTP :
spring:
cloud:
gateway:
routes:
- id: header-route
uri: https://api.example.com
predicates:
- Header=X-Custom-Header, [a-zA-Z0-9]+
2.4 Prédicats de Paramètre de Requête
Filtre les requêtes avec des paramètres spécifiques :
spring:
cloud:
gateway:
routes:
- id: query-route
uri: https://api.example.com
predicates:
- QueryParam=search, active
2.5 Prédicats d'Hôte
Correspond à l'en-tête Host de la requête :
spring:
cloud:
gateway:
routes:
- id: host-route
uri: https://api.example.com
predicates:
- Host=**.mon-domaine.fr
2.6 Prédicats Temporels
Route selon l'heure de la requête :
- After : après une date précise.
- Before : avant une date précise.
- Between : entre deux dates.
spring:
cloud:
gateway:
routes:
- id: temporal-route
uri: https://api.example.com
predicates:
- After=2024-05-10T10:00:00.000+02:00[Europe/Paris]
- Filtres de Passerelle
Les filtres (Gateway Filters) modifient les requêtes ou réponses pendant le routage. Ils permettent d'ajouter des en-têtes, de réécrire des chemins ou d'intégrer des mécanismes de résiliance.
3.1 Ajouter des En-têtes de Requête
filters:
- AddRequestHeader=X-Forwarded-By, gateway
3.2 Ajouter des Paramètres de Requête
filters:
- AddRequestParameter=source, web
3.3 Ajouter des En-têtes de Réponse
filters:
- AddResponseHeader=X-Response-Time, millis
3.4 Dédupliquer les En-têtes de Réponse
Élimine les en-têtes redondants, utile pour le CORS :
filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Methods
3.5 Intégrer un Disjoncteur (Circuit Breaker)
Utilise Resilience4j pour la tolérance aux pannes :
filters:
- name: CircuitBreaker
args:
name: monDisjoncteur
fallbackUri: forward:/fallback
3.6 En-têtes de Fallback
Ajoute des informations d'erreur aux en-têtes lors d'un fallback :
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: X-Exception-Type
3.7 Filtres Personnalisés
Pour créer un filtre personnalisé, implémentez l'interface GatewayFilter ou GlobalFilter avec une logique adaptée, comme la journalisation ou la validation.
- Limitation de Débit
La limitation de débit (Rate Limiting) contrôle le trafic entrant pour éviter la surcharge. Les algorithmes courants incluent :
- Fenêtre Fixe : compte les requêtes sur des intervalles fixes.
- Fenêtre Glissante : lisse les limites sur une période mobile.
- Algorithme de Seau Percé : traite les requêtes à un taux constant.
- Algorithme de Jeton : alloue des jetons pour le trafic.
L'implémentation peut se faire via des filtres intégrés ou des bibliothèques dédiées.
- Filtres Globaux
Les filtres globaux (Global Filters) s'appliquent à toutes les routes, souvent pour des fonctions transversales comme la sécurité ou le monitoring.
- Gateway Metrics Filter : expose des métriques pour la surveillance.
- Forward Routing Filter : redirige les requêtes en interne sans passer par le réseau.
- LoadBalancer Client Filter : équilibre la charge entre les instances de services.
- Déploiement
Pour déployer la passerelle :
- Vérifiez les configurations de route et de filtre.
- Construisez l'application avec Maven ou Gradle.
- Déployez le artefact sur un serveur ou un conteneru.
- Ouvrez les ports réseau nécessaires.
- Testez les endpoints pour valider le routage.
Assurez-vous que les services en aval sont accessibles et que les registres de services comme Nacos sont correctement configurés.