Připojení ke spravovanému konfiguračnímu serveru pro Spring v Azure Container Apps

Konfigurační server for Spring poskytuje centralizované umístění pro zpřístupnění konfiguračních dat více aplikacím. V tomto článku se dozvíte, jak připojit aplikaci hostované v Azure Container Apps k instanci Java Config Server for Spring.

Komponenta Konfigurační server pro Spring Java používá jako zdroj pro nastavení konfigurace úložiště GitHub. Hodnoty konfigurace jsou pro vaši aplikaci kontejneru zpřístupněny prostřednictvím vazby mezi komponentou a vaší aplikací kontejneru. Když se hodnoty změní na konfiguračním serveru, automaticky přetékají do vaší aplikace, a to vše bez nutnosti opětovného kompilace nebo opětovného nasazení aplikace.

V tomto kurzu se naučíte:

  • Vytvoření konfiguračního serveru pro komponentu Spring Java
  • Připojte konfigurační server pro Spring k aplikaci kontejneru.
  • Sledujte hodnoty konfigurace před a po připojení konfiguračního serveru k aplikaci.
  • Šifrování a dešifrování hodnot konfigurace pomocí symetrického klíče

Důležité

V tomto návodu se používají služby, které mohou ovlivnit vaše vyúčtování za Azure. Pokud se rozhodnete postupovat podle podrobných pokynů, nezapomeňte odstranit prostředky doporučené v tomto článku, abyste se vyhnuli neočekávané fakturaci.

Požadavky

  • Účet Azure s aktivním předplatným. Pokud ho ještě nemáte, můžete si ho zdarma vytvořit.
  • Azure CLI.

Hlediska

Při spuštění na konfiguračním serveru pro Spring v Azure Container Apps mějte na paměti následující podrobnosti:

Položka Vysvětlení
Scope Konfigurační server pro Spring běží ve stejném prostředí jako připojená aplikace kontejneru.
Škálování Aby se zachoval jediný zdroj pravdy, konfigurační server pro Spring se neškáluje. Vlastnosti minReplicas škálování a maxReplicas obě jsou nastaveny na 1.
Materiály Přidělení prostředků kontejneru pro konfigurační server pro Spring je pevné, počet jader procesoru je 0,5 a velikost paměti je 1Gi.
Ceny Konfigurační server Spring pro účtování se řídí cenami založenými na spotřebě. Prostředky spotřebované spravovanými komponentami Java se účtují podle sazeb za aktivní a nečinné stavy. K zastavení fakturace můžete odstranit komponenty, které se už nepoužívají.
Binding Aplikace kontejneru se připojí ke konfiguračnímu serveru pro Spring prostřednictvím vazby. Vázání vkládá konfigurace do proměnných prostředí aplikace kontejneru. Po vytvoření vazby může aplikace kontejneru číst konfigurační hodnoty z proměnných prostředí.

Nastavení

Než začnete pracovat s konfiguračním serverem for Spring, musíte nejprve vytvořit požadované prostředky.

Spuštěním následujících příkazů vytvořte skupinu prostředků a prostředí Container Apps.

  1. Vytvořte proměnné pro podporu konfigurace aplikace. Tyto hodnoty jsou k dispozici pro účely této lekce.

    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"
    
    Proměnná Popis
    LOCATION Umístění Azure oblasti, kde vytvoříte aplikaci kontejneru a Java komponentu.
    ENVIRONMENT Název Azure Container Apps prostředí pro vaši ukázkovou aplikaci.
    RESOURCE_GROUP Název skupiny prostředků Azure pro ukázkovou aplikaci.
    JAVA_COMPONENT_NAME Název komponenty Java vytvořené pro vaši aplikaci kontejneru. V tomto případě vytvoříte konfigurační server pro komponentu Spring Java.
    IMAGE Image kontejneru použitá v aplikaci kontejneru.
    URI Identifikátor URI můžete nahradit adresou URL vašeho úložiště Git. Pokud je soukromé, přidejte související konfigurace ověřování, jako je spring.cloud.config.server.git.username a spring.cloud.config.server.git.password.
  2. Přihlaste se k Azure pomocí Azure CLI.

    az login
    
  3. Vytvořte skupinu prostředků.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Vytvořte prostředí kontejnerových aplikací.

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

