Delen via


Zelfstudie: Verbinding maken met een beheerde configuratieserver voor Spring in Azure Container Apps

Config Server voor Spring biedt een gecentraliseerde locatie om configuratiegegevens beschikbaar te maken voor meerdere toepassingen. In dit artikel leert u hoe u een app die wordt gehost in Azure Container Apps verbindt met een Java Config Server voor Spring-exemplaar.

Voor het onderdeel Config Server voor Spring Java wordt een GitHub-opslagplaats gebruikt als bron voor configuratie-instellingen. Configuratiewaarden worden beschikbaar gemaakt voor uw container-app via een binding tussen het onderdeel en uw container-app. Naarmate de waarden in de configuratieserver veranderen, stromen ze automatisch naar uw toepassing, allemaal zonder dat u uw toepassing opnieuw hoeft te compileren of opnieuw te implementeren.

In deze zelfstudie leert u het volgende:

  • Een configuratieserver voor Spring Java-onderdeel maken
  • De configuratieserver voor Spring binden aan uw container-app
  • Bekijk configuratiewaarden voor en na het verbinden van de configuratieserver met uw toepassing
  • Configuratiewaarden versleutelen en ontsleutelen met een symmetrische sleutel

Belangrijk

In deze zelfstudie worden services gebruikt die van invloed kunnen zijn op uw Azure-factuur. Als u besluit stapsgewijs te volgen, moet u ervoor zorgen dat u de resources verwijdert die in dit artikel worden weergegeven om onverwachte facturering te voorkomen.

Vereisten

  • Een Azure-account met een actief abonnement. Als u er nog geen hebt, kunt u er gratis een maken.
  • Azure CLI.

Overwegingen

Houd rekening met de volgende details bij uitvoering in Config Server for Spring in Azure Container Apps:

Artikel Uitleg
Scope De configuratieserver voor Spring wordt uitgevoerd in dezelfde omgeving als de verbonden container-app.
Schalen Om één bron van waarheid te behouden, wordt de Config Server voor Spring niet geschaald. De schaaleigenschappen minReplicas en maxReplicas beide zijn ingesteld op 1.
Bronnen De toewijzing van containerresources voor Config Server voor Spring is opgelost, het aantal CPU-kernen is 0,5 en de geheugengrootte is 1Gi.
Prijzen De configuratieserver voor Spring-facturering valt onder de prijzen op basis van verbruik. Resources die door beheerde Java-onderdelen worden verbruikt, worden gefactureerd tegen de actieve/niet-actieve tarieven. U kunt onderdelen verwijderen die niet meer worden gebruikt om de facturering te stoppen.
Bindend De container-app maakt via een binding verbinding met een configuratieserver voor Spring. De binding injecteert configuraties in omgevingsvariabelen voor container-apps. Nadat een binding tot stand is gebracht, kan de container-app configuratiewaarden lezen uit omgevingsvariabelen.

Instellingen

Voordat u met de configuratieserver voor Spring gaat werken, moet u eerst de vereiste resources maken.

Voer de volgende opdrachten uit om uw resourcegroep en Container Apps-omgeving te maken.

  1. Maak variabelen ter ondersteuning van uw toepassingsconfiguratie. Deze waarden worden voor u verstrekt voor de doeleinden van deze les.

    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"
    
    Variabele Beschrijving
    LOCATION De Azure-regiolocatie waar u uw container-app en Java-onderdeel maakt.
    ENVIRONMENT De naam van de Azure Container Apps-omgeving voor uw demotoepassing.
    RESOURCE_GROUP De naam van de Azure-resourcegroep voor uw demotoepassing.
    JAVA_COMPONENT_NAME De naam van het Java-onderdeel dat is gemaakt voor uw container-app. In dit geval maakt u een Config Server voor Spring Java-onderdeel.
    IMAGE De containerinstallatiekopieën die in uw container-app worden gebruikt.
    URI U kunt de URI vervangen door de URL van uw Git-opslagplaats. Als deze privé is, voegt u de bijbehorende verificatieconfiguraties toe, zoals spring.cloud.config.server.git.username en spring.cloud.config.server.git.password.
  2. Meld u aan bij Azure met de Azure CLI.

    az login
    
  3. Maak een resourcegroep.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Maak uw container-apps-omgeving.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

