Udostępnij za pośrednictwem


Nawiązywanie połączenia z zarządzanym serwerem konfiguracji dla platformy Spring w Azure Container Apps

Serwer konfiguracji dla platformy Spring udostępnia scentralizowaną lokalizację, która udostępnia dane konfiguracji wielu aplikacjom. Z tego artykułu dowiesz się, jak połączyć aplikację hostowaną na platformie Azure Container Apps z instancją serwera konfiguracyjnego Java dla Spring.

Składnik Config Server for Spring Java używa repozytorium GitHub jako źródła ustawień konfiguracji. Wartości konfiguracji są udostępniane aplikacji kontenera za pośrednictwem powiązania między składnikiem a aplikacją kontenera. Gdy wartości zmieniają się na serwerze konfiguracji, automatycznie przepływają do aplikacji bez konieczności ponownego kompilowania lub ponownego wdrażania aplikacji.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Utwórz serwer konfiguracyjny dla komponentu Spring Java
  • Wiązanie serwera konfiguracji platformy Spring z aplikacją kontenera
  • Obserwowanie wartości konfiguracji przed i po połączeniu serwera konfiguracji z aplikacją
  • Szyfrowanie i odszyfrowywanie wartości konfiguracji przy użyciu klucza symetrycznego

Ważne

W tym samouczku są używane usługi, które mogą mieć wpływ na rachunek za Azure. Jeśli zdecydujesz się wykonać kroki krok po kroku, upewnij się, że usunięto zasoby opisane w tym artykule, aby uniknąć nieoczekiwanych rozliczeń.

Wymagania wstępne

  • Konto Azure z aktywną subskrypcją. Jeśli jeszcze go nie masz, możesz go utworzyć bezpłatnie.
  • Azure CLI.

Kwestie wymagające rozważenia

Podczas uruchamiania w środowisku Config Server for Spring w Azure Container Apps należy pamiętać o następujących szczegółach:

Towar Wyjaśnienie
Scope Serwer konfiguracji dla platformy Spring działa w tym samym środowisku co połączona aplikacja kontenera.
Skalowanie Aby zachować pojedyncze źródło prawdy, Serwer Konfiguracyjny Spring nie skaluje się. Właściwości skalowania minReplicas oraz maxReplicas są ustawione na wartość 1.
Zasoby Alokacja zasobów kontenera dla serwera konfiguracji spring jest stała, liczba rdzeni procesora CPU wynosi 0,5, a rozmiar pamięci to 1Gi.
Cennik Serwer konfiguracji dla rozliczeń platformy Spring jest objęty cenami opartymi na użyciu. Zasoby używane przez zarządzane składniki Java są rozliczane według stawek aktywnych/bezczynnych. Możesz usunąć składniki, które nie są już używane do zatrzymywania rozliczeń.
Powiązanie Aplikacja kontenera łączy się z serwerem konfiguracji platformy Spring za pośrednictwem powiązania. Powiązanie wprowadza konfiguracje do zmiennych środowiskowych aplikacji kontenera. Po ustanowieniu powiązania aplikacja kontenera może odczytywać wartości konfiguracji ze zmiennych środowiskowych.

Ustawienia

Przed rozpoczęciem pracy z programem Config Server for Spring należy najpierw utworzyć wymagane zasoby.

Wykonaj następujące polecenia, aby utworzyć grupę zasobów i środowisko usługi Container Apps.

  1. Utwórz zmienne do obsługi konfiguracji aplikacji. Te wartości są udostępniane na potrzeby tej lekcji.

    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"
    
    Zmienna opis
    LOCATION Lokalizacja regionu Azure, w którym tworzysz aplikację kontenera i komponent Java.
    ENVIRONMENT Nazwa środowiska Azure Container Apps dla aplikacji demonstracyjnej.
    RESOURCE_GROUP Nazwa grupy zasobów Azure dla aplikacji demonstracyjnej.
    JAVA_COMPONENT_NAME Nazwa składnika Java utworzonego dla aplikacji kontenera. W tym przypadku utworzysz składnik Config Server for Spring Java.
    IMAGE Obraz kontenera używany w aplikacji kontenera.
    URI Możesz zastąpić identyfikator URI adresem URL repozytorium Git, jeśli jest on prywatny, dodaj powiązane konfiguracje uwierzytelniania, takie jak spring.cloud.config.server.git.username i spring.cloud.config.server.git.password.
  2. Zaloguj się do Azure przy użyciu Azure CLI.

    az login
    
  3. Utwórz grupę zasobów.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Utwórz środowisko aplikacji kontenera.

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

