Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 server di configurazione Java per Spring.
Il componente Config Server for 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.
In questa esercitazione, tu apprendi come:
- Creare un server di configurazione per il componente 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 servizi che possono influire sulla fattura Azure. Se si decide di seguire la procedura dettagliata, assicurarsi di eliminare le risorse menzionate in questa guida 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 utilizza Config Server per Spring all'interno di App contenitore di Azure, si raccomanda di considerare i seguenti dettagli:
| Articolo | Spiegazione |
|---|---|
| Scope | Il Config Server per Spring viene eseguito nello stesso ambiente dell'app contenitore connessa. |
| Ridimensionamento | Per mantenere un'unica fonte attendibile, il Config Server per Spring non è scalabile. 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 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’associazione inietta 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. |
Configurazione
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 LOCATIONPosizione dell'area Azure in cui si crea l'app contenitore e il componente Java. ENVIRONMENTNome dell'ambiente App contenitore di Azure per l'applicazione demo. RESOURCE_GROUPNome del gruppo di risorse Azure per l'applicazione demo. JAVA_COMPONENT_NAMENome del componente Java creato per l'app contenitore. In questo caso, si crea un componente Config Server per Spring Java. IMAGEL'immagine del container utilizzata nell'app del container. URIÈ possibile sostituire l'URI con l'URL del repository Git, se privato, aggiungere le configurazioni di autenticazione correlate, spring.cloud.config.server.git.usernamead esempio espring.cloud.config.server.git.password.Accedere a Azure con il interfaccia della riga di comando di Azure.
az loginCreare un gruppo di risorse.
az group create --name $RESOURCE_GROUP --location $LOCATIONCrea 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 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=$URIAggiornare 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=60In questo caso si indica al componente dove trovare il repository che contiene le informazioni di configurazione tramite la proprietà
uri. Larefresh-rateproprietà indica alle app contenitore la frequenza con cui verificare la presenza di modifiche nel repository Git.
Associare l'applicazione container al componente Config Server per Spring Java
Creare l'app contenitore che consuma 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.fqdnQuesto 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
connectTimeoutrestituito è il valore predefinito di0.Collegarsi al Config Server per Spring.
Dopo aver creato l'app contenitore e il server di configurazione, è possibile associarli al comando
updateall'app contenitore.az containerapp update \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --bind $JAVA_COMPONENT_NAMEIl parametro
--bind $JAVA_COMPONENT_NAMEcrea 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 estratto dalla proprietà connectionTimeout nel file 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 desidera personalizzare il proprio SPRING_CONFIG_IMPORT, è possibile fare riferimento alla variabile di ambiente SPRING_CLOUD_CONFIG_COMPONENT_URI, ad esempio, è possibile eseguire l'override da argomenti della riga di comando, ad esempio Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.
È anche possibile rimuovere un'associazione dall'applicazione.
(Facoltativo) Annullare l'associazione dell'applicazione contenitore dal componente Config Server per Spring Java
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, rimuovi eventuali modifiche locali e prendi 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 controllare un ramo denominato master. Se si desidera disabilitare il comportamento del ramo di fallback, è possibile impostare spring.cloud.config.server.git.tryMasterBranch su 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 eseguire il check-out di 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 porta a un avvio più lento ma a una prima query più veloce. |
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 dell'host. |
spring.cloud.config.server.git.repos.{repoName} |
URI del repository remoto. |
spring.cloud.config.server.git.repos.{repoName}.pattern |
Il formato dello schema è 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.filedeve essere vietata.
spring.cloud.config.server.overrides- Mappa aggiuntiva per una sorgente di proprietà da inviare a tutti i client senza condizioni.
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=trueflag , 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. L'operazione di sovrascrittura viene effettuata inserendo due proprietà nella configurazione dell'applicazione fornite 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
spring.cloud.config.server.accept-emptysufalsein modo che il server restituisca uno stato HTTP404se l'applicazione non viene trovata. Per impostazione predefinita, questo flag è impostato sutrue.
- È possibile impostare
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
falseper disabilitare la decrittografia lato server.
- Impostare questa proprietà su
Aggiorna
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
autorefreshe 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 sufalseerefresh-intervalè impostato su 60 secondi.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refreshAggiungere
@RefreshScopenel codice. Nell'esempio seguente la variabileconnectTimeoutviene 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:
Aggiungi la proprietà crittografata nel file .properties nel repository Git.
Il file dovrebbe essere simile all'esempio seguente:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282fAggiornare 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 questi passaggi:
Aggiungere la proprietà crittografata nel file .properties nel repository Git.
Aggiornare il componente Config Server per 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=falseNell'app client aggiungere la chiave
ENCRYPT_KEY=randomKeydi decrittografia come variabile di ambiente.In alternativa, se si include
spring-cloud-starter-bootstrapsuclasspath, o se si impostaspring.cloud.bootstrap.enabled=truecome proprietà di sistema, si deve impostareencrypt.keyinbootstrap.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