Deze omgeving wordt gebruikt voor het hosten van zowel de configuratieserver voor het Spring Java-onderdeel als uw container-app.

Het onderdeel Config Server voor Spring Java maken

Nu u een Container Apps-omgeving hebt, kunt u uw container-app maken en deze binden aan een Config Server voor Spring Java-onderdeel. Wanneer u uw container-app koppelt, worden configuratiewaarden automatisch gesynchroniseerd vanuit het onderdeel Configuratieserver met uw toepassing.

  1. Maak de configuratieserver voor het Spring Java-onderdeel.

    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. Werk de configuratieserver voor het Spring Java-onderdeel bij.

    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
    

    Hier vertelt u het onderdeel waar u de opslagplaats kunt vinden die uw configuratiegegevens bevat via de uri eigenschap. De refresh-rate eigenschap vertelt Container Apps hoe vaak moet worden gecontroleerd op wijzigingen in uw Git-opslagplaats.

Uw container-app verbinden met het onderdeel Config Server voor Spring Java

  1. Maak de container-app die configuratiegegevens verbruikt.

    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
    

    Met deze opdracht wordt de URL geretourneerd van uw container-app die configuratiegegevens verbruikt. Kopieer de URL naar een teksteditor, zodat u deze in een volgende stap kunt gebruiken.

    Als u uw app in een browser bezoekt, is de connectTimeout geretourneerde waarde de standaardwaarde van 0.

  2. Binden aan de configuratieserver voor Spring.

    Nu de container-app en de configuratieserver zijn gemaakt, verbindt u deze met de update opdracht aan uw container-app.

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

    De --bind $JAVA_COMPONENT_NAME parameter maakt de koppeling tussen uw container-app en het configuratieonderdeel.

Nadat de container-app en het onderdeel Config Server zijn gekoppeld, worden configuratiewijzigingen automatisch gesynchroniseerd met de container-app.

Wanneer u de URL van de app opnieuw bezoekt, is de waarde connectTimeout nu 10000. Deze waarde is afkomstig van de Git-opslagplaats die is ingesteld in de $URI variabele die oorspronkelijk is ingesteld als de bron van het configuratieonderdeel. Deze waarde wordt met name opgehaald uit de connectionTimeout eigenschap in het application.yml-bestand van de opslagplaats.

De bindingsaanvraag injecteert de configuratie-instelling in de toepassing als omgevingsvariabelen. Deze waarden zijn nu beschikbaar voor de toepassingscode die moet worden gebruikt bij het ophalen van configuratie-instellingen van de configuratieserver.

In dit geval zijn de volgende omgevingsvariabelen beschikbaar voor de toepassing:

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

Als u uw eigen SPRING_CONFIG_IMPORTvariabele wilt aanpassen, kunt u verwijzen naar de omgevingsvariabele SPRING_CLOUD_CONFIG_COMPONENT_URI , bijvoorbeeld door opdrachtregelargumenten te overschrijven, zoals Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

U kunt ook een binding uit uw toepassing verwijderen.

(Optioneel) De container-app ontkoppeld van het onderdeel Config Server voor Spring Java

Als u een binding uit een container-app wilt verwijderen, gebruikt u de --unbind optie.

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

Wanneer u de URL van de app opnieuw bezoekt, wordt de waarde van connectTimeout wijzigingen teruggezet naar 0.

Resources opschonen

De resources die in deze zelfstudie zijn gemaakt, hebben een effect op uw Azure-factuur. Als u deze services niet op de lange termijn gaat gebruiken, voert u de volgende opdracht uit om alles te verwijderen dat in deze zelfstudie is gemaakt.

az group delete --resource-group $RESOURCE_GROUP

Configuratieopties

