Поделиться через


Подключение к управляемому серверу конфигурации для Spring в приложениях контейнеров Azure

Сервер конфигурации для Spring предоставляет централизованное расположение, чтобы сделать данные конфигурации доступными для нескольких приложений. В этой статье описано, как подключить приложение, размещенное в приложениях контейнеров Azure, к экземпляру Java Config Server для Spring.

Компонент Config Server для Spring Java использует репозиторий GitHub в качестве источника параметров конфигурации. Значения конфигурации предоставляются приложению-контейнеру через привязку между компонентом и приложением контейнера. По мере изменения значений на сервере конфигурации они автоматически передаются в приложение без необходимости повторной компиляции или повторного развертывания приложения.

Из этого руководства вы узнаете, как:

  • Создание компонента Config Server для Spring Java
  • Привязка сервера конфигурации для Spring к приложению-контейнеру
  • Просмотрите значения конфигурации до и после подключения сервера конфигурации к приложению
  • Шифрование и расшифровка значений конфигурации с помощью симметричного ключа

Внимание

В этом руководстве используются службы, которые могут повлиять на счет Azure. Если вы решили выполнить пошаговые инструкции, удалите ресурсы, описанные в этой статье, чтобы избежать непредвиденных выставления счетов.

Необходимые компоненты

Рекомендации

При запуске в Config Server for Spring в приложениях контейнеров Azure помните о следующих сведениях:

Товар Описание
Область применения Сервер конфигурации для Spring выполняется в той же среде, что и подключенное приложение контейнера.
Масштабирование Для поддержания единого источника истины сервер конфигурации для Spring не масштабируется. Свойства minReplicas масштабирования и maxReplicas имеют значение . 1.
Ресурсы Распределение ресурсов контейнера для сервера конфигурации для Spring исправлено, число ядер ЦП равно 0,5, а размер памяти — 1Gi.
Цены Сервер конфигурации для Spring выставления счетов подпадает под цены на основе потребления. Счета за ресурсы, используемые управляемыми компонентами Java, выставляются по тарифам "активный или простой". Вы можете удалить компоненты, которые больше не используются для остановки выставления счетов.
Binding Приложение-контейнер подключается к серверу конфигурации для Spring через привязку. Привязка внедряет конфигурации в переменные среды приложения-контейнера. После установки привязки приложение-контейнер может считывать значения конфигурации из переменных среды.

Настройка

Прежде чем приступить к работе с сервером конфигурации для Spring, сначала необходимо создать необходимые ресурсы.

Выполните следующие команды, чтобы создать группу ресурсов и среду приложений контейнеров.

  1. Создайте переменные для поддержки конфигурации приложения. Эти значения предоставляются для вас в целях этого урока.

    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"
    
    «Переменная» Description
    LOCATION Расположение региона Azure, в котором создается приложение контейнера и компонент Java.
    ENVIRONMENT Имя среды "Приложения контейнеров Azure" для демонстрационного приложения.
    RESOURCE_GROUP Имя группы ресурсов Azure для демонстрационного приложения.
    JAVA_COMPONENT_NAME Имя компонента Java, созданного для приложения контейнера. В этом случае создается компонент Config Server для Spring Java.
    IMAGE Образ контейнера, используемый в приложении контейнера.
    URI Вы можете заменить URI URL-адресом репозитория Git, если это частный, добавьте связанные конфигурации проверки подлинности, такие как spring.cloud.config.server.git.username и spring.cloud.config.server.git.password.
  2. Войдите в Azure с помощью Azure CLI.

    az login
    
  3. Создать группу ресурсов.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Создайте среду приложений контейнеров.

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

Эта среда используется для размещения компонента Config Server для Spring java и приложения контейнера.

Создание компонента Config Server для Spring Java

Теперь, когда у вас есть среда контейнерных приложений, вы можете создать приложение-контейнер и привязать его к компоненту Config Server for Spring java. При привязке приложения-контейнера значения конфигурации автоматически синхронизируются с компонентом сервера конфигурации с приложением.

  1. Создайте компонент Config Server для 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. Обновите компонент Config Server для 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
    

    Здесь вы сообщаете компоненту, где найти репозиторий, в котором хранятся сведения о конфигурации с помощью uri свойства. Свойство refresh-rate сообщает приложениям-контейнерам, как часто проверять изменения в репозитории Git.

Привязка приложения-контейнера к компоненту Config Server для Spring Java

  1. Создайте приложение-контейнер, использующее данные конфигурации.

    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
    

    Эта команда возвращает URL-адрес приложения контейнера, использующее данные конфигурации. Скопируйте URL-адрес в текстовый редактор, чтобы его можно было использовать на следующем шаге.

    Если вы посещаете приложение в браузере, connectTimeout возвращаемое значением по умолчанию является значение 0по умолчанию.

  2. Привязка к серверу конфигурации для Spring.

    Теперь, когда создается приложение контейнера и сервер конфигурации, вы привязываете их вместе с командой к приложению update контейнера.

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

    Параметр --bind $JAVA_COMPONENT_NAME создает связь между приложением контейнера и компонентом конфигурации.

После привязки приложения контейнера и компонента сервера конфигурации изменения конфигурации автоматически синхронизируются с приложением-контейнером.

При повторном посещении URL-адреса приложения значение connectTimeout равно.10000 Это значение поступает из репозитория Git, заданного в $URI переменной, изначально заданной в качестве источника компонента конфигурации. В частности, это значение извлекается из connectionTimeout свойства в application.yml файле репозитория.

Запрос привязки внедряет параметр конфигурации в приложение в качестве переменных среды. Теперь эти значения доступны коду приложения для получения параметров конфигурации с сервера конфигурации.

В этом случае для приложения доступны следующие переменные среды:

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

Если вы хотите настроить собственную SPRING_CONFIG_IMPORT, можно ссылаться на переменную SPRING_CLOUD_CONFIG_COMPONENT_URI среды, например, можно переопределить аргументами командной строки, например Java -Dspring.config.import=optional:configserver:${SPRING_CLOUD_CONFIG_COMPONENT_URI}?fail-fast=true.

Вы также можете удалить привязку из приложения.

(Необязательно) Отмена привязки приложения-контейнера из компонента Config Server для Spring Java

Чтобы удалить привязку из приложения-контейнера, используйте --unbind этот параметр.

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

При повторном посещении URL-адреса приложения значение изменений, возвращаемых connectTimeout в 0.

Очистка ресурсов

Ресурсы, созданные в этом руководстве, влияют на счет Azure. Если вы не собираетесь использовать эти службы в долгосрочной перспективе, выполните следующую команду, чтобы удалить все, созданное в этом руководстве.

az group delete --resource-group $RESOURCE_GROUP

Варианты конфигурации

Команда az containerapp update использует --configuration параметр для управления настройкой сервера конфигурации для Spring. Вы можете одновременно использовать несколько параметров, если они разделены пробелом. Дополнительные сведения см. в разделе Spring Cloud Config Server.

В следующей таблице описаны различные доступные значения конфигурации серверной части Git:

Имя Описание
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
URI удаленный репозиторий.
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
Имя пользователя для проверки подлинности с помощью удаленный репозиторий.
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
Пароль для проверки подлинности с помощью удаленный репозиторий.
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
Пути поиска для использования в локальной рабочей копии. По умолчанию выполняется поиск только корневого каталога.
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
Пометка, указывающая, что репозиторий должен принудительно вытягивать. В случае trueотмены локальных изменений и принятия из удаленный репозиторий.
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Метка по умолчанию, используемая для Git, является основной. Если вы не задаете spring.cloud.config.server.git.default-label и ветвь с именем main не существует, сервер конфигурации по умолчанию также пытается извлечь ветвь с именем master. Если вы хотите отключить поведение резервной ветви, можно задать значение spring.cloud.config.server.git.tryMasterBranch false.
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
Сервер конфигурации по умолчанию пытается извлечь ветвь с именем master.
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
Вы можете отключить проверку сервера конфигурации TLS/SSL-сертификата сервера Git, задав git.skipSslValidation для свойства значение true.
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
Флаг, указывающий, что репозиторий должен быть клонирован при запуске, а не по запросу. Как правило, приводит к более медленному запуску, но более быстрому первому запросу.
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
Время ожидания в секундах для получения подключения HTTP или SSH, если применимо. Значение по умолчанию — 5 секунд.
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Как часто сервер конфигурации извлекает обновленные данные конфигурации из серверной части Git.
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
Допустимый закрытый ключ SSH. Необходимо задать значение , если ignore-local-ssh-settings есть true , а URI Git находится в формате SSH.
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
Допустимый ключ узла SSH. Необходимо задать, если host-key-algorithm также задано значение.
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
Один из ssh-dss, , ssh-rsa, ecdsa-sha2-nistp256ssh-ed25519ecdsa-sha2-nistp384ecdsa-sha2-nistp521или . Необходимо задать, если host-key также задано значение.
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true или false. Если falseигнорирование ошибок с ключом узла.
spring.cloud.config.server.git.repos.{repoName} URI удаленный репозиторий.
spring.cloud.config.server.git.repos.{repoName}.pattern Формат шаблона — это разделенный запятыми список {application}/{profile} имен с подстановочными знаками. Если {application}/{profile} не соответствует ни одному из шаблонов, он использует URI по умолчанию, определенный в разделе.