To środowisko służy do hostowania zarówno składnika Config Server for Spring java, jak i aplikacji kontenera.

Utwórz składnik Config Server dla Spring Java

Teraz, gdy masz środowisko usługi Container Apps, możesz utworzyć aplikację kontenera i powiązać ją ze składnikiem Config Server for Spring Java. Po powiązaniu aplikacji kontenera wartości konfiguracji są automatycznie synchronizowane ze składnika serwera konfiguracji z aplikacją.

  1. Utwórz składnik Config Server dla 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. Zaktualizuj komponent Config Server dla 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
    

    W tym miejscu wskazujesz składnikowi, gdzie można znaleźć repozytorium zawierające informacje o konfiguracji za pomocą właściwości uri. Właściwość informuje usługę refresh-rate Container Apps, jak często należy sprawdzać zmiany w repozytorium Git.

Wiązanie aplikacji kontenera ze składnikiem Config Server for Spring Java

  1. Utwórz aplikację kontenera, która korzysta z danych konfiguracji.

    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
    

    To polecenie zwraca adres URL aplikacji kontenera, która korzysta z danych konfiguracji. Skopiuj adres URL do edytora tekstów, aby móc go użyć w kolejnym kroku.

    Jeśli odwiedzasz swoją aplikację w przeglądarce, wartość connectTimeout zwrócona to wartość domyślna 0.

  2. Połącz z Config Server dla Spring.

    Po utworzeniu aplikacji kontenera i serwera konfiguracji należy powiązać je razem za pomocą polecenia update w kontekście aplikacji kontenera.

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

    Parametr --bind $JAVA_COMPONENT_NAME tworzy połączenie między aplikacją kontenera a składnikiem konfiguracji.

Po połączeniu aplikacji kontenera i składnika serwera konfiguracji zmiany konfiguracji są automatycznie synchronizowane z aplikacją kontenera.

Gdy ponownie odwiedzisz adres URL aplikacji, wartość connectTimeout jest teraz 10000. Ta wartość pochodzi z repozytorium Git ustawionego w zmiennej $URI pierwotnie ustawionej jako źródło składnika konfiguracji. W szczególności ta wartość jest pobierana z connectionTimeout w pliku application.yml repozytorium.

Żądanie powiązania wprowadza ustawienie konfiguracji do aplikacji jako zmienne środowiskowe. Te wartości są teraz dostępne dla kodu aplikacji do użycia podczas pobierania ustawień konfiguracji z serwera konfiguracji.

W takim przypadku następujące zmienne środowiskowe są dostępne dla aplikacji:

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

Jeśli chcesz dostosować własną SPRING_CONFIG_IMPORT, możesz odwołać się do zmiennej środowiskowej SPRING_CLOUD_CONFIG_COMPONENT_URI - na przykład możesz zastąpić ją argumentami wiersza polecenia, takimi jak Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

Można również usunąć powiązanie z aplikacji.

(Opcjonalnie) Odłącz aplikację kontenera od składnika Config Server for Spring Java

Aby usunąć powiązanie z aplikacji kontenera, użyj --unbind opcji .

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

Gdy ponownie odwiedzisz adres URL aplikacji, wartość connectTimeout zmienia się z powrotem na 0.

Czyszczenie zasobów

Zasoby utworzone w tym samouczku mają wpływ na rachunek za Azure. Jeśli nie zamierzasz korzystać z tych usług długoterminowych, uruchom następujące polecenie, aby usunąć wszystkie elementy utworzone w tym samouczku.

az group delete --resource-group $RESOURCE_GROUP

Opcje konfiguracji

