Partager via


Tutoriel : Se connecter à une passerelle gérée pour Spring dans Azure Container Apps (préversion)

La passerelle pour Spring offre un moyen efficace et puissant d’acheminer, de gérer et de traiter les demandes d’API dans le cadre d’une architecture de microservices. Elle sert de passerelle API qui achemine les requêtes externes vers différents services, en ajoutant différentes fonctionnalités telles que le filtrage, l’équilibrage de charge, etc. Dans cet article, vous allez apprendre à créer une passerelle qui dirige les requêtes vers vos applications conteneur.

Ce didacticiel vous apprend à effectuer les opérations suivantes :

  • Créer un composant Java Passerelle pour Spring
  • Mettre à jour la passerelle pour Spring avec des itinéraires personnalisés pour rediriger les requêtes vers des applications conteneur

Important

Ce tutoriel utilise des services qui peuvent affecter votre facture Azure. Si vous décidez de suivre les étapes pas à pas, veillez à supprimer les ressources présentées dans cet article pour éviter toute facturation inattendue.

Prérequis

À propos de l’installation

Pendant l’exécution de la passerelle pour Spring dans Azure Container Apps, tenez compte des détails suivants :

Article Explication
Portée La passerelle pour Spring s’exécute dans le même environnement que l’application conteneur connectée.
Ressources L’allocation des ressources de conteneur pour la passerelle pour Spring est fixe, le nombre de cœurs de CPU est de 0,5 et la taille de mémoire est 1 Gi.
Tarification La facturation de la passerelle pour Spring est soumise à des tarifs basés sur la consommation. Les ressources consommées par les composants Java managés sont facturées aux taux actif/inactif. Vous pouvez supprimer les composants qui ne sont plus utilisés pour arrêter la facturation.

Programme d’installation

Avant de commencer à utiliser la passerelle pour Spring, vous devez d’abord créer les ressources nécessaires.

Exécutez les commandes suivantes pour créer votre groupe de ressources et votre environnement Container Apps.

  1. Créez des variables pour prendre en charge la configuration de votre application. Ces valeurs sont fournies dans le cadre de cette leçon. Nous utilisons le point de terminaison d’actionneur de l’administrateur pour l’exemple d’application Spring dans cette leçon.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-spring-cloud-resource-group
    export ENVIRONMENT=my-spring-cloud-environment
    export JAVA_COMPONENT_NAME=mygateway
    export APP_NAME=myapp
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
    
    Variable Description
    LOCATION Emplacement de la région Azure où vous créez votre application conteneur et votre composant Java.
    ENVIRONMENT Nom de l’environnement Azure Container Apps pour votre application de démonstration.
    RESOURCE_GROUP Nom du groupe de ressources Azure de votre application de démonstration.
    JAVA_COMPONENT_NAME Nom du composant Java créé pour votre application conteneur. Dans le cas présent, vous créez un composant Java Passerelle pour Spring.
    IMAGE Image conteneur utilisée dans votre application conteneur.
  2. Connectez-vous à Azure avec Azure CLI.

    az login
    
  3. Créez un groupe de ressources.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Créez votre environnement d’applications conteneur.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    Cet environnement est utilisé pour héberger à la fois le composant Passerelle pour Spring et votre application conteneur.

Utiliser le composant Java Passerelle pour Spring

Maintenant que vous disposez d’un environnement Container Apps, vous pouvez créer votre application conteneur et utiliser un composant Java Passerelle pour Spring pour y acheminer les requêtes.

  1. Créez le composant Java Passerelle pour Spring.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Créez l’application conteneur qui a le nom de domaine complet (FQDN).

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --ingress external \
        --target-port 8080 \
        --query properties.configuration.ingress.fqdn
    

    Cette commande retourne l’URL de votre application conteneur qui consomme les données de configuration. Copiez l’URL dans un éditeur de texte pour pouvoir l’utiliser dans la prochaine étape.

Mettre à jour les itinéraires de passerelle pour acheminer les requêtes

  1. Créez un fichier YAML avec le contenu suivant. Remplacez <MYAPP_URL> par le FQDN de l’application conteneur de l’étape précédente.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Exécutez la commande suivante pour mettre à jour le composant Passerelle pour Spring avec votre configuration de routage.

    az containerapp env java-component gateway-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \ 
        --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \
        --query properties.ingress.fqdn
    

    Cette commande met à jour l’itinéraire de la passerelle et retourne l’URL de votre passerelle qui consomme les données de configuration.

    La commande retourne l’URL de la passerelle. La visite de cette URL avec le chemin /myapp/health doit acheminer la demande vers le point de terminaison actuator/health de votre application, en retournant {"status":"UP","groups":["liveness","readiness"]}.