De az containerapp update opdracht gebruikt de --configuration parameter om te bepalen hoe de configuratieserver voor Spring is geconfigureerd. U kunt meerdere parameters tegelijk gebruiken zolang ze worden gescheiden door een spatie. Zie Spring Cloud-configuratieserver voor meer informatie.

In de volgende tabel worden de verschillende beschikbare configuratiewaarden voor de Git-back-end beschreven:

Name Beschrijving
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI van externe opslagplaats.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Gebruikersnaam voor verificatie met externe opslagplaats.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Wachtwoord voor verificatie met externe opslagplaats.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Zoekpaden voor gebruik binnen lokale werkende kopie. Standaard wordt alleen in de hoofdmap gezocht.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Vlag om aan te geven dat de opslagplaats pull moet afdwingen. Als trueu lokale wijzigingen verwijdert en uit de externe opslagplaats neemt.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Het standaardlabel dat wordt gebruikt voor Git, is het belangrijkste label. Als u niet instelt spring.cloud.config.server.git.default-label en een vertakking met de naam main niet bestaat, probeert de configuratieserver standaard ook een vertakking met de naam master uit te checken. Als u het gedrag van de terugvalbranch wilt uitschakelen, kunt u instellen spring.cloud.config.server.git.tryMasterBranch op false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
De configuratieserver probeert standaard een vertakking met de naam master uit te checken.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
U kunt de validatie van de configuratieserver van het TLS/SSL-certificaat van de Git-server uitschakelen door de git.skipSslValidation eigenschap in te stellen op true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Vlag om aan te geven dat de opslagplaats moet worden gekloond bij het opstarten, niet op aanvraag. Over het algemeen leidt dit tot tragere opstart- maar snellere eerste query.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Time-out in seconden voor het verkrijgen van een HTTP- of SSH-verbinding, indien van toepassing. De standaardwaarde is 5 seconden.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Hoe vaak de configuratieserver bijgewerkte configuratiegegevens ophaalt uit uw Git-back-end.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Geldige persoonlijke SSH-sleutel. Moet worden ingesteld als ignore-local-ssh-settings dat het is true en de Git-URI de SSH-indeling heeft.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Geldige SSH-hostsleutel. Moet worden ingesteld als host-key-algorithm deze ook is ingesteld.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Een vanssh-dss, ssh-rsa, , ssh-ed25519, , ecdsa-sha2-nistp256of ecdsa-sha2-nistp521ecdsa-sha2-nistp384. Moet worden ingesteld als host-key deze ook is ingesteld.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true of false. Als false, negeer fouten met hostsleutel.
spring.cloud.config.server.git.repos.{repoName} URI van externe opslagplaats.
spring.cloud.config.server.git.repos.{repoName}.pattern De patroonindeling is een door komma's gescheiden lijst met {application}/{profile} namen met jokertekens. Als {application}/{profile} deze niet overeenkomt met een van de patronen, wordt de standaard-URI gebruikt die is gedefinieerd onder.

In de volgende lijst worden algemene configuraties beschreven:

  • Gerelateerde configuraties voor logboekregistratie:

    • logging.level.*
    • logging.group.*
    • Alle andere configuraties onder de logging.* naamruimte moeten verboden zijn, bijvoorbeeld het schrijven van logboekbestanden met behulp logging.file van moet verboden zijn.
  • spring.cloud.config.server.overrides

    • Extra kaart voor een eigenschapsbron die voorwaardelijke naar alle clients wordt verzonden.
  • spring.cloud.config.override-none

    • U kunt de prioriteit van alle onderdrukkingen in de client wijzigen zodat ze meer lijken op standaardwaarden, zodat toepassingen hun eigen waarden kunnen opgeven in omgevingsvariabelen of systeemeigenschappen door de spring.cloud.config.override-none=true vlag in te stellen - de standaardwaarde is onwaar - in de externe opslagplaats.
  • spring.cloud.config.allow-override

    • Als u de eerste bootstrap voor configuratie inschakelt, kunt u clienttoepassingen toestaan om de configuratie van de configuratieserver te overschrijven door twee eigenschappen in de configuratieconfiguratie van de toepassingen te plaatsen die afkomstig zijn van de configuratieserver.
  • spring.cloud.config.server.health.*

    • U kunt de statusindicator configureren om meer toepassingen te controleren, samen met aangepaste profielen en aangepaste labels.
  • spring.cloud.config.server.accept-empty

    • U kunt deze instellen spring.cloud.config.server.accept-empty false zodat de server een HTTP-status 404 retourneert als de toepassing niet wordt gevonden. Deze vlag is standaard ingesteld op true.
  • Versleuteling en ontsleuteling (symmetrisch):

    • encrypt.key
      • Handig wanneer u een symmetrische sleutel gebruikt, omdat deze één eigenschapswaarde is om te configureren.
    • spring.cloud.config.server.encrypt.enabled
      • Stel deze eigenschap in om ontsleuteling aan de serverzijde uit te false schakelen.