Polecenie az containerapp update używa parametru --configuration do kontrolowania sposobu konfigurowania serwera konfiguracji dla platformy Spring. Można używać wielu parametrów jednocześnie, o ile są one oddzielone spacją. Aby uzyskać więcej informacji, zobacz Spring Cloud Config Server.

W poniższej tabeli opisano różne dostępne wartości konfiguracji zaplecza Git:

Nazwa/nazwisko opis
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
Identyfikator URI repozytorium zdalnego.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Nazwa użytkownika na potrzeby uwierzytelniania za pomocą repozytorium zdalnego.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Hasło do uwierzytelniania za pomocą repozytorium zdalnego.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Wyszukaj ścieżki do użycia w ramach lokalnej kopii roboczej. Domyślnie wyszukuje tylko katalog główny.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Flaga wskazująca, że repozytorium powinno wymusić ściąganie. W przypadku true odrzucić wszystkie lokalne zmiany i pobrać je ze zdalnego repozytorium.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Domyślna etykieta używana w usłudze Git jest główna. Jeśli nie ustawisz spring.cloud.config.server.git.default-label i nie istnieje gałąź o nazwie main, serwer konfiguracji domyślnie spróbuje również wyewidencjonować gałąź o nazwie master. Jeśli chcesz wyłączyć zachowanie gałęzi rezerwowej, możesz ustawić wartość spring.cloud.config.server.git.tryMasterBranchfalse.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Serwer konfiguracji domyślnie próbuje wyewidencjonować gałąź o nazwie master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Możesz wyłączyć walidację certyfikatu TLS/SSL serwera Git przez serwer konfiguracji, ustawiając właściwość git.skipSslValidation na wartość true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Flaga wskazująca, że repozytorium powinno zostać sklonowane podczas uruchamiania, a nie na żądanie. Zazwyczaj prowadzi do wolniejszego uruchamiania, ale szybszego pierwszego zapytania.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Limit czasu w sekundach na uzyskanie połączenia HTTP lub SSH, jeśli ma to zastosowanie. Wartość domyślna to 5 sekund.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Jak często serwer konfiguracji pobiera zaktualizowane dane konfiguracji z zaplecza Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Prawidłowy klucz prywatny SSH. Należy ustawić, jeśli ignore-local-ssh-settings ma wartość , true a identyfikator URI usługi Git ma format SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Prawidłowy klucz hosta SSH. Należy ustawić wartość , jeśli host-key-algorithm jest również ustawiona.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Jeden z ssh-dss, ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384 lub ecdsa-sha2-nistp521. Należy ustawić wartość , jeśli host-key jest również ustawiona.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true lub false. Jeśli false, pomiń błędy związane z kluczem hosta.
spring.cloud.config.server.git.repos.{repoName} Identyfikator URI repozytorium zdalnego.
spring.cloud.config.server.git.repos.{repoName}.pattern Format wzorca to rozdzielona przecinkami lista {application}/{profile} nazw z symbolami wieloznacznymi. Jeśli {application}/{profile} nie pasuje do żadnego z wzorców, używa domyślnego identyfikatora URI zdefiniowanego poniżej.

Poniższa lista zawiera opis typowych konfiguracji:

  • Rejestrowanie powiązanych konfiguracji:

    • logging.level.*
    • logging.group.*
    • Wszelkie inne konfiguracje w logging.* przestrzeni nazw powinny być zabronione — na przykład zapisywanie plików dziennika przy użyciu logging.file powinno być zabronione.
  • spring.cloud.config.server.overrides

    • Dodatkowa mapa właściwości źródła do wysłania do wszystkich klientów bezwarunkowo.
  • spring.cloud.config.override-none

    • Priorytet wszystkich przesłonięć w kliencie można zmienić, aby był bliższy wartościom domyślnym, co pozwala aplikacjom na dostarczanie własnych wartości poprzez zmienne środowiskowe lub właściwości systemu, ustawiając flagę spring.cloud.config.override-none=true — wartość domyślna to false — w repozytorium zdalnym.
  • spring.cloud.config.allow-override

    • Jeśli włączysz konfigurację podczas pierwszego uruchamiania, możesz zezwolić aplikacjom klienckim na zastąpienie konfiguracji z serwera konfiguracji. Nadpisanie odbywa się przez umieszczenie dwóch właściwości w konfiguracji aplikacji, które pochodzą z serwera konfiguracji.
  • spring.cloud.config.server.health.*

    • Możesz skonfigurować wskaźnik kondycji, aby sprawdzał więcej aplikacji oraz niestandardowe profile i etykiety.
  • spring.cloud.config.server.accept-empty

    • Można ustawić spring.cloud.config.server.accept-empty wartość na false , aby serwer zwracał stan HTTP 404 , jeśli aplikacja nie zostanie znaleziona. Domyślnie ta flaga jest ustawiona na true.
  • Szyfrowanie i odszyfrowywanie (symetryczne):

    • encrypt.key
      • Wygodne w przypadku używania klucza symetrycznego, ponieważ jest to pojedyncza wartość właściwości do skonfigurowania.
    • spring.cloud.config.server.encrypt.enabled
      • Ustaw tę właściwość na false aby wyłączyć odszyfrowywanie po stronie serwera.