Toto prostředí slouží k hostování komponenty Config Server for Spring Java i aplikace kontejneru.

Vytvoření komponenty Config Server for Spring Java

Teď, když máte prostředí Container Apps, můžete vytvořit aplikaci kontejneru a svázat ji s komponentou Config Server for Spring Java. Když připojíte svou kontejnerovou aplikaci, hodnoty konfigurace se automaticky synchronizují z komponenty Config Serveru do vaší aplikace.

  1. Vytvořte komponentu 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. Aktualizujte konfigurační server pro komponentu 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
    

    Tady říkáte komponentě, kde najít úložiště, které obsahuje informace o konfiguraci prostřednictvím uri vlastnosti. Tato refresh-rate vlastnost říká Container Apps, jak často se mají kontrolovat změny v úložišti Git.

Připojte svou kontejnerovou aplikaci ke komponentě Config Server pro Spring Java

  1. Vytvořte aplikaci kontejneru, která využívá konfigurační data.

    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
    

    Tento příkaz vrátí adresu URL vaší aplikace kontejneru, která využívá konfigurační data. Zkopírujte adresu URL do textového editoru, abyste ji mohli použít v nadcházejícím kroku.

    Pokud aplikaci navštívíte v prohlížeči, je vrácená connectTimeout hodnota výchozí hodnotou 0.

  2. Vytvořte vazbu na konfigurační server pro Spring.

    Teď, když se vytvoří aplikace kontejneru a konfigurační server, svážete je společně s příkazem update k vaší aplikaci kontejneru.

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

    Parametr --bind $JAVA_COMPONENT_NAME vytvoří propojení mezi vaší aplikací kontejneru a komponentou konfigurace.

Jakmile jsou aplikace kontejneru a komponenta konfiguračního serveru svázané, změny konfigurace se automaticky synchronizují s aplikací kontejneru.

Když znovu navštívíte adresu URL aplikace, hodnota connectTimeout je nyní 10000. Tato hodnota pochází z úložiště Git nastaveného v $URI proměnné původně nastavené jako zdroj konfigurační komponenty. Konkrétně se tato hodnota načítá z connectionTimeout vlastnosti v application.yml souboru úložiště.

Žádost o připojení injektuje konfigurační nastavení do aplikace jako proměnné prostředí. Tyto hodnoty jsou nyní k dispozici pro kód aplikace, který se má použít při načítání nastavení konfigurace z konfiguračního serveru.

V tomto případě jsou pro aplikaci k dispozici následující proměnné prostředí:

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

Pokud chcete přizpůsobit vlastní SPRING_CONFIG_IMPORT, můžete odkazovat na proměnnou prostředí SPRING_CLOUD_CONFIG_COMPONENT_URI – například můžete použít argumenty příkazového řádku pro přepsání, jako je Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

Můžete také odebrat vazbu z aplikace.

(Volitelné) Zrušení vazby aplikace kontejneru z komponenty Config Server for Spring Java

Pokud chcete odebrat vazbu z aplikace kontejneru, použijte tuto --unbind možnost.

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

Když znovu navštívíte adresu URL aplikace, hodnota connectTimeout se změní zpět na 0adresu URL aplikace.

Uvolnit zdroje

Prostředky vytvořené v tomto kurzu mají vliv na fakturu za Azure. Pokud tyto služby nebudete používat dlouhodobě, spuštěním následujícího příkazu odeberte vše vytvořené v tomto kurzu.

az group delete --resource-group $RESOURCE_GROUP

Možnosti konfigurace

Příkaz az containerapp update používá --configuration parametr k řízení konfigurace konfiguračního serveru pro Spring. Můžete použít více parametrů najednou, pokud jsou oddělené mezerou. Další informace naleznete v tématu Spring Cloud Config Server.

Následující tabulka popisuje různé dostupné hodnoty konfigurace back-endu Gitu:

Název Popis
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
Identifikátor URI vzdáleného úložiště
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Uživatelské jméno pro ověřování pomocí vzdáleného úložiště
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Heslo pro ověřování pomocí vzdáleného úložiště
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Cesty hledání, které se mají použít v místní pracovní kopii. Ve výchozím nastavení prohledá pouze kořen.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Příznak označující, že úložiště by mělo vynutit stažení. Pokud true, zahodíte všechny místní změny a vezměte z vzdáleného úložiště.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Výchozí popisek použitý pro Git je hlavní. Pokud nenastavíte spring.cloud.config.server.git.default-label a větev s názvem main neexistuje, konfigurační server se ve výchozím nastavení také pokusí získat větev s názvem master. Pokud chcete zakázat chování náhradní větve, můžete nastavit spring.cloud.config.server.git.tryMasterBranch na hodnotu false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Konfigurační server se ve výchozím nastavení pokusí přepnout na větev s názvem master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Nastavením vlastnosti git.skipSslValidation na true můžete zakázat ověřování TLS/SSL certifikátu serveru Git konfiguračním serverem.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Příznak označující, že úložiště by se mělo naklonovat při spuštění, ne na vyžádání. Obecně vede k pomalejšímu spuštění, ale rychlejšímu prvnímu dotazu.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Časový limit v sekundách pro získání připojení HTTP nebo SSH, pokud je k dispozici. Výchozí hodnota je 5 sekund.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Jak často konfigurační server načítá aktualizovaná konfigurační data z back-endu Gitu.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Platný privátní klíč SSH. Musí být nastaveno, pokud ignore-local-ssh-settings je true a identifikátor URI Gitu je ve formátu SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Platný klíč hostitele SSH. Musí být nastavena i v případě, že host-key-algorithm je nastavena.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Jeden z ssh-dss, , ssh-rsassh-ed25519, ecdsa-sha2-nistp256, , ecdsa-sha2-nistp384nebo ecdsa-sha2-nistp521. Musí být nastavena i v případě, že host-key je nastavena.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true nebo false. Pokud false, chyby s klíčem hostitele ignorovat.
spring.cloud.config.server.git.repos.{repoName} Identifikátor URI vzdáleného úložiště
spring.cloud.config.server.git.repos.{repoName}.pattern Formát šablony je čárkami oddělený seznam {application}/{profile} názvů se zástupnými znaky. Pokud {application}/{profile} neodpovídá žádnému ze vzorů, použije výchozí identifikátor URI definovaný v části.

Následující seznam popisuje běžné konfigurace:

  • Konfigurace související s protokolováním

    • logging.level.*
    • logging.group.*
    • Všechny ostatní konfigurace v logging.* oboru názvů by měly být zakázané – například zápis souborů protokolu pomocí logging.file by měl být zakázán.
  • spring.cloud.config.server.overrides

    • Dodatečná mapa vlastností zdroje, která má být bezpodmínečně odeslána všem klientům.
  • spring.cloud.config.override-none

    • Prioritu všech přepsání v klientovi můžete změnit tak, aby se více přibližovala výchozím hodnotám, což umožňuje aplikacím specifikovat jejich vlastní hodnoty pomocí proměnných prostředí nebo vlastností systému, nastavením spring.cloud.config.override-none=true příznaku – výchozí hodnota je false – ve vzdáleném úložišti.
  • spring.cloud.config.allow-override

    • Pokud povolíte režim "config first bootstrap", můžete umožnit, aby klientské aplikace přepsaly konfiguraci ze serveru konfigurací. Přenastavení se provádí tím, že se dvě vlastnosti umístí do konfiguračního nastavení aplikací pocházejícího z konfiguračního serveru.
  • spring.cloud.config.server.health.*

    • Indikátor stavu můžete nakonfigurovat tak, aby kontroloval více aplikací a přidával vlastní nastavení a vlastní označení.
  • spring.cloud.config.server.accept-empty

    • Můžete nastavit spring.cloud.config.server.accept-empty , false aby server vrátil stav HTTP 404 , pokud aplikace nebyla nalezena. Ve výchozím nastavení je tento příznak nastaven na true.
  • Šifrování a dešifrování (symetrické):

    • encrypt.key
      • Pohodlné použití symetrického klíče, protože se jedná o jednu hodnotu vlastnosti ke konfiguraci.
    • spring.cloud.config.server.encrypt.enabled
      • Nastavte tuto vlastnost na false pro zakázání dešifrování na straně serveru.

Obnovit

Služby, které využívají vlastnosti, musí vědět o změně, než k ní dojde. Výchozí metoda oznámení pro konfigurační server pro Spring zahrnuje ruční aktivaci události aktualizace, například aktualizaci voláním https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, což nemusí být možné, pokud existuje mnoho instancí aplikace.

Místo toho můžete hodnoty z konfiguračního serveru automaticky aktualizovat tak, že necháte klienta konfigurace pravidelně kontrolovat změny na základě intervalu aktualizace. Pomocí následujících kroků můžete automaticky aktualizovat hodnoty z konfiguračního serveru:

  1. Zaregistrujte naplánovanou úlohu pro aktualizaci kontextu v daném intervalu, jak je znázorněno v následujícím příkladu:

    @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. Povolte autorefresh a nastavte odpovídající interval aktualizace v souboru application.yml . V následujícím příkladu se klient dotazuje na změnu konfigurace každých 60 sekund, což je minimální hodnota, kterou můžete nastavit pro interval aktualizace.

    Ve výchozím nastavení je autorefresh nastaveno na false a refresh-interval je nastaveno na 60 sekund.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Přidejte @RefreshScope do kódu. V následujícím příkladu se proměnná connectTimeout automaticky aktualizuje každých 60 sekund:

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

Šifrování a dešifrování pomocí symetrického klíče

Dešifrování na straně serveru

Ve výchozím nastavení je povolené šifrování na straně serveru. Pomocí následujících kroků povolte dešifrování ve vaší aplikaci:

  1. Přidejte zašifrovanou vlastnost do souboru .properties v úložišti Git.

    Soubor by měl vypadat jako na následujícím příkladu:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Aktualizujte komponentu Config Server for Spring Java tak, aby používala úložiště Git, které má zašifrovanou vlastnost, a nastavte šifrovací klíč.

    Před spuštěním následujícího příkazu nahraďte zástupné symboly ohraničené <> hodnotami.

    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
    

Dešifrování na straně klienta

Dešifrování vlastností na straně klienta můžete použít pomocí následujících kroků:

  1. Přidejte zašifrovanou vlastnost do souboru .properties v úložišti Git.

  2. Aktualizujte komponentu Config Server for Spring Java tak, aby používala úložiště Git, které má zašifrovanou vlastnost, a zakažte dešifrování na straně serveru.

    Před spuštěním následujícího příkazu nahraďte zástupné symboly ohraničené <> hodnotami.

    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. V klientské aplikaci přidejte dešifrovací klíč ENCRYPT_KEY=randomKey jako proměnnou prostředí.

    Případně pokud zahrnete spring-cloud-starter-bootstrap do objektu classpath, nebo nastavíte spring.cloud.bootstrap.enabled=true jako systémovou vlastnost, nastavte encrypt.key v bootstrap.properties.

    Před spuštěním následujícího příkazu nahraďte zástupné symboly ohraničené <> hodnotami.

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