Vernieuwen

Services die eigenschappen verbruiken, moeten kennis hebben van een wijziging voordat deze plaatsvindt. De standaardmeldingsmethode voor Config Server voor Spring omvat het handmatig activeren van de vernieuwings gebeurtenis, zoals een vernieuwing per aanroep https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, wat mogelijk niet haalbaar is als er veel app-exemplaren zijn.

In plaats daarvan kunt u automatisch waarden vernieuwen van Config Server door de configuratieclient te laten peilen naar wijzigingen op basis van een interne vernieuwing. Gebruik de volgende stappen om automatisch waarden van de configuratieserver te vernieuwen:

  1. Registreer een geplande taak om de context in een bepaald interval te vernieuwen, zoals wordt weergegeven in het volgende voorbeeld:

    @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. Het juiste vernieuwingsinterval inschakelen autorefresh en instellen in het application.yml-bestand . In het volgende voorbeeld wordt elke 60 seconden een configuratiewijziging door de client gecontroleerd. Dit is de minimale waarde die u voor een vernieuwingsinterval kunt instellen.

    De standaardinstelling autorefresh is ingesteld op false en refresh-interval is ingesteld op 60 seconden.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Voeg uw code toe @RefreshScope . In het volgende voorbeeld wordt de variabele connectTimeout elke 60 seconden automatisch vernieuwd:

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

Versleuteling en ontsleuteling met een symmetrische sleutel

Ontsleuteling aan serverzijde

Versleuteling aan de serverzijde is standaard ingeschakeld. Gebruik de volgende stappen om ontsleuteling in te schakelen in uw toepassing:

  1. Voeg de versleutelde eigenschap toe aan uw .properties-bestand in uw Git-opslagplaats.

    Uw bestand zou er moeten uitzien zoals in het volgende voorbeeld:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Werk de configuratieserver voor Spring Java-onderdeel bij voor het gebruik van de Git-opslagplaats met de versleutelde eigenschap en stel de versleutelingssleutel in.

    Voordat u de volgende opdracht uitvoert, vervangt u tijdelijke aanduidingen tussen <> uw waarden.

    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
    

Ontsleuteling aan clientzijde

U kunt de ontsleuteling aan de clientzijde van eigenschappen gebruiken door de stappen te volgen:

  1. Voeg de versleutelde eigenschap toe aan uw .properties-bestand in uw Git-opslagplaats.

  2. Werk de configuratieserver voor Spring Java-onderdeel bij om de Git-opslagplaats met de versleutelde eigenschap te gebruiken en ontsleuteling aan de serverzijde uit te schakelen.

    Voordat u de volgende opdracht uitvoert, vervangt u tijdelijke aanduidingen tussen <> uw waarden.

    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. Voeg in uw client-app de ontsleutelingssleutel ENCRYPT_KEY=randomKey toe als een omgevingsvariabele.

    U kunt ook, als u spring-cloud-starter-bootstrap deze opneemt in de classpath, of instellen spring.cloud.bootstrap.enabled=true als een systeemeigenschap, instellen encrypt.key in bootstrap.properties.

    Voordat u de volgende opdracht uitvoert, vervangt u tijdelijke aanduidingen tussen <> uw waarden.

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