В следующем списке описаны распространенные конфигурации:

  • Связанные с ведением журнала конфигурации:

    • logging.level.*
    • logging.group.*
    • Любые другие конфигурации в logging.* пространстве имен должны быть запрещены. Например, написание файлов журнала с помощью logging.file не должно быть запрещено.
  • spring.cloud.config.server.overrides

    • Дополнительная карта для источника свойств, отправляемого всем клиентам безоговорочно.
  • spring.cloud.config.override-none

    • Вы можете изменить приоритет всех переопределения в клиенте, чтобы они были более похожими на значения по умолчанию, позволяя приложениям предоставлять собственные значения в переменных среды или системных свойствах, задав spring.cloud.config.override-none=true флаг , значение по умолчанию равно false - в удаленный репозиторий.
  • spring.cloud.config.allow-override

    • Если включить первую начальную загрузку конфигурации, можно разрешить клиентским приложениям переопределить конфигурацию с сервера конфигурации конфигурации, разместив два свойства в конфигурации приложений, поступающих с сервера конфигурации конфигурации.
  • spring.cloud.config.server.health.*

    • Индикатор работоспособности можно настроить для проверки дополнительных приложений, а также пользовательских профилей и пользовательских меток.
  • spring.cloud.config.server.accept-empty

    • Вы можете задать spring.cloud.config.server.accept-empty значение false , чтобы сервер вернул состояние HTTP 404 , если приложение не найдено. По умолчанию этот флаг имеет значение true.
  • Шифрование и расшифровка (симметричная):

    • encrypt.key
      • Удобно при использовании симметричного ключа, так как это одно значение свойства для настройки.
    • spring.cloud.config.server.encrypt.enabled
      • Установите это свойство, чтобы false отключить расшифровку на стороне сервера.

Refresh

Службы, использующие свойства, должны знать об изменении, прежде чем это произойдет. Метод уведомлений по умолчанию для Config Server для Spring включает вручную активацию события обновления, например обновление по вызову https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh, что может оказаться невозможным, если существует множество экземпляров приложения.

Вместо этого можно автоматически обновить значения из сервера конфигурации, предоставив клиенту конфигурации опрос изменений на основе внутреннего обновления. Выполните следующие действия для автоматического обновления значений с сервера конфигурации.

  1. Зарегистрируйте запланированную задачу для обновления контекста в заданном интервале, как показано в следующем примере:

    @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. Включите autorefresh и задайте соответствующий интервал обновления в файле application.yml . В следующем примере клиент опрашивает изменение конфигурации каждые 60 секунд, что является минимальным значением, которое можно задать для интервала обновления.

    По умолчанию autorefresh задано false refresh-interval значение 60 секунд.

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. Задайте @RefreshScope в коде. В следующем примере переменная connectTimeout автоматически обновляется каждые 60 секунд:

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

Шифрование и расшифровка с помощью симметричного ключа

Расшифровка на стороне сервера

По умолчанию шифрование на стороне сервера включено. Чтобы включить расшифровку в приложении, выполните следующие действия.

  1. Добавьте зашифрованное свойство в файл свойств .properties в репозитории Git.

    Файл должен иметь примерно следующий вид:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. Обновите компонент Config Server для Spring Java, чтобы использовать репозиторий Git, имеющий зашифрованное свойство, и задайте ключ шифрования.

    Перед выполнением следующей команды замените заполнители, окруженные значениями <> .

    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
    

Расшифровка на стороне клиента

Вы можете использовать расшифровку свойств на стороне клиента, выполнив следующие действия.

  1. Добавьте зашифрованное свойство в файл свойств .properties в репозитории Git.

  2. Обновите компонент Config Server для Spring Java, чтобы использовать репозиторий Git с зашифрованным свойством и отключить расшифровку на стороне сервера.

    Перед выполнением следующей команды замените заполнители, окруженные значениями <> .

    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. В клиентском приложении добавьте ключ ENCRYPT_KEY=randomKey расшифровки в качестве переменной среды.

    Кроме того, если включить spring-cloud-starter-bootstrap его в classpathсистемное свойство или задать encrypt.key spring.cloud.bootstrap.enabled=true его в bootstrap.propertiesкачестве системного свойства.

    Перед выполнением следующей команды замените заполнители, окруженные значениями <> .

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