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

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

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

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

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

Внимание

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

Предварительные требования

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

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

Товар Пояснение
Область применения Сервер конфигурации для Spring выполняется в той же среде, что и подключенное приложение контейнера.
Масштабирование Для поддержания единого источника истины сервер конфигурации для Spring не масштабируется. Свойства масштабирования minReplicas и maxReplicas установлены на 1.
Ресурсы Распределение ресурсов контейнера для сервера конфигурации для Spring исправлено, число ядер ЦП равно 0,5, а размер памяти — 1Gi.
Цены Сервер конфигурации Spring для выставления счетов подпадает под ценообразование, основанное на потреблении. Ресурсы, потребляемые управляемыми компонентами Java, оплачиваются по тарифам для активного/бездействующего режима. Вы можете удалить компоненты, которые больше не используются для остановки выставления счетов.
Привязка Приложение-контейнер подключается к серверу конфигурации для 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"
    
    Переменная Описание
    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 for 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 — main. Если вы не задаете spring.cloud.config.server.git.default-label и ветвь с именем main не существует, сервер конфигурации по умолчанию пытается проверить ветвь с именем master. Если вы хотите отключить поведение резервной ветви, можно задать значение spring.cloud.config.server.git.tryMasterBranchfalse.
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, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384 или ecdsa-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, чтобы отключить расшифровку на стороне сервера.

Обновить

Службы, использующие свойства, должны знать об изменении, прежде чем это произойдет. Метод уведомлений по умолчанию для 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 for 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, или задать spring.cloud.bootstrap.enabled=true как системное свойство, установите encrypt.key в bootstrap.properties.

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

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