Nettoyer les ressources

Les ressources créées dans ce tutoriel ont un effet sur votre facture Azure. Si vous n’allez pas utiliser ces services à long terme, exécutez la commande suivante pour supprimer tout ce qui a été créé dans ce didacticiel.

az group delete --resource-group $RESOURCE_GROUP

Format de fichier des itinéraires

Le composant Passerelle pour Spring prend en charge la définition d’itinéraires via des propriétés avec l’ID, l’URI, les prédicats et les filtres. Pour plus d’informations, consultez la documentation de Spring Cloud Gateway. Voici un exemple de fichier YAML qui montre comment configurer ces propriétés.

  springCloudGatewayRoutes:
  - id: "route1"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v1/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"
  - id: "route2"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v2/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"

Liste de configurations autorisées pour votre passerelle pour Spring (#configurable-properties)

Le tableau suivant décrit les propriétés du composant Passerelle que vous pouvez configurer pour votre application. Pour plus d’informations, consultez Propriétés d’application courantes de Spring Cloud Gateway.

Nom de la propriété Description Valeur par défaut
spring.cloud.gateway.default-filters Liste des définitions de filtre appliquées à chaque itinéraire.
spring.cloud.gateway.enabled Active le fonctionnement de la passerelle. true
spring.cloud.gateway.fail-on-route-definition-error Option permettant d’échouer sur les erreurs de définition d’itinéraire. La valeur par défaut est true. Sinon, un avertissement est consigné. true
spring.cloud.gateway.handler-mapping.order Ordre de RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Indicateur qui active l’intégration de passerelle DiscoveryClient. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Expression SpEL qui évalue s’il faut inclure un service dans l’intégration de la passerelle ou non. La valeur par défaut est true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Option pour mettre en minuscules serviceId dans les prédicats et les filtres. La valeur par défaut est false. Utile avec Eureka quand il met automatiquement en majuscules serviceId. Par conséquent, MYSERVICE correspondrait à /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix Le préfixe de routeId est par défaut discoveryClient.getClass().getSimpleName() + "_". L’ID de service est ajouté pour créer le routeId.
spring.cloud.gateway.discovery.locator.url-expression Expression SpEL qui crée l’URI pour chaque itinéraire. La valeur par défaut est 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled Active le filtre add-request-header. true
spring.cloud.gateway.filter.add-request-parameter.enabled Active le filtre add-request-parameter. true
spring.cloud.gateway.filter.add-response-header.enabled Active le filtre add-response-header. true
spring.cloud.gateway.filter.circuit-breaker.enabled Active le filtre circuit-breaker. true
spring.cloud.gateway.filter.dedupe-response-header.enabled Active le filtre dedupe-response-header. true
spring.cloud.gateway.filter.fallback-headers.enabled Active le filtre fallback-headers. true
spring.cloud.gateway.filter.hystrix.enabled Active le filtre hystrix. true
spring.cloud.gateway.filter.json-to-grpc.enabled Active le filtre JSON en gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled Active le filtre local-response-cache. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Taille maximale du cache pour supprimer les entrées de cet itinéraire en Ko, Mo et Go.
spring.cloud.gateway.filter.local-response-cache.time-to-live Délai d’expiration d’une entrée de cache, exprimé avec s pour les secondes, m pour les minutes et h pour les heures. 5m
spring.cloud.gateway.filter.map-request-header.enabled Active le filtre map-request-header. true
spring.cloud.gateway.filter.modify-request-body.enabled Active le filtre modify-request-body. true
spring.cloud.gateway.filter.modify-response-body.enabled Active le filtre modify-response-body. true
spring.cloud.gateway.filter.prefix-path.enabled Active le filtre prefix-path. true
spring.cloud.gateway.filter.preserve-host-header.enabled Active le filtre preserve-host-header. true
spring.cloud.gateway.filter.redirect-to.enabled Active le filtre redirect-to. true
spring.cloud.gateway.filter.remove-hop-by-hop.headers
spring.cloud.gateway.filter.remove-hop-by-hop.order 0
spring.cloud.gateway.filter.remove-request-header.enabled Active le filtre remove-request-header. true
spring.cloud.gateway.filter.remove-request-parameter.enabled Active le filtre remove-request-parameter. true
spring.cloud.gateway.filter.remove-response-header.enabled Active le filtre remove-response-header. true
spring.cloud.gateway.filter.request-header-size.enabled Active le filtre request-header-size. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled Active le filtre request-header-to-request-uri. true
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter
spring.cloud.gateway.filter.request-rate-limiter.enabled Active le filtre request-rate-limiter. true
spring.cloud.gateway.filter.request-size.enabled Active le filtre request-size. true
spring.cloud.gateway.filter.retry.enabled Active le filtre retry. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled Active le filtre rewrite-location-response-header. true
spring.cloud.gateway.filter.rewrite-location.enabled Active le filtre rewrite-location. true
spring.cloud.gateway.filter.rewrite-path.enabled Active le filtre rewrite-path. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled Active le filtre rewrite-request-parameter. true
spring.cloud.gateway.filter.rewrite-response-header.enabled Active le filtre rewrite-response-header. true
spring.cloud.gateway.filter.save-session.enabled Active le filtre save-session. true
spring.cloud.gateway.filter.secure-headers.content-security-policy default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
spring.cloud.gateway.filter.secure-headers.content-type-options nosniff
spring.cloud.gateway.filter.secure-headers.disable
spring.cloud.gateway.filter.secure-headers.download-options noopen
spring.cloud.gateway.filter.secure-headers.enabled Active le filtre secure-headers. true
spring.cloud.gateway.filter.secure-headers.frame-options DENY
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies none
spring.cloud.gateway.filter.secure-headers.referrer-policy no-referrer
spring.cloud.gateway.filter.secure-headers.strict-transport-security max-age=631138519
spring.cloud.gateway.filter.secure-headers.xss-protection-header 1 ; mode=block
spring.cloud.gateway.filter.set-path.enabled Active le filtre set-path. true
spring.cloud.gateway.filter.set-request-header.enabled Active le filtre set-request-header. true
spring.cloud.gateway.filter.set-request-host-header.enabled Active le filtre set-request-host-header. true
spring.cloud.gateway.filter.set-response-header.enabled Active le filtre set-response-header. true
spring.cloud.gateway.filter.set-status.enabled Active le filtre set-status. true
spring.cloud.gateway.filter.strip-prefix.enabled Active le filtre strip-prefix. true
spring.cloud.gateway.forwarded.enabled Active ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled Active le filtre global adapt-cached-body. true
spring.cloud.gateway.global-filter.forward-path.enabled Active le filtre global forward-path. true
spring.cloud.gateway.global-filter.forward-routing.enabled Active le filtre global forward-routing. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled Active le filtre global load-balancer-client. true
spring.cloud.gateway.global-filter.local-response-cache.enabled Active le filtre local-response-cache pour tous les itinéraires, ce qui vous permet d’ajouter une configuration spécifique au niveau de l’itinéraire en utilisant un filtre LocalResponseCache. true
spring.cloud.gateway.global-filter.netty-routing.enabled Active le filtre netty-routing global. true
spring.cloud.gateway.global-filter.netty-write-response.enabled Active le filtre global netty-write-response. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled Active le filtre global reactive-load-balancer-client. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled Active le filtre global remove-cached-body. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled Active le filtre global route-to-request-url. true
spring.cloud.gateway.global-filter.websocket-routing.enabled Active le filtre global websocket-routing. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Si la configuration CORS globale doit être ajoutée au gestionnaire d’URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header Nom de l’en-tête qui retourne la configuration de capacité de rafale. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Indique s’il faut inclure ou non des en-têtes contenant des informations de limiteur de débit. La valeur par défaut est true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nom de l’en-tête qui retourne le nombre de requêtes restantes pendant la seconde actuelle. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header Nom de l’en-tête qui retourne la configuration de taux de réapprovisionnement. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header Nom de l’en-tête qui retourne la configuration de jetons demandés. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Limite l’accès aux méthodes et aux propriétés dans SpEL. true
spring.cloud.gateway.predicate.after.enabled Active le prédicat after. true
spring.cloud.gateway.predicate.before.enabled Active le prédicat before. true
spring.cloud.gateway.predicate.between.enabled Active le prédicat between. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled Active le prédicat cloud-foundry-route-service. true
spring.cloud.gateway.predicate.cookie.enabled Active le prédicat cookie. true
spring.cloud.gateway.predicate.header.enabled Active le prédicat header. true
spring.cloud.gateway.predicate.host.enabled Active le prédicat host. true
spring.cloud.gateway.predicate.host.include-port Inclut le port correspondant au nom d’hôte. true
spring.cloud.gateway.predicate.method.enabled Active le prédicat method. true
spring.cloud.gateway.predicate.path.enabled Active le prédicat path. true
spring.cloud.gateway.predicate.query.enabled Active le prédicat query. true
spring.cloud.gateway.predicate.read-body.enabled Active le prédicat read-body. true
spring.cloud.gateway.predicate.remote-addr.enabled Active le prédicat remote-addr. true
spring.cloud.gateway.predicate.weight.enabled Active le prédicat weight. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled Active le prédicat xforwarded-remote-addr. true
spring.cloud.gateway.set-status.original-status-header-name Nom de l’en-tête qui contient le code HTTP de la requête proxysée.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Si XForwardedHeadersFilter est activé. true
spring.cloud.gateway.x-forwarded.for-append Si l’ajout de X-Forwarded-For en tant que liste est activé. true
spring.cloud.gateway.x-forwarded.for-enabled Si X-Forwarded-For est activé. true
spring.cloud.gateway.x-forwarded.host-append Si l’ajout de X-Forwarded-Host en tant que liste est activé. true
spring.cloud.gateway.x-forwarded.host-enabled Si X-Forwarded-Host est activé. true
spring.cloud.gateway.x-forwarded.order Ordre de XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Si l’ajout de X-Forwarded-Port en tant que liste est activé. true
spring.cloud.gateway.x-forwarded.port-enabled Si X-Forwarded-Port est activé. true
spring.cloud.gateway.x-forwarded.prefix-append Si l’ajout de X-Forwarded-Prefix en tant que liste est activé. true
spring.cloud.gateway.x-forwarded.prefix-enabled Si X-Forwarded-Prefix est activé. true
spring.cloud.gateway.x-forwarded.proto-append Si l’ajout de X-Forwarded-Proto en tant que liste est activé. true
spring.cloud.gateway.x-forwarded.proto-enabled Si X-Forwarded-Proto est activé. true
spring.cloud.gateway.httpclient.compression Active la compression pour le HttpClient Netty. false
spring.cloud.gateway.httpclient.connect-timeout Délai d’expiration connecté en millisecondes. La valeur par défaut est 30s.
spring.cloud.gateway.httpclient.max-header-size Taille maximale de l’en-tête de réponse.
spring.cloud.gateway.httpclient.max-initial-line-length Longueur maximale de la ligne initiale.
spring.cloud.gateway.httpclient.pool.acquire-timeout Uniquement pour le type FIXED, durée maximale d’attente pour l’acquisition en millisecondes.
spring.cloud.gateway.httpclient.pool.eviction-interval Procède régulièrement à des vérifications d’éviction en arrière-plan à un intervalle spécifié. Désactivé par défaut ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Uniquement pour le type FIXED, nombre maximal de connexions avant de commencer l’acquisition en attente sur les connexions existantes.
spring.cloud.gateway.httpclient.pool.max-idle-time Durée en millisecondes après laquelle le canal est fermé. Si NULL, il n’y a pas de durée d’inactivité maximale.
spring.cloud.gateway.httpclient.pool.max-life-time Durée après laquelle le canal est fermé. Si NULL, il n’y a pas de durée de vie maximale.
spring.cloud.gateway.httpclient.pool.metrics Active la collecte des métriques des pools de canaux et leur enregistrement dans Micrometer. Désactivé par défaut. false
spring.cloud.gateway.httpclient.pool.name Par défaut, le nom du mappage du pool de canaux est proxy. proxy
spring.cloud.gateway.httpclient.pool.type Type de pool pour le HttpClient à utiliser, la valeur par défaut étant ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Délai d’expiration des réponses.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Délai d’expiration du vidage de close_notify SSL. La valeur par défaut est 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Délai d’expiration de la lecture de close_notify SSL. La valeur par défaut est 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Délai d’expiration de l’établissement d’une liaison SSL. La valeur par défaut est 10000 ms.. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Installe le InsecureTrustManagerFactory Netty. Cela n’est ni sécurisé ni adapté à la production. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Longueur maximale de la charge utile des trames.
spring.cloud.gateway.httpclient.websocket.proxy-ping Trames ping proxysées vers les services en aval. La valeur par défaut est true. true
spring.cloud.gateway.httpclient.wiretap Active le débogage Wiretap pour le HttpClient Netty. false
spring.cloud.gateway.httpserver.wiretap Active le débogage Wiretap pour le HttpServer Netty. false
spring.cloud.gateway.metrics.enabled Active la collecte des données de métriques. false
spring.cloud.gateway.metrics.prefix Préfixe de toutes les métriques émis par la passerelle. spring.cloud.gateway
spring.cloud.gateway.metrics.tags Mappage des balises ajoutées aux métriques.
spring.cloud.gateway.observability.enabled Si la prise en charge de Micrometer Observability doit être activée. true

Configurations courantes

La liste suivante décrit les configurations courantes :

  • Configurations relatives à la journalisation :
    • logging.level.*
    • logging.group.*
    • Toute autre configuration sous l’espace de noms logging.* doit être interdite. Par exemple, l’écriture de fichiers journaux avec logging.file doit être interdite.