Odśwież

Usługi, które wykorzystują właściwości, muszą znać zmianę, zanim nastąpi. Domyślny sposób powiadamiania w Config Server for Spring polega na ręcznym wywoływaniu zdarzenia odświeżania, takiego jak odświeżanie za pomocą wywołania https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, co może być niepraktyczne, jeśli istnieje wiele instancji aplikacji.

Zamiast tego można automatycznie odświeżać wartości z serwera konfiguracji, pozwalając klientowi konfiguracji sprawdzać zmiany na podstawie interwału odświeżania. Wykonaj następujące kroki, aby automatycznie odświeżyć wartości z serwera konfiguracji:

  1. Zarejestruj zaplanowane zadanie, aby odświeżyć kontekst w danym interwale, jak pokazano w poniższym przykładzie:

    @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. Włącz autorefresh i ustaw odpowiedni interwał odświeżania w pliku application.yml . W poniższym przykładzie klient sonduje zmianę konfiguracji co 60 sekund, czyli minimalną wartość, którą można ustawić dla interwału odświeżania.

    Domyślnie autorefresh jest ustawiony na false, a refresh-interval jest ustawiony na 60 sekund.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Dodaj @RefreshScope do swojego kodu. W poniższym przykładzie zmienna connectTimeout jest automatycznie odświeżona co 60 sekund:

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

Szyfrowanie i odszyfrowywanie przy użyciu klucza symetrycznego

Odszyfrowywanie po stronie serwera

Domyślnie szyfrowanie po stronie serwera jest włączone. Aby włączyć odszyfrowywanie w aplikacji, wykonaj następujące czynności:

  1. Dodaj zaszyfrowaną właściwość w pliku properties w repozytorium Git.

    Plik powinien przypominać następujący przykład:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Zaktualizuj składnik Config Server for Spring Java, aby użyć repozytorium Git z zaszyfrowaną właściwością i ustawić klucz szyfrowania.

    Przed uruchomieniem następującego polecenia, zastąp symbole zastępcze w nawiasach <> swoimi wartościami.

    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
    

Odszyfrowywanie po stronie klienta

Możesz użyć odszyfrowywania po stronie klienta właściwości, wykonując następujące kroki:

  1. Dodaj zaszyfrowaną właściwość w pliku properties w repozytorium Git.

  2. Zaktualizuj składnik Config Server for Spring Java, aby użyć repozytorium Git z zaszyfrowaną właściwością i wyłączyć odszyfrowywanie po stronie serwera.

    Przed uruchomieniem następującego polecenia zastąp symbole zastępcze otoczone przez <> własnymi wartościami.

    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. W aplikacji klienckiej dodaj klucz ENCRYPT_KEY=randomKey odszyfrowywania jako zmienną środowiskową.

    Alternatywnie, jeśli uwzględnisz spring-cloud-starter-bootstrap w elemencie classpath lub ustawisz spring.cloud.bootstrap.enabled=true jako właściwość systemową, ustaw encrypt.key w bootstrap.properties.

    Przed uruchomieniem następującego polecenia zastąp symbole zastępcze ujęte w <> Twoimi wartościami.

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