Configurer une Passerelle Unifiée avec Spring Cloud Gateway

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.

  1. 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
  1. 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]
  1. 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.

  1. 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.

  1. 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.
  1. Déploiement

Pour déployer la passerelle :

  1. Vérifiez les configurations de route et de filtre.
  2. Construisez l'application avec Maven ou Gradle.
  3. Déployez le artefact sur un serveur ou un conteneru.
  4. Ouvrez les ports réseau nécessaires.
  5. 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.

Étiquettes: Spring Cloud Gateway Spring Boot Microservices API gateway routing

Publié le 10 juillet à 07h26