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
- Compte Azure avec un abonnement actif. Si vous n’en avez pas déjà, vous pouvez en créer un gratuitement.
- Azure CLI.
À 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.
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. Connectez-vous à Azure avec Azure CLI.
az login
Créez un groupe de ressources.
az group create --name $RESOURCE_GROUP --location $LOCATION
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.
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 \
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
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}"
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 terminaisonactuator/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 aveclogging.file
doit être interdite.