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
- Un account Azure con una sottoscrizione attiva. Se non ne hai già uno, puoi crearne uno gratuitamente.
- Interfaccia della riga di comando di Azure.
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.
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. Accedere ad Azure con l'interfaccia della riga di comando di Azure.
az login
Creare un gruppo di risorse.
az group create --name $RESOURCE_GROUP --location $LOCATION
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.
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 \
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
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}"
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'appactuator/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 , routeId per 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 tramitelogging.file
non deve essere consentita.