Condividi tramite


Esercitazione: connettersi a Server Config gestito per Spring in App contenitore di Azure

Config Server per Spring fornisce una posizione centralizzata per rendere i dati di configurazione disponibili per più applicazioni. Questo articolo illustra come connettere un'app ospitata in App Contenitore di Azure a un Config Server Java per Spring.

Il componente Config Server per Spring Java usa un repository GitHub come origine per le impostazioni di configurazione. I valori di configurazione vengono resi disponibili per l'app contenitore tramite un'associazione tra il componente e l'app contenitore. Man mano che i valori cambiano nel server di configurazione, passano automaticamente all'applicazione, senza dover ricompilare o ridistribuire l'applicazione.

Questa esercitazione apprendi come:

  • Creare un componente Config Server per Spring Java
  • Associare il Config Server per Spring all'app contenitore
  • Osservare i valori di configurazione prima e dopo la connessione del config server all'applicazione
  • Crittografare e decrittografare i valori di configurazione con una chiave simmetrica

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 Config Server per Spring in App contenitore di Azure, si tengano presenti i dettagli seguenti:

Articolo Spiegazione
Scope Il Config Server per Spring viene eseguito nello stesso ambiente dell'app contenitore connessa.
Ridimensionamento Per mantenere una singola origine di verità, il Config Server per Spring non viene ridimensionato. Le proprietà di ridimensionamento minReplicas e maxReplicas sono entrambe impostate su 1.
Risorse L'allocazione delle risorse del contenitore per Config Server per Spring è fissa, il numero di core CPU è 0,5 e la dimensione della memoria è 1Gi.
Prezzi La fatturazione di Config Server per Spring rientra nei prezzi basati sul consumo. Le risorse utilizzate dai componenti Java gestiti vengono fatturate in base alle tariffe attive/inattive. È possibile eliminare i componenti che non sono più in uso per interrompere la fatturazione.
Binding L'app contenitore si connette a un server di configurazione per Spring tramite un'associazione. L’associazioni inserisce le configurazioni nelle variabili di ambiente dell'app contenitore. Dopo aver stabilito un'associazione, l'app contenitore può leggere i valori di configurazione dalle variabili di ambiente.

Attrezzaggio

Prima di iniziare a lavorare con Config Server per Spring, occorre innanzitutto 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.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-services-resource-group
    export ENVIRONMENT=my-environment
    export JAVA_COMPONENT_NAME=configserver
    export APP_NAME=my-config-client
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-service-config-client:latest"
    export URI="https://github.com/Azure-Samples/azure-spring-cloud-config-java-aca.git"
    
    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, creare un componente Java di Config Server per Spring.
    IMAGE Immagine del contenitore usata nell'app contenitore.
    URI È possibile sostituire l'URI con l'URL del repository Git, se privato, aggiungere le configurazioni di autenticazione correlate, spring.cloud.config.server.git.username ad esempio e spring.cloud.config.server.git.password.
  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 Config Server per Spring java che l'app contenitore.

Creare il componente Config Server per Spring Java

Ora che si dispone di un ambiente App contenitore, è possibile creare l'app contenitore e associarla a un componente Config Server per Spring java. Quando si associa l'app contenitore, i valori di configurazione vengono sincronizzati automaticamente dal componente del server di configurazione all'applicazione.

  1. Creare il componente Config Server per Spring Java.

    az containerapp env java-component config-server-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 1 \
        --max-replicas 1 \
        --configuration spring.cloud.config.server.git.uri=$URI
    
  2. Aggiornare il componente Config Server per Spring Java.

    az containerapp env java-component config-server-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
        --min-replicas 2 \
        --max-replicas 2 \
        --configuration spring.cloud.config.server.git.uri=$URI spring.cloud.config.server.git.refresh-rate=60
    

    In questo caso si indica al componente dove trovare il repository che contiene le informazioni di configurazione tramite la proprietà uri. La refresh-rate proprietà indica alle app contenitore la frequenza con cui verificare la presenza di modifiche nel repository Git.

Associare l'app contenitore al componente Java di Config Server per Spring

  1. Creare l'app contenitore che utilizza i dati di configurazione.

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --min-replicas 1 \
        --max-replicas 1 \
        --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 in un passaggio successivo.

    Se si visita l'app in un browser, il valore connectTimeout restituito è il valore predefinito di 0.

  2. Eseguire l'associazione al Config Server per Spring.

    Dopo aver creato l'app contenitore e il server di configurazione, è possibile associarli al comando update all'app contenitore.

    az containerapp update \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --bind $JAVA_COMPONENT_NAME
    

    Il parametro --bind $JAVA_COMPONENT_NAME crea il collegamento tra l'app contenitore e il componente di configurazione.

