Подключение к управляемому серверу конфигурации для Spring в приложениях контейнеров Azure
Сервер конфигурации для Spring предоставляет централизованное расположение, чтобы сделать данные конфигурации доступными для нескольких приложений. В этой статье описано, как подключить приложение, размещенное в приложениях контейнеров Azure, к экземпляру Java Config Server для Spring.
Компонент Config Server для Spring Java использует репозиторий GitHub в качестве источника параметров конфигурации. Значения конфигурации предоставляются приложению-контейнеру через привязку между компонентом и приложением контейнера. По мере изменения значений на сервере конфигурации они автоматически передаются в приложение без необходимости повторной компиляции или повторного развертывания приложения.
Из этого руководства вы узнаете, как:
- Создание компонента Config Server для Spring Java
- Привязка сервера конфигурации для Spring к приложению-контейнеру
- Просмотрите значения конфигурации до и после подключения сервера конфигурации к приложению
- Шифрование и расшифровка значений конфигурации с помощью симметричного ключа
Внимание
В этом руководстве используются службы, которые могут повлиять на счет Azure. Если вы решили выполнить пошаговые инструкции, удалите ресурсы, описанные в этой статье, чтобы избежать непредвиденных выставления счетов.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Если у вас еще нет, его можно создать бесплатно.
- Azure CLI.
Рекомендации
При запуске в Config Server for Spring в приложениях контейнеров Azure помните о следующих сведениях:
Товар | Описание |
---|---|
Область применения | Сервер конфигурации для Spring выполняется в той же среде, что и подключенное приложение контейнера. |
Масштабирование | Для поддержания единого источника истины сервер конфигурации для Spring не масштабируется. Свойства minReplicas масштабирования и maxReplicas имеют значение . 1 . |
Ресурсы | Распределение ресурсов контейнера для сервера конфигурации для Spring исправлено, число ядер ЦП равно 0,5, а размер памяти — 1Gi. |
Цены | Сервер конфигурации для Spring выставления счетов подпадает под цены на основе потребления. Счета за ресурсы, используемые управляемыми компонентами Java, выставляются по тарифам "активный или простой". Вы можете удалить компоненты, которые больше не используются для остановки выставления счетов. |
Binding | Приложение-контейнер подключается к серверу конфигурации для Spring через привязку. Привязка внедряет конфигурации в переменные среды приложения-контейнера. После установки привязки приложение-контейнер может считывать значения конфигурации из переменных среды. |
Настройка
Прежде чем приступить к работе с сервером конфигурации для Spring, сначала необходимо создать необходимые ресурсы.
Выполните следующие команды, чтобы создать группу ресурсов и среду приложений контейнеров.
Создайте переменные для поддержки конфигурации приложения. Эти значения предоставляются для вас в целях этого урока.
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
.Войдите в Azure с помощью Azure CLI.
az login
Создать группу ресурсов.
az group create --name $RESOURCE_GROUP --location $LOCATION
Создайте среду приложений контейнеров.
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. При привязке приложения-контейнера значения конфигурации автоматически синхронизируются с компонентом сервера конфигурации с приложением.
Создайте компонент 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
Обновите компонент 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
Создайте приложение-контейнер, использующее данные конфигурации.
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
по умолчанию.Привязка к серверу конфигурации для 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-nistp256 ssh-ed25519 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
, чтобы сервер вернул состояние HTTP404
, если приложение не найдено. По умолчанию этот флаг имеет значениеtrue
.
- Вы можете задать
Шифрование и расшифровка (симметричная):
encrypt.key
- Удобно при использовании симметричного ключа, так как это одно значение свойства для настройки.
spring.cloud.config.server.encrypt.enabled
- Установите это свойство, чтобы
false
отключить расшифровку на стороне сервера.
- Установите это свойство, чтобы
Refresh
Службы, использующие свойства, должны знать об изменении, прежде чем это произойдет. Метод уведомлений по умолчанию для Config Server для Spring включает вручную активацию события обновления, например обновление по вызову https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh
, что может оказаться невозможным, если существует множество экземпляров приложения.
Вместо этого можно автоматически обновить значения из сервера конфигурации, предоставив клиенту конфигурации опрос изменений на основе внутреннего обновления. Выполните следующие действия для автоматического обновления значений с сервера конфигурации.
Зарегистрируйте запланированную задачу для обновления контекста в заданном интервале, как показано в следующем примере:
@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)); } } }
Включите
autorefresh
и задайте соответствующий интервал обновления в файле application.yml . В следующем примере клиент опрашивает изменение конфигурации каждые 60 секунд, что является минимальным значением, которое можно задать для интервала обновления.По умолчанию
autorefresh
заданоfalse
refresh-interval
значение 60 секунд.spring: cloud: config: auto-refresh: true refresh-interval: 60 management: endpoints: web: exposure: include: - refresh
Задайте
@RefreshScope
в коде. В следующем примере переменнаяconnectTimeout
автоматически обновляется каждые 60 секунд:@RestController @RefreshScope public class HelloController { @Value("${timeout:4000}") private String connectTimeout; }
Шифрование и расшифровка с помощью симметричного ключа
Расшифровка на стороне сервера
По умолчанию шифрование на стороне сервера включено. Чтобы включить расшифровку в приложении, выполните следующие действия.
Добавьте зашифрованное свойство в файл свойств .properties в репозитории Git.
Файл должен иметь примерно следующий вид:
message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
Обновите компонент 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
Расшифровка на стороне клиента
Вы можете использовать расшифровку свойств на стороне клиента, выполнив следующие действия.
Добавьте зашифрованное свойство в файл свойств .properties в репозитории Git.
Обновите компонент 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
В клиентском приложении добавьте ключ
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