Condividi tramite


Esercitazione: Connettersi a un gateway gestito per Spring in App Azure Container (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.

Questa esercitazione apprendi come:

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

Importante

Questa esercitazione usa i servizi che possono influire sulla fattura di Azure. Se si decide di seguire la procedura dettagliata, assicurarsi di eliminare le risorse in primo piano in questo articolo per evitare la fatturazione imprevista.

Prerequisiti

Considerazioni

Quando si esegue nel gateway per Spring nelle app Azure Container, tenere presenti i dettagli seguenti:

Articolo 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 in base alle tariffe attive/inattive. È possibile eliminare componenti che non sono più in uso per interrompere la fatturazione.

Attrezzaggio

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 viene usato l'endpoint dell'attuatore dell'amministratore 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 di Azure in cui si creano l'app contenitore e il componente Java.
    ENVIRONMENT Nome dell'ambiente di App contenitore di Azure per l'applicazione demo.
    RESOURCE_GROUP Nome del gruppo di risorse di 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 Immagine del contenitore usata nell'app contenitore.
  2. Accedere ad Azure con l'interfaccia della riga di comando di Azure.

    az login
    
  3. Creare un gruppo di risorse.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Creare l'ambiente nelle app contenitore.

    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 App contenitore, è possibile creare l'app contenitore usando un gateway per i componenti Java spring per instradarli.

  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 route 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. Eseguire il comando seguente per aggiornare il componente Gateway per Spring con la configurazione della route.

    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 deve instradare la richiesta all'endpoint dell'app 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 di configurazione consentito per il gateway per Spring (proprietà #configurable)

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 proprietà Descrizione Default value
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 che non riesce in caso di errori di definizione della route, il valore predefinito è true. In caso contrario, viene registrato un avviso. true
spring.cloud.gateway.handler-mapping.order 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 viene automaticamente maiuscolo serviceId. Quindi, MYSERVICE corrisponderebbe /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix Il prefisso per , routeIdper impostazione predefinita è discoveryClient.getClass().getSimpleName() + "_". L'ID servizio viene aggiunto per creare l'oggetto 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 Dimensioni massime della cache per rimuovere le voci per questa route in KB, MB e GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Tempo di scadenza di una voce della cache, espressa in secondi s , m per minuti e h 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 limite di velocità. Il valore predefinito è true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nome dell'intestazione che restituisce il numero di richieste rimanenti durante il secondo corrente. 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 XForwardedHeadersFilter Se è abilitato. true
spring.cloud.gateway.x-forwarded.for-append Se l'aggiunta X-Forwarded-For come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.for-enabled 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 Se X-Forwarded-Host è abilitato. true
spring.cloud.gateway.x-forwarded.order Ordine dell'oggetto XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Se l'aggiunta X-Forwarded-Port come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.port-enabled Se X-Forwarded-Port è abilitato. true
spring.cloud.gateway.x-forwarded.prefix-append Se l'aggiunta X-Forwarded-Prefix come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.prefix-enabled Se X-Forwarded-Prefix è abilitato. true
spring.cloud.gateway.x-forwarded.proto-append Se l'aggiunta X-Forwarded-Proto come elenco è abilitata. true
spring.cloud.gateway.x-forwarded.proto-enabled 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 connesso in millis. Il valore predefinito è 30s.
spring.cloud.gateway.httpclient.max-header-size Dimensioni massime 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 millis per attendere 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 FIXED, il numero massimo di connessioni prima di avviare l'acquisizione in sospeso su quelle esistenti.
spring.cloud.gateway.httpclient.pool.max-idle-time Tempo in millis 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 Il nome della mappa del pool di canali, per impostazione predefinita, è proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo di pool da HttpClient usare, il valore predefinito è ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Timeout della risposta.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Timeout di scaricamento SSL close_notify . 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 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 Mappa dei tag aggiunta alle metriche.
spring.cloud.gateway.observability.enabled Se è necessario attivare il supporto di Micrometer Observability. 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.