Dopo aver associato l'app contenitore e il componente Config Server, le modifiche alla configurazione vengono sincronizzate automaticamente con l'app contenitore.

Quando si visita nuovamente l'URL dell'app, il valore di connectTimeout è ora 10000. Questo valore proviene dal repository Git impostato nella $URI variabile originariamente impostata come origine del componente di configurazione. In particolare, questo valore viene disegnato dalla proprietà connectionTimeout nel file di application.yml del repository.

La richiesta di associazione inserisce l'impostazione di configurazione nell'applicazione come variabili di ambiente. Questi valori sono ora disponibili per il codice dell'applicazione da usare per il recupero delle impostazioni di configurazione dal server di configurazione.

In questo caso, le variabili di ambiente seguenti sono disponibili per l'applicazione:

SPRING_CLOUD_CONFIG_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CLOUD_CONFIG_COMPONENT_URI=http://[JAVA_COMPONENT_INTERNAL_FQDN]:80
SPRING_CONFIG_IMPORT=optional:configserver:$SPRING_CLOUD_CONFIG_URI

Se si vuole personalizzare il proprio SPRING_CONFIG_IMPORT, è possibile fare riferimento alla variabile SPRING_CLOUD_CONFIG_COMPONENT_URI di ambiente, ad esempio eseguendo l'override degli argomenti della riga di comando, ad Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=trueesempio .

È anche possibile rimuovere un'associazione dall'applicazione.

(Facoltativo) Annullare l'associazione dell'app contenitore dal componente Java Server Config per Spring

Per rimuovere un'associazione da un'app contenitore, usare l'opzione --unbind.

az containerapp update \
    --name $APP_NAME \
    --unbind $JAVA_COMPONENT_NAME \
    --resource-group $RESOURCE_GROUP

Quando si visita nuovamente l'URL dell'app, il valore di connectTimeout cambia in 0.

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

Opzioni di configurazione

Il az containerapp update comando usa il --configuration parametro per controllare la configurazione del server di configurazione per Spring. È possibile usare più parametri contemporaneamente, purché siano separati da uno spazio. Per altre informazioni, vedere Spring Cloud Config Server.

La tabella seguente descrive i diversi valori di configurazione back-end Git disponibili:

Nome Descrizione
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI del repository remoto.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Nome utente per l'autenticazione con repository remoto.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Password per l'autenticazione con repository remoto.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Percorsi di ricerca da usare all'interno della copia di lavoro locale. Per impostazione predefinita, cerca solo la radice.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Flag per indicare che il repository deve forzare il pull. Se true, rimuovere eventuali modifiche locali e acquisire dal repository remoto.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
L'etichetta predefinita usata per Git è main. Se non si imposta spring.cloud.config.server.git.default-label e non esiste un ramo denominato main , il server di configurazione per impostazione predefinita prova anche a eseguire il checkout di un ramo denominato master. Se si vuole disabilitare il comportamento del ramo di fallback, è possibile impostare su spring.cloud.config.server.git.tryMasterBranch false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Per impostazione predefinita, il server di configurazione tenta di estrarre un ramo denominato master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
È possibile disabilitare la convalida del server di configurazione del certificato TLS/SSL del server Git impostando la git.skipSslValidation proprietà su true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Flag per indicare che il repository deve essere clonato all'avvio, non su richiesta. In genere si verifica un avvio più lento ma più veloce della prima query.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Timeout in secondi per ottenere la connessione HTTP o SSH, se applicabile. Il valore predefinito è 5 secondi.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Frequenza con cui il server di configurazione recupera i dati di configurazione aggiornati dal back-end Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Chiave privata SSH valida. Deve essere impostato se ignore-local-ssh-settings è true e l'URI Git è in formato SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Chiave host SSH valida. Deve essere impostato anche se host-key-algorithm è impostato.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Uno di ssh-dss, ssh-rsa, ssh-ed25519ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, o ecdsa-sha2-nistp521. Deve essere impostato anche se host-key è impostato.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true o false. Se false, ignorare gli errori con la chiave host.
spring.cloud.config.server.git.repos.{repoName} URI del repository remoto.
spring.cloud.config.server.git.repos.{repoName}.pattern Il formato del criterio è un elenco delimitato da virgole di {application}/{profile} nomi con caratteri jolly. Se {application}/{profile} non corrisponde ad alcun modello, usa l'URI predefinito definito in .

L'elenco seguente descrive le configurazioni comuni:

  • Registrazione delle configurazioni correlate:

    • logging.level.*
    • logging.group.*
    • Tutte le altre configurazioni nello logging.* spazio dei nomi devono essere vietate, ad esempio la scrittura di file di log tramite logging.file deve essere vietata.
  • spring.cloud.config.server.overrides

    • Mappa aggiuntiva per un'origine di proprietà da inviare a tutti i client in modo incondizionato.
  • spring.cloud.config.override-none

    • È possibile modificare la priorità di tutte le sostituzioni nel client in modo che siano più simili ai valori predefiniti, consentendo alle applicazioni di fornire i propri valori nelle variabili di ambiente o nelle proprietà di sistema, impostando il spring.cloud.config.override-none=true flag , il valore predefinito è false, nel repository remoto.
  • spring.cloud.config.allow-override

    • Se si abilita il primo bootstrap di configurazione, è possibile consentire alle applicazioni client di eseguire l'override della configurazione dal server di configurazione inserendo due proprietà all'interno della configurazione delle applicazioni provenienti dal server di configurazione.
  • spring.cloud.config.server.health.*

    • È possibile configurare l'indicatore di integrità per controllare più applicazioni insieme a profili personalizzati ed etichette personalizzate.
  • spring.cloud.config.server.accept-empty

    • È possibile impostare su spring.cloud.config.server.accept-empty false in modo che il server restituisca uno stato HTTP 404 se l'applicazione non viene trovata. Per impostazione predefinita, questo flag è impostato su true.
  • Crittografia e decrittografia (simmetrica):

    • encrypt.key
      • È utile quando si usa una chiave simmetrica perché si tratta di un singolo valore di proprietà da configurare.
    • spring.cloud.config.server.encrypt.enabled
      • Impostare questa proprietà su false per disabilitare la decrittografia lato server.

Refresh

I servizi che utilizzano le proprietà devono conoscere una modifica prima che si verifichi. Il metodo di notifica predefinito per Config Server per Spring prevede l'attivazione manuale dell'evento di aggiornamento, ad esempio un aggiornamento tramite chiamata https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, che potrebbe non essere fattibile se sono presenti molte istanze dell'app.

È invece possibile aggiornare automaticamente i valori dal server di configurazione consentendo al client di configurazione di eseguire il polling delle modifiche in base a un aggiornamento interno. Seguire questa procedura per aggiornare automaticamente i valori dal server di configurazione:

  1. Registrare un'attività pianificata per aggiornare il contesto in un determinato intervallo, come illustrato nell'esempio seguente:

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. Abilitare autorefresh e impostare l'intervallo di aggiornamento appropriato nel file application.yml . Nell'esempio seguente il client esegue il polling di una modifica della configurazione ogni 60 secondi, ovvero il valore minimo che è possibile impostare per un intervallo di aggiornamento.

    Per impostazione predefinita, autorefresh è impostato su false e refresh-interval è impostato su 60 secondi.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Aggiungere @RefreshScope nel codice. Nell'esempio seguente la variabile connectTimeout viene aggiornata automaticamente ogni 60 secondi:

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

Crittografia e decrittografia con una chiave simmetrica

Decrittografia lato server

Per impostazione predefinita, la crittografia lato server è abilitata. Usare la procedura seguente per abilitare la decrittografia nell'applicazione:

  1. Aggiungere la proprietà crittografata nel file con estensione properties nel repository Git.

    Il file dovrebbe essere simile all'esempio seguente:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Aggiornare il componente Config Server per Spring Java per usare il repository Git con la proprietà crittografata e impostare la chiave di crittografia.

    Prima di eseguire il comando seguente, sostituire i segnaposto racchiusi tra <> con i valori personalizzati.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

Decrittografia lato client

È possibile usare la decrittografia lato client delle proprietà seguendo questa procedura:

  1. Aggiungere la proprietà crittografata nel file con estensione properties nel repository Git.

  2. Aggiornare il componente Config Server for Spring Java per usare il repository Git con la proprietà crittografata e disabilitare la decrittografia lato server.

    Prima di eseguire il comando seguente, sostituire i segnaposto racchiusi tra <> con i valori personalizzati.

    az containerapp env java-component config-server-for-spring update \
        --environment <ENVIRONMENT_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --name <JAVA_COMPONENT_NAME> \
        --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. Nell'app client aggiungere la chiave ENCRYPT_KEY=randomKey di decrittografia come variabile di ambiente.

    In alternativa, se si include spring-cloud-starter-bootstrap in o impostato spring.cloud.bootstrap.enabled=true come proprietà di classpathsistema, impostare encrypt.key in bootstrap.properties.

    Prima di eseguire il comando seguente, sostituire i segnaposto racchiusi tra <> con i valori personalizzati.

    az containerapp update \
        --name <APP_NAME> \
        --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey