Självstudie: Ansluta till en hanterad konfigurationsserver för Spring i Azure Container Apps
Config Server for Spring tillhandahåller en central plats för att göra konfigurationsdata tillgängliga för flera program. I den här artikeln lär du dig att ansluta en app som finns i Azure Container Apps till en Java Config Server for Spring-instans.
Komponenten Config Server for Spring Java använder en GitHub-lagringsplats som källa för konfigurationsinställningar. Konfigurationsvärden görs tillgängliga för containerappen via en bindning mellan komponenten och containerappen. När värdena ändras på konfigurationsservern flödar de automatiskt till ditt program, allt utan att du behöver kompilera om eller distribuera om programmet.
I den här självstudien får du lära dig att:
- Skapa en konfigurationsserver för Spring Java-komponenten
- Binda konfigurationsservern för Spring till din containerapp
- Observera konfigurationsvärden före och efter anslutning av konfigurationsservern till ditt program
- Kryptera och dekryptera konfigurationsvärden med en symmetrisk nyckel
Viktigt!
I den här självstudien används tjänster som kan påverka din Azure-faktura. Om du bestämmer dig för att följa med steg för steg ska du ta bort resurserna i den här artikeln för att undvika oväntad fakturering.
Förutsättningar
- Ett Azure-konto med en aktiv prenumeration. Om du inte redan har en kan du skapa en kostnadsfritt.
- Azure CLI.
Att tänka på
När du kör i Config Server for Spring i Azure Container Apps bör du vara medveten om följande information:
Artikel | Förklaring |
---|---|
Definitionsområde | Konfigurationsservern för Spring körs i samma miljö som den anslutna containerappen. |
Skalning | För att upprätthålla en enda sanningskälla skalas inte Config Server for Spring. Skalningsegenskaperna minReplicas och maxReplicas är båda inställda på 1 . |
Resurser | Containerresursallokeringen för Config Server for Spring är fast, antalet CPU-kärnor är 0,5 och minnesstorleken är 1Gi. |
Prissättning | Config Server for Spring-faktureringen faller under förbrukningsbaserad prissättning. Resurser som används av hanterade Java-komponenter debiteras enligt aktiva/inaktiva priser. Du kan ta bort komponenter som inte längre används för att stoppa faktureringen. |
Bindande | Containerappen ansluter till en Config Server for Spring via en bindning. Bindningen matar in konfigurationer i miljövariabler för containerappar. När en bindning har upprättats kan containerappen läsa konfigurationsvärden från miljövariabler. |
Ställ in
Innan du börjar arbeta med Config Server for Spring måste du först skapa nödvändiga resurser.
Kör följande kommandon för att skapa resursgruppen och Container Apps-miljön.
Skapa variabler som stöd för programkonfigurationen. Dessa värden tillhandahålls för dig i den här lektionen.
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"
Olika beskrivning LOCATION
Den Plats i Azure-regionen där du skapar din containerapp och Java-komponent. ENVIRONMENT
Miljönamnet för Azure Container Apps för ditt demoprogram. RESOURCE_GROUP
Namnet på Azure-resursgruppen för demoprogrammet. JAVA_COMPONENT_NAME
Namnet på Java-komponenten som skapats för containerappen. I det här fallet skapar du en Config Server for Spring Java-komponent. IMAGE
Containeravbildningen som används i containerappen. URI
Du kan ersätta URI:n med git-lagringsplatsens URL, om den är privat, lägga till relaterade autentiseringskonfigurationer som spring.cloud.config.server.git.username
ochspring.cloud.config.server.git.password
.Logga in på Azure med Azure CLI.
az login
Skapa en resursgrupp.
az group create --name $RESOURCE_GROUP --location $LOCATION
Skapa din containerappmiljö.
az containerapp env create \ --name $ENVIRONMENT \ --resource-group $RESOURCE_GROUP \ --location $LOCATION
Den här miljön används för att vara värd för både komponenten Config Server for Spring java och din containerapp.
Skapa komponenten Config Server for Spring Java
Nu när du har en Container Apps-miljö kan du skapa din containerapp och binda den till en Config Server for Spring java-komponent. När du binder containerappen synkroniseras konfigurationsvärden automatiskt från komponenten Config Server till ditt program.
Skapa komponenten Config Server for 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
Uppdatera komponenten Config Server for 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
Här berättar du för komponenten var du hittar lagringsplatsen som innehåller konfigurationsinformationen
uri
via egenskapen . Egenskapenrefresh-rate
anger hur ofta Container Apps ska söka efter ändringar i Git-lagringsplatsen.
Binda din containerapp till komponenten Config Server for Spring Java
Skapa containerappen som använder konfigurationsdata.
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
Det här kommandot returnerar URL:en för din containerapp som använder konfigurationsdata. Kopiera URL:en till en textredigerare så att du kan använda den i ett kommande steg.
Om du besöker din app i en webbläsare är det
connectTimeout
värde som returneras standardvärdet0
.Bind till konfigurationsservern för Spring.
Nu när containerappen och konfigurationsservern har skapats binder du dem tillsammans med kommandot till containerappen
update
.az containerapp update \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --bind $JAVA_COMPONENT_NAME
Parametern
--bind $JAVA_COMPONENT_NAME
skapar länken mellan containerappen och konfigurationskomponenten.
När containerappen och komponenten Config Server har bundits samman synkroniseras konfigurationsändringar automatiskt till containerappen.
När du besöker appens URL igen är värdet connectTimeout
för nu 10000
. Det här värdet kommer från Git-lagringsplatsen i variabeln $URI
som ursprungligen angavs som källa för konfigurationskomponenten. Mer specifikt hämtas det här värdet från connectionTimeout
egenskapen i lagringsplatsens application.yml-fil .
Bindningsbegäran matar in konfigurationsinställningen i programmet som miljövariabler. Dessa värden är nu tillgängliga för programkoden som ska användas vid hämtning av konfigurationsinställningar från konfigurationsservern.
I det här fallet är följande miljövariabler tillgängliga för programmet:
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
Om du vill anpassa din egen SPRING_CONFIG_IMPORT
kan du referera till miljövariabeln SPRING_CLOUD_CONFIG_COMPONENT_URI
, till exempel kan du åsidosätta med kommandoradsargument, till exempel Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true
.
Du kan också ta bort en bindning från ditt program.
(Valfritt) Avbind din containerapp från komponenten Config Server for Spring Java
Om du vill ta bort en bindning från en containerapp använder du alternativet --unbind
.
az containerapp update \
--name $APP_NAME \
--unbind $JAVA_COMPONENT_NAME \
--resource-group $RESOURCE_GROUP
När du besöker appens URL igen ändras värdet connectTimeout
för tillbaka till 0
.
Rensa resurser
De resurser som skapas i den här självstudien påverkar din Azure-faktura. Om du inte ska använda dessa tjänster på lång sikt kör du följande kommando för att ta bort allt som skapats i den här självstudien.
az group delete --resource-group $RESOURCE_GROUP
Konfigurationsalternativ
Kommandot az containerapp update
använder parametern --configuration
för att styra hur konfigurationsservern för Spring konfigureras. Du kan använda flera parametrar samtidigt så länge de avgränsas med ett blanksteg. Mer information finns i Spring Cloud Config Server.
I följande tabell beskrivs de olika tillgängliga konfigurationsvärdena för Git-serverdelen:
Name | beskrivning |
---|---|
spring.cloud.config.server.git.uri spring.cloud.config.server.git.repos.{repoName}.uri |
URI för fjärrlagringsplats. |
spring.cloud.config.server.git.username spring.cloud.config.server.git.repos.{repoName}.username |
Användarnamn för autentisering med fjärrlagringsplats. |
spring.cloud.config.server.git.password spring.cloud.config.server.git.repos.{repoName}.password |
Lösenord för autentisering med fjärrlagringsplats. |
spring.cloud.config.server.git.search-paths spring.cloud.config.server.git.repos.{repoName}.search-paths |
Sökvägar som ska användas i en lokal arbetskopia. Som standard söker endast roten. |
spring.cloud.config.server.git.force-pull spring.cloud.config.server.git.repos.{repoName}.force-pull |
Flagga som anger att lagringsplatsen ska framtvinga pull-hämtning. Om true tar du bort eventuella lokala ändringar och tar från fjärrlagringsplatsen. |
spring.cloud.config.server.git.default-label spring.cloud.config.server.git.repos.{repoName}.default-label |
Standardetiketten som används för Git är huvudetiketten. Om du inte anger spring.cloud.config.server.git.default-label och en gren med namnet main inte finns försöker konfigurationsservern som standard också checka ut en gren med namnet master. Om du vill inaktivera beteendet för reservgrenen kan du ange spring.cloud.config.server.git.tryMasterBranch till false . |
spring.cloud.config.server.git.try-master-branch spring.cloud.config.server.git.repos.{repoName}.try-master-branch |
Konfigurationsservern försöker som standard checka ut en gren med namnet master. |
spring.cloud.config.server.git.skip-ssl-validation spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation |
Du kan inaktivera konfigurationsserverns validering av Git-serverns TLS/SSL-certifikat genom att ange git.skipSslValidation egenskapen till true . |
spring.cloud.config.server.git.clone-on-start spring.cloud.config.server.git.repos.{repoName}.clone-on-start |
Flagga som anger att lagringsplatsen ska klonas vid start, inte på begäran. Leder vanligtvis till långsammare start men snabbare första fråga. |
spring.cloud.config.server.git.timeout spring.cloud.config.server.git.repos.{repoName}.timeout |
Timeout i sekunder för att hämta HTTP- eller SSH-anslutning, om tillämpligt. Standardvärdet är 5 sekunder. |
spring.cloud.config.server.git.refresh-rate spring.cloud.config.server.git.repos.{repoName}.refresh-rate |
Hur ofta konfigurationsservern hämtar uppdaterade konfigurationsdata från din Git-serverdel. |
spring.cloud.config.server.git.private-key spring.cloud.config.server.git.repos.{repoName}.private-key |
Giltig privat SSH-nyckel. Måste anges om ignore-local-ssh-settings är true och Git-URI:n är i SSH-format. |
spring.cloud.config.server.git.host-key spring.cloud.config.server.git.repos.{repoName}.host-key |
Giltig SSH-värdnyckel. Måste anges om host-key-algorithm det också är inställt. |
spring.cloud.config.server.git.host-key-algorithm spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm |
En av ssh-dss , ssh-rsa , ssh-ed25519 , ecdsa-sha2-nistp256 , ecdsa-sha2-nistp384 eller ecdsa-sha2-nistp521 . Måste anges om host-key det också är inställt. |
spring.cloud.config.server.git.strict-host-key-checking spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking |
true eller false . Om false ignorerar du fel med värdnyckeln. |
spring.cloud.config.server.git.repos.{repoName} |
URI för fjärrlagringsplats. |
spring.cloud.config.server.git.repos.{repoName}.pattern |
Mönsterformatet är en kommaavgränsad lista med {application}/{profile} namn med jokertecken. Om {application}/{profile} inte matchar något av mönstren använder den standard-URI:n som definierats under. |
I följande lista beskrivs vanliga konfigurationer:
Loggningsrelaterade konfigurationer:
logging.level.*
logging.group.*
- Andra konfigurationer under
logging.*
namnområdet bör förbjudas, till exempel bör det vara förbjudet att skriva loggfiler med hjälplogging.file
av.
spring.cloud.config.server.overrides
- Extra karta för en egenskapskälla som ska skickas till alla klienter villkorslöst.
spring.cloud.config.override-none
- Du kan ändra prioriteten för alla åsidosättningar i klienten till mer som standardvärden, låta program ange sina egna värden i miljövariabler eller Systemegenskaper genom att ange
spring.cloud.config.override-none=true
flaggan – standardvärdet är falskt – på fjärrlagringsplatsen.
- Du kan ändra prioriteten för alla åsidosättningar i klienten till mer som standardvärden, låta program ange sina egna värden i miljövariabler eller Systemegenskaper genom att ange
spring.cloud.config.allow-override
- Om du aktiverar konfigurationens första bootstrap kan du tillåta att klientprogram åsidosätter konfigurationen från konfigurationsservern genom att placera två egenskaper i programkonfigurationen som kommer från konfigurationsservern.
spring.cloud.config.server.health.*
- Du kan konfigurera hälsoindikatorn för att kontrollera fler program tillsammans med anpassade profiler och anpassade etiketter.
spring.cloud.config.server.accept-empty
- Du kan ange
spring.cloud.config.server.accept-empty
tillfalse
så att servern returnerar en HTTP-status404
om programmet inte hittas. Som standard är den här flaggan inställd påtrue
.
- Du kan ange
Kryptering och dekryptering (symmetrisk):
encrypt.key
- Bekvämt när du använder en symmetrisk nyckel eftersom det är ett enda egenskapsvärde att konfigurera.
spring.cloud.config.server.encrypt.enabled
- Ange den här egenskapen till
false
för att inaktivera dekryptering på serversidan.
- Ange den här egenskapen till
Uppdatera
Tjänster som använder egenskaper måste känna till en ändring innan den sker. Standardmeddelandemetoden för Config Server for Spring innebär att uppdateringshändelsen utlöses manuellt, till exempel en uppdatering efter anrop https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh
, vilket kanske inte är möjligt om det finns många appinstanser.
I stället kan du automatiskt uppdatera värden från Config Server genom att låta konfigurationsklienten söka efter ändringar baserat på en intern uppdatering. Använd följande steg för att automatiskt uppdatera värden från Config Server:
Registrera en schemalagd aktivitet för att uppdatera kontexten i ett visst intervall, enligt följande exempel:
@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)); } } }
Aktivera
autorefresh
och ange lämpligt uppdateringsintervall i filen application.yml . I följande exempel söker klienten efter en konfigurationsändring var 60:e sekund, vilket är det minsta värde som du kan ange för ett uppdateringsintervall.Som standard
autorefresh
är inställt påfalse
ochrefresh-interval
är inställt på 60 sekunder.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
Lägg till
@RefreshScope
koden. I följande exempel uppdateras variabelnconnectTimeout
automatiskt var 60:e sekund:@RestController @RefreshScope public class HelloController { @Value("${timeout:4000}") private String connectTimeout; }
Kryptering och dekryptering med en symmetrisk nyckel
Dekryptering på serversidan
Som standard är kryptering på serversidan aktiverat. Använd följande steg för att aktivera dekryptering i ditt program:
Lägg till den krypterade egenskapen i .properties-filen på git-lagringsplatsen.
Filen bör likna följande exempel:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
Uppdatera komponenten Config Server for Spring Java för att använda Git-lagringsplatsen som har den krypterade egenskapen och ange krypteringsnyckeln.
Innan du kör följande kommando ersätter du platshållarna som omges av
<>
med dina värden.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
Dekryptering på klientsidan
Du kan använda dekryptering på klientsidan av egenskaper genom att följa stegen:
Lägg till den krypterade egenskapen i .properties-filen på git-lagringsplatsen.
Uppdatera komponenten Config Server for Spring Java för att använda Git-lagringsplatsen som har den krypterade egenskapen och inaktivera dekryptering på serversidan.
Innan du kör följande kommando ersätter du platshållarna som omges av
<>
med dina värden.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
Lägg till dekrypteringsnyckeln
ENCRYPT_KEY=randomKey
som en miljövariabel i klientappen.Alternativt, om du inkluderar
spring-cloud-starter-bootstrap
påclasspath
, eller somspring.cloud.bootstrap.enabled=true
en systemegenskap, anger duencrypt.key
ibootstrap.properties
.Innan du kör följande kommando ersätter du platshållarna som omges av
<>
med dina värden.az containerapp update \ --name <APP_NAME> \ --resource-group <RESOURCE_GROUP> \ --set-env-vars "ENCRYPT_KEY=randomKey"
encrypt: key: somerandomkey