Condividi tramite


Connettersi a un gateway gestito per Spring in App contenitore di Azure (anteprima)

Il gateway per Spring offre un modo efficiente e potente per instradare, gestire e gestire le richieste API come parte di un'architettura di microservizi. Funge da gateway API che instrada richieste esterne a servizi diversi, aggiungendo diverse funzionalità, ad esempio il filtro, il bilanciamento del carico e altro ancora. Questo articolo illustra come creare un gateway che indirizza le richieste alle app contenitore.

In questa esercitazione, imparerai a:

  • Creare un gateway per il componente Spring Java
  • Aggiornare il gateway per spring con route personalizzate per reindirizzare le richieste alle app contenitore

Importante

Questa esercitazione usa servizi che possono influire sulla fattura Azure. Se decidi di seguire passo-passo, assicurati di eliminare le risorse in questo articolo per evitare addebiti imprevisti.

Prerequisiti

Considerazioni

Quando si esegue il Gateway di Spring in App contenitore di Azure, tenere presenti i dettagli seguenti:

Elemento Spiegazione
Scope Il gateway per Spring viene eseguito nello stesso ambiente dell'app contenitore connessa.
Risorse L'allocazione delle risorse del contenitore per Gateway per Spring è fissa, il numero di core CPU è 0,5 e la dimensione della memoria è 1Gi.
Prezzi Il gateway per la fatturazione Spring rientra nei prezzi basati sul consumo. Le risorse utilizzate dai componenti Java gestiti vengono fatturate alle tariffe attive/inattive. È possibile eliminare i componenti che non sono più in uso per interrompere la fatturazione.

Configurazione

Prima di iniziare a usare il gateway per Spring, è prima necessario creare le risorse necessarie.

Eseguire i comandi seguenti per creare il gruppo di risorse e l'ambiente delle App contenitore.

  1. Creare le variabili per supportare la configurazione dell'applicazione. Questi valori vengono forniti ai fini dello svolgimento di questa lezione. In questa lezione, usiamo l'endpoint dell'actuator di admin per l'app spring sample.

    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"
    
    Variabile Descrizione
    LOCATION Posizione dell'area Azure in cui si crea l'app contenitore e il componente Java.
    ENVIRONMENT Nome dell'ambiente App contenitore di Azure per l'applicazione demo.
    RESOURCE_GROUP Nome del gruppo di risorse Azure per l'applicazione demo.
    JAVA_COMPONENT_NAME Nome del componente Java creato per l'app contenitore. In questo caso, si crea un componente Gateway per Spring Java.
    IMAGE L'immagine del container utilizzata nell'app del container.
  2. Accedere a Azure con il interfaccia della riga di comando di Azure.

    az login
    
  3. Creare un gruppo di risorse.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Crea l'ambiente delle tue app container.

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

    Questo ambiente viene usato per ospitare sia il componente Gateway per Spring che l'app contenitore.

Usare il componente Gateway per Spring Java

Ora che si dispone di un ambiente Container Apps, è possibile creare la container app usando un gateway per i componenti Java Spring per instradare le richieste verso di essi.

  1. Creare il componente Gateway per Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Creare l'app contenitore con il nome di dominio completo (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
    

    Questo comando restituisce l'URL dell'app contenitore che utilizza i dati di configurazione. Copiare l'URL in un editor di testo in modo da poterlo usare nel passaggio successivo.

Aggiornare le rotte del gateway per instradare le richieste

  1. Creare un file YAML con il contenuto seguente. Sostituire <MYAPP_URL> con il nome di dominio completo dell'app contenitore del passaggio precedente.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Esegui il comando seguente per aggiornare il componente Gateway per Spring con la configurazione di routing.

    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
    

    Questo comando aggiorna la route del gateway e restituisce l'URL del gateway che utilizza i dati di configurazione.

    Il comando restituisce l'URL del gateway. Visitare questo URL con il percorso /myapp/health dovrebbe instradare la richiesta all'endpoint dell'applicazione actuator/health, restituendo {"status":"UP","groups":["liveness","readiness"]}.

Pulire le risorse

