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:
- Документы будут загружены в установленном порядке.
- Переключатель активации профилей нельзя настроить в конкретной среде.
сортировка документов
Начиная с 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-location
properties, но типы файлов, которые он может обрабатывать, очень ограничены.
В 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
иConfigDataLoader
javadoc.
откат версии
Как описано выше, функциональные изменения Spring Boot в файлах конфигурации очень велики. С учетом совместимости младших версий
можно установитьspring.config.use-legacy-processing=true
Атрибуты могут быть восстановлены до предыдущей версии механизма обработки файлов.
Если вы обнаружите проблему с этим, вам нужно переключиться на устаревшую обработку, пожалуйстаСообщить о проблеме на GitHub, чиновник попытается решить проблему.
Суммировать
Официальная надежда состоит в том, что новая обработка данных конфигурации будет проще в использовании и не вызовет особых проблем с обновлением. Если вы хотите узнать о них больше, вы можете проверить обновленнуюСправочная документация.
Добро пожаловать, чтобы следовать за мной, и изменения здесь будут подробно объяснены в коде в будущем.
Перевод: холодная, сказочная технология
Оригинальная ссылка:весна.IO/блог/2020/0…