Spring Boot 2.4 меняет механизм загрузки конфигурационного файла

Spring Boot Java

Spring Boot 2.4.0.M2 только что выпущенный, это правильноapplication.propertiesиapplication.ymlРефакторинг загрузки файлов. Если приложение использует только одинapplication.propertiesилиapplication.ymlЧто касается конфигурационного файла, то вы можете не почувствовать никакой разницы. Но если ваше приложение использует более сложную конфигурацию (например, Spring Cloud Configuration Center и т. д.), вам необходимо понимать, что изменилось и почему.

Зачем вносить эти изменения

С выпуском последней версии Spring Boot компания Spring усердно работала над улучшениемKubernetesродная поддержка. В Spring Boot 2.3 официалы хотят добавитьKubernetesКонфигурация Volume поддерживается, но не реализована.

Крепление конфигурации томаKubernetesобщая черта , гдеConfigMapДирективы используются для отображения конфигурации непосредственно в файловой системе. Вы можете загрузить полный файл YAML с несколькими объединенными ключами и значениями или использовать более простой формат дерева каталогов, где имя файла является ключом, а содержимое файла — значением.

Надеемся обеспечить поддержку для обоих и быть совместимыми с нашими существующимиapplication.propertiesиapplication.yml. Для этого нужно изменитьConfigFileApplicationListenerсвоего рода.

Проблема с ConfigFileApplicationListener

Классы загрузки профиля в Spring BootConfigFileApplicationListenerОн относится к основному низкоуровневому коду, и его очень сложно поддерживать каждый раз. Дело не в том, что код написан неправильно или отсутствуют соответствующие модульные тесты, а в том, что когда добавляются новые функции, трудно исправить проблемы, существовавшие ранее.

который:

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

Возьмем следующий пример:

security.user.password: usera
---
spring.profiles: local
security.user.password: userb
runlocal: true
---
spring.profiles: !dev
spring.profiles.include: local
security.user.password: userc

Здесь у нас естьМногодокументный YAMLфайл (файл состоит из трех логических документов, состоящих из---разделены).

При использовании--spring.profile.actives=prodбеги, тогдаsecurity.user.passwordКакова ценность? Установить лиrunlocalАтрибуты? Включен ли документ средней части, потому что профиль не активируется при его обработке?

Мы часто сталкиваемся с проблемами с этой логикой обработки файлов, но каждый раз, когда мы пытаемся их исправить, мы сталкиваемся со всевозможными негативными проблемами.

Таким образом, есть два критических изменения в том, как файлы свойств и YAML загружаются в Spring boot 2.4:

  1. Документы будут загружены в установленном порядке.
  2. Переключатель активации профилей нельзя настроить в конкретной среде.

сортировка документов

Начиная с Spring Boot 2.4 последует загрузка файлов Properties и YAML,Объявить в документе, что свойства, заказанные ранее, будут переопределены свойствами, которые будут позже.

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

Точно так же для многодокументных файлов YAML более низкие сортировки также будут переопределены более высокими:

test: "value"
---
test: "overridden-value"

PropertiesФайл поддерживает несколько атрибутов документа

В Spring Boot 2.4,PropertiesПоддерживает многодокументные функции, подобные YAML. В файлах свойств, состоящих из нескольких документов, используются комментарии (#), за которыми следуют три (---) тире для разделения документов (Возможность использовать аннотации, чтобы существующие IDE поддерживали их должным образом.).

Например, приведенные выше эквивалентные свойства YAML:

test=value
#---
test=overridden-value

Конфигурация активации для конкретной среды

Приведенный выше пример на самом деле не имеет никакого смысла, и в нашем процессе разработки чаще всего объявляется, что свойство активно только в определенной среде.

Настраивается в Spring Boot 2.3spring.profilesреализовать. Но в Spring Boot 2.4изменение свойствазаspring.config.activate.on-profile.

Например, мы хотимtestсвойства толькоdevПереопределить его, когда профиль активирован, вы можете использовать следующую конфигурацию:

test=value
#---
spring.config.activate.on-profile=dev
test=overridden-value

Profile Activation

использоватьspring.profiles.activeсобственность вapplication.propertiesилиapplication.yamlдокументкорневой файл конфигурациидля активации соответствующих файлов среды.

Например, следующее:

test=value
spring.profiles.active=local
#---
spring.config.activate.on-profile=dev
test=overridden value

Не разрешаетсяspring.profiles.activeатрибут сspring.config.activate.on-profileиспользовать вместе. Например, следующие файлы вызовут исключение:

test=value
#---
spring.config.activate.on-profile=dev
spring.profiles.active=local # will fail
test=overridden value

С этим новым ограничениемapplication.propertiesиapplication.ymlДокументацию легче понять. Упрощает управление и обслуживание Spring Boot.

Profile Groups

Группы профилей — это новая функция в Spring Boot 2.4, которая позволяет вам расширить один профиль на несколько подпрофилей. Например, пусть имеется сложный набор@Configurationкласс, вы можете использовать@ProfileАннотации условно включают их. использовать@Profile("proddb")Откройте конфигурацию базы данных, используйте@Profile("prodmq")Включить настройку сообщений и т. д.

Использование нескольких файлов конфигурации упрощает понимание нашего кода, но не идеально для развертывания. Если пользователю необходимо активировать одновременноproddb,prodmq,prodmetricsЖдать. Затем группы профилей позволяют вам сделать именно это.

ты сможешьapplication.propertiesилиapplication.ymlопределено в файлеspring.profiles.group,那么开启 prod 则就相当于激活了此组的全部环境. Например:

spring.profiles.group.prod=proddb,prodmq,prodmetrics

Конфигурация входного расширения

Теперь, когда мы рассмотрели основы работы с конфигурационными файлами, мы, наконец, можем подумать о новой функциональности, которую хотим предложить. Основная функция, которую мы предоставляем в Spring Boot 2.4, — это поддержка импорта дополнительной конфигурации.

Для более ранних версий Spring Boot было сложноapplication.propertiesиapplication.ymlимпортировать другиеpropertiesилиyamlдокумент. можно использоватьspring.config.additional-locationproperties, но типы файлов, которые он может обрабатывать, очень ограничены.

В Spring Boot 2.4 вы можете напрямуюapplication.propertiesилиapplication.ymlфайл с использованием новогоspring.config.importАтрибуты. Например, вы хотите импортировать «игнорируемый git».developer.propertiesфайл, чтобы любой разработчик в команде мог быстро изменить свойства:

application.name=myapp
spring.config.import=developer.properties

может быть дажеspring.config.importиspring.config.activate.on-profileиспользуется в комбинации. Например, здесьprod.propertiesтолько приprodЗагружается, когда профиль активен:

spring.config.activate.on-profile=prod
spring.config.import=prod.properties

ImportМожно рассматривать как другие документы, вставленные ниже документа, в котором они объявлены. OниСоответствует тому же нисходящему порядку, что и обычные файлы с несколькими документами: импорт импортируется только один раз, независимо от того, сколько раз они были объявлены.

конфигурация монтирования тома

Определения импорта используют тот же синтаксис, что и URL-адреса для своих значений. Если ваше местоположение не имеет префикса, оно рассматривается как обычный файл или папка. Однако, если вы используетеconfigtree:префикс сообщает Spring Boot, что вы ожидаете использоватьKubernetesДерево конфигурации для монтирования томов.

Например, вы можетеapplication.propertiesКонфигурация:

spring.config.import=configtree:/etc/config

Если у вас загружено следующее:

etc/
 +- config/
     +- my/
     |  +- application
     +- test

будет веснойEnvironmentпринадлежит вmy.applicationиtestАтрибуты.my.applicationЗначение/etc/config/my/applicationСодержание,testЗначение/etc/config/testСодержание.

Активировать в соответствии с типом облачной платформы

Если только хотитеVolumeСмонтированная конфигурация (или любое свойство этого контента)на определенной облачной платформеактивна и может быть использованаspring.config.activate.on-cloud-platformАтрибуты. Как это работает сspring.config.activate.on-profileаналогично, но используетCloudPlatformзначение вместо имени профиля.

Если мы хотим развернуться наKubernetesПри включении вышеуказанного дерева конфигурации мы можем сделать следующее:

spring.config.activate.on-cloud-platform=kubernetes
spring.config.import=configtree:/etc/config

Поддержка других локаций

spring.config.importСтрока местоположения, указанная в свойстве, является полностью подключаемой и может быть расширена путем написания нескольких пользовательских классов, а сторонние библиотеки обеспечат поддержку пользовательских расположений. Например, вы можете подумать о сторонних файлах jar, таких какarchaius://…,vault://…илиzookeeper://….

Если вы заинтересованы в добавлении дополнительной поддержки местоположения, ознакомьтесь сorg.springframework.boot.context.configСумкаConfigDataLocationResolverиConfigDataLoaderjavadoc.

откат версии

Как описано выше, функциональные изменения Spring Boot в файлах конфигурации очень велики. С учетом совместимости младших версий

можно установитьspring.config.use-legacy-processing=trueАтрибуты могут быть восстановлены до предыдущей версии механизма обработки файлов.

Если вы обнаружите проблему с этим, вам нужно переключиться на устаревшую обработку, пожалуйстаСообщить о проблеме на GitHub, чиновник попытается решить проблему.

Суммировать

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

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

Перевод: холодная, сказочная технология

Оригинальная ссылка:весна.IO/блог/2020/0…