Le risorse create in questa esercitazione hanno effetto sulla fattura di Azure. Se non si intende usare questi servizi a lungo termine, eseguire il comando seguente per rimuovere tutti gli elementi creati in questa esercitazione.

az group delete --resource-group $RESOURCE_GROUP

Formato del file di route

Il componente Gateway per Spring supporta la definizione di route tramite proprietà con ID, URI, predicati e filtri. Per altre informazioni, vedere la documentazione di Spring Cloud Gateway. Di seguito è riportato un esempio di file YAML che illustra come configurare queste proprietà.

  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}"

Elenco della configurazione autorizzata per il gateway per Spring (#proprietà-configurabili)

La tabella seguente descrive le proprietà del componente gateway che è possibile configurare per l'app. Per altre informazioni, vedere Proprietà comuni dell'applicazione Spring Cloud Gateway.

Nome della proprietà Descrizione Valore predefinito
spring.cloud.gateway.default-filters Elenco di definizioni di filtro applicate a ogni route.
spring.cloud.gateway.enabled Abilita la funzionalità del gateway. true
spring.cloud.gateway.fail-on-route-definition-error Opzione per fallire in caso di errori nella definizione della route, il valore predefinito è vero. In caso contrario, viene registrato un avviso. true
spring.cloud.gateway.handler-mapping.order L'ordine di RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Flag che abilita l'integrazione DiscoveryClient del gateway. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Espressione SpEL che valuta se includere un servizio nell'integrazione del gateway o meno. Il valore predefinito è true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opzione per in minuscolo serviceId nei predicati e nei filtri. Il valore predefinito è false. Utile con Eureka quando serviceId viene automaticamente reso maiuscolo. Quindi, MYSERVICE corrisponderebbe /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix Il prefisso predefinito per routeId è discoveryClient.getClass().getSimpleName() + "_". L'ID servizio viene aggiunto per creare il routeId.
spring.cloud.gateway.discovery.locator.url-expression Espressione SpEL che crea l'URI per ogni route. Il valore predefinito è 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled Abilita il add-request-header filtro. true
spring.cloud.gateway.filter.add-request-parameter.enabled Abilita il add-request-parameter filtro. true
spring.cloud.gateway.filter.add-response-header.enabled Abilita il add-response-header filtro. true
spring.cloud.gateway.filter.circuit-breaker.enabled Abilita il circuit-breaker filtro. true
spring.cloud.gateway.filter.dedupe-response-header.enabled Abilita il dedupe-response-header filtro. true
spring.cloud.gateway.filter.fallback-headers.enabled Abilita il fallback-headers filtro. true
spring.cloud.gateway.filter.hystrix.enabled Abilita il hystrix filtro. true
spring.cloud.gateway.filter.json-to-grpc.enabled Abilita il filtro JSON per gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled Abilita il local-response-cache filtro. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Dimensione massima della cache per espellere le voci per questo percorso in KB, MB e GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Tempo di scadenza di una voce della cache, espresso in s per i secondi, m per i minuti e h per le ore. 5m
spring.cloud.gateway.filter.map-request-header.enabled Abilita il map-request-header filtro. true
spring.cloud.gateway.filter.modify-request-body.enabled Abilita il modify-request-body filtro. true
spring.cloud.gateway.filter.modify-response-body.enabled Abilita il modify-response-body filtro. true
spring.cloud.gateway.filter.prefix-path.enabled Abilita il prefix-path filtro. true
spring.cloud.gateway.filter.preserve-host-header.enabled Abilita il preserve-host-header filtro. true
spring.cloud.gateway.filter.redirect-to.enabled Abilita il redirect-to filtro. 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 Abilita il remove-request-header filtro. true
spring.cloud.gateway.filter.remove-request-parameter.enabled Abilita il remove-request-parameter filtro. true
spring.cloud.gateway.filter.remove-response-header.enabled Abilita il remove-response-header filtro. true
spring.cloud.gateway.filter.request-header-size.enabled Abilita il request-header-size filtro. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled Abilita il request-header-to-request-uri filtro. 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 Abilita il request-rate-limiter filtro. true
spring.cloud.gateway.filter.request-size.enabled Abilita il request-size filtro. true
spring.cloud.gateway.filter.retry.enabled Abilita il retry filtro. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled Abilita il rewrite-location-response-header filtro. true
spring.cloud.gateway.filter.rewrite-location.enabled Abilita il rewrite-location filtro. true
spring.cloud.gateway.filter.rewrite-path.enabled Abilita il rewrite-path filtro. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled Abilita il rewrite-request-parameter filtro. true
spring.cloud.gateway.filter.rewrite-response-header.enabled Abilita il rewrite-response-header filtro. true
spring.cloud.gateway.filter.save-session.enabled Abilita il save-session filtro. 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 Abilita il secure-headers filtro. 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 Abilita il set-path filtro. true
spring.cloud.gateway.filter.set-request-header.enabled Abilita il set-request-header filtro. true
spring.cloud.gateway.filter.set-request-host-header.enabled Abilita il set-request-host-header filtro. true
spring.cloud.gateway.filter.set-response-header.enabled Abilita il set-response-header filtro. true
spring.cloud.gateway.filter.set-status.enabled Abilita il set-status filtro. true
spring.cloud.gateway.filter.strip-prefix.enabled Abilita il strip-prefix filtro. true
spring.cloud.gateway.forwarded.enabled Abilita l'oggetto ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled Abilita il adapt-cached-body filtro globale. true
spring.cloud.gateway.global-filter.forward-path.enabled Abilita il forward-path filtro globale. true
spring.cloud.gateway.global-filter.forward-routing.enabled Abilita il forward-routing filtro globale. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled Abilita il load-balancer-client filtro globale. true
spring.cloud.gateway.global-filter.local-response-cache.enabled Abilita il local-response-cache filtro per tutte le route, che consente di aggiungere una configurazione specifica a livello di route usando un LocalResponseCache filtro. true
spring.cloud.gateway.global-filter.netty-routing.enabled Abilita il netty-routing global filtro. true
spring.cloud.gateway.global-filter.netty-write-response.enabled Abilita il netty-write-response filtro globale. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled Abilita il reactive-load-balancer-client filtro globale. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled Abilita il remove-cached-body filtro globale. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled Abilita il route-to-request-url filtro globale. true
spring.cloud.gateway.global-filter.websocket-routing.enabled Abilita il websocket-routing filtro globale. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Se la configurazione CORS globale deve essere aggiunta al gestore URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header Nome dell'intestazione che restituisce la configurazione della capacità burst. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Indica se includere o meno intestazioni contenenti informazioni sul limitatore di tasso. Il valore predefinito è true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nome dell'intestazione che restituisce il numero di richieste rimanenti nel corso del secondo attuale. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header Nome dell'intestazione che restituisce la configurazione della velocità di rifornimento. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header Nome dell'intestazione che restituisce la configurazione dei token richiesti. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Limita l'accesso a metodi e proprietà in SpEL. true
spring.cloud.gateway.predicate.after.enabled Abilita il after predicato. true
spring.cloud.gateway.predicate.before.enabled Abilita il before predicato. true
spring.cloud.gateway.predicate.between.enabled Abilita il between predicato. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled Abilita il cloud-foundry-route-service predicato. true
spring.cloud.gateway.predicate.cookie.enabled Abilita il cookie predicato. true
spring.cloud.gateway.predicate.header.enabled Abilita il header predicato. true
spring.cloud.gateway.predicate.host.enabled Abilita il host predicato. true
spring.cloud.gateway.predicate.host.include-port Includere la porta nella corrispondenza del nome host. true
spring.cloud.gateway.predicate.method.enabled Abilita il method predicato. true
spring.cloud.gateway.predicate.path.enabled Abilita il path predicato. true
spring.cloud.gateway.predicate.query.enabled Abilita il query predicato. true
spring.cloud.gateway.predicate.read-body.enabled Abilita il read-body predicato. true
spring.cloud.gateway.predicate.remote-addr.enabled Abilita il remote-addr predicato. true
spring.cloud.gateway.predicate.weight.enabled Abilita il weight predicato. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled Abilita il xforwarded-remote-addr predicato. true
spring.cloud.gateway.set-status.original-status-header-name Nome dell'intestazione che contiene il codice HTTP della richiesta proxy.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Indica se XForwardedHeadersFilter è abilitato. true
spring.cloud.gateway.x-forwarded.for-append Se l'aggiunta di X-Forwarded-For come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.for-enabled Indica se X-Forwarded-For è abilitato. true
spring.cloud.gateway.x-forwarded.host-append Se l'aggiunta X-Forwarded-Host come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.host-enabled Indica se X-Forwarded-Host è abilitato. true
spring.cloud.gateway.x-forwarded.order L'ordine del XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Se l'aggiunta di X-Forwarded-Port come lista è abilitata. true
spring.cloud.gateway.x-forwarded.port-enabled Indica se X-Forwarded-Port è abilitato. true
spring.cloud.gateway.x-forwarded.prefix-append Se l'aggiunta di X-Forwarded-Prefix come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.prefix-enabled Indica se X-Forwarded-Prefix è abilitato. true
spring.cloud.gateway.x-forwarded.proto-append Se l'aggiunta di X-Forwarded-Proto come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.proto-enabled Indica se X-Forwarded-Proto è abilitato. true
spring.cloud.gateway.httpclient.compression Abilita la compressione per Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout Timeout per la connessione in millisecondi. Il valore predefinito è 30s.
spring.cloud.gateway.httpclient.max-header-size Dimensione massima dell'intestazione della risposta.
spring.cloud.gateway.httpclient.max-initial-line-length Lunghezza massima riga iniziale.
spring.cloud.gateway.httpclient.pool.acquire-timeout Solo per il tipo FIXED, il tempo massimo in millisecondi di attesa per l'acquisizione.
spring.cloud.gateway.httpclient.pool.eviction-interval Eseguire controlli regolari di rimozione in background a un intervallo specificato. Disabilitato per impostazione predefinita ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Solo per il tipo di connessione FIXED, il numero massimo di connessioni prima di avviare l'acquisizione in sospeso delle connessioni esistenti.
spring.cloud.gateway.httpclient.pool.max-idle-time Tempo in millisecondi dopo il quale il canale viene chiuso. Se NULL, non c'è tempo massimo di inattività.
spring.cloud.gateway.httpclient.pool.max-life-time Durata dopo la quale il canale viene chiuso. Se NULL, non c'è tempo massimo di vita.
spring.cloud.gateway.httpclient.pool.metrics Consente di raccogliere e registrare le metriche dei pool di canali in Micrometer. Disabilitato per impostazione predefinita. false
spring.cloud.gateway.httpclient.pool.name Nome della mappa del pool di canali. Il valore predefinito è proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo di pool da utilizzare per HttpClient, il valore predefinito è ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Timeout della risposta.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Timeout di svuotamento del buffer SSL close_notify. Il valore predefinito è 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Timeout di lettura SSL close_notify . Il valore predefinito è 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Timeout dell'handshake SSL. Il valore predefinito è 10000 ms.. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Installa Netty InsecureTrustManagerFactory. Questo valore non è sicuro e non è adatto per la produzione. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Lunghezza massima del payload del frame.
spring.cloud.gateway.httpclient.websocket.proxy-ping Eseguire il ping dei frame proxy ai servizi downstream. Il valore predefinito è true. true
spring.cloud.gateway.httpclient.wiretap Abilita il debug wiretap per Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Abilita il debug wiretap per Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Abilita la raccolta di dati delle metriche. false
spring.cloud.gateway.metrics.prefix Prefisso di tutte le metriche generate dal gateway. spring.cloud.gateway
spring.cloud.gateway.metrics.tags La mappa dei tag che è stata aggiunta alle metriche.
spring.cloud.gateway.observability.enabled Indica se il supporto di Micrometer Observability deve essere attivato. true

Configurazioni comuni

L'elenco seguente descrive le configurazioni comuni:

  • Registrazione delle configurazioni correlate:
    • logging.level.*
    • logging.group.*
    • Tutte le altre configurazioni nello spazio dei nomi logging.* non devono essere consentite. Ad esempio, la scrittura di file di log tramite logging.file non deve essere consentita.