Dela via


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

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.

  1. 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 och spring.cloud.config.server.git.password.
  2. Logga in på Azure med Azure CLI.

    az login
    
  3. Skapa en resursgrupp.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. 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.

  1. 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
    
  2. 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 . Egenskapen refresh-rate anger hur ofta Container Apps ska söka efter ändringar i Git-lagringsplatsen.

Binda din containerapp till komponenten Config Server for Spring Java

  1. 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ärdet 0.

  2. 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_IMPORTkan 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 truetar 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-nistp384eller 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 falseignorerar 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älp logging.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.
  • 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 till false så att servern returnerar en HTTP-status 404 om programmet inte hittas. Som standard är den här flaggan inställd på true.
  • 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.

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:

  1. 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));
            }
        }
    }
    
  2. 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 och refresh-interval är inställt på 60 sekunder.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Lägg till @RefreshScope koden. I följande exempel uppdateras variabeln connectTimeout 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:

  1. Lägg till den krypterade egenskapen i .properties-filen på git-lagringsplatsen.

    Filen bör likna följande exempel:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. 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:

  1. Lägg till den krypterade egenskapen i .properties-filen på git-lagringsplatsen.

  2. 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
    
  3. Lägg till dekrypteringsnyckeln ENCRYPT_KEY=randomKey som en miljövariabel i klientappen.

    Alternativt, om du inkluderar spring-cloud-starter-bootstrapclasspath, eller som spring.cloud.bootstrap.enabled=true en systemegenskap, anger du encrypt.key i bootstrap.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