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
- 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 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.
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 espring.cloud.config.server.git.password
.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 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.
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
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
. Larefresh-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
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 di0
.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=true
esempio .
È 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-ed25519 ecdsa-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 tramitelogging.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.
- È 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.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 HTTP404
se l'applicazione non viene trovata. Per impostazione predefinita, questo flag è impostato sutrue
.
- È possibile impostare su
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.
- Impostare questa proprietà su
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:
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)); } } }
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 sufalse
erefresh-interval
è impostato su 60 secondi.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
Aggiungere
@RefreshScope
nel codice. Nell'esempio seguente la variabileconnectTimeout
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:
Aggiungere la proprietà crittografata nel file con estensione properties nel repository Git.
Il file dovrebbe essere simile all'esempio seguente:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
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:
Aggiungere la proprietà crittografata nel file con estensione properties nel repository Git.
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
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 impostatospring.cloud.bootstrap.enabled=true
come proprietà diclasspath
sistema, impostareencrypt.key
inbootstrap.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