Автор оригинала: Dhananjay Singh.
Вступление
В этой статье мы рассмотрим Настройку свойств загрузки Spring .
Spring позволяет разработчикам настраивать огромное количество свойств для своих проектов. Spring Boot, помимо того, что позволяет разработчикам начинать проект с нуля намного проще и экономичнее по времени, чем Spring, также значительно упрощает настройку свойств для ваших приложений.
Существует несколько способов настройки проекта Spring:
- На основе Java
- На основе XML
- На основе свойств
Конфигурация свойств на основе Java и XML была классическим способом настройки приложений Spring до того, как Spring Boot представила нам файл application.properties
.
Это дополнение позволяет нам внешне настраивать приложение и легко получать доступ к свойствам, определенным в файле.
По умолчанию файл application.properties
можно использовать для хранения пар свойств, хотя вы также можете определить любое количество дополнительных файлов свойств.
Чтобы зарегистрировать файл свойств, вы можете аннотировать класс @Configuration
с помощью дополнительной @PropertySource
аннотации:
@Configuration @PropertySource("classpath:custom.properties") public class ConfigClass { // Configuration }
Используя этот метод, вы можете зарегистрировать любое количество дополнительных файлов .properties
:
@Configuration @PropertySource("classpath:custom.properties") @PropertySource("classpath:another.properties") public class ConfigClass { // Configuration }
Впрыскивание Свойств Пружинного Ботинка
Настройка приложения
Самый простой способ начать со скелетного проекта-использовать Spring Initializr . Выберите предпочитаемую версию Spring Boot, добавьте зависимость Web
и создайте ее как проект Maven:
Если вы откроете проект, вы заметите, что файл application.properties
хранится по пути src/main/resources|/.
Это файл по умолчанию, на который Spring полагается для загрузки свойств. Мы можем записать наши пользовательские или специфические для пружины свойства в виде пар ключ-значение здесь:
message.default.welcome=Welcome... message.default.goodbye=Goodbye...
Вместо файла свойства
мы также можем использовать файл .yml
и определить те же свойства, что и:
message: default: welcome: Welcome... goodbye: Goodbye...
Это работает из-за SnakeYaml jar, присутствующего в пути к классу. YAML файлы более лаконичны и поддерживают карты, списки и т.д.
Какой тип использовать, зависит от вас и вашей команды. В этом уроке мы будем использовать тип .properties
.
Ввод Свойств С Использованием @Value
Давайте посмотрим, как мы можем использовать эти свойства в простом REST API:
@RestController public class GreetController { @Value("${message.default.welcome}") private String welcomeMessage; @Value("${message.default.goodbye}") private String goodBye; @RequestMapping("/welcome") public String welcome() { return welcomeMessage; } @RequestMapping("/bye") public String bye() { return goodBye; } }
Это довольно просто. Используя аннотацию @Value
, мы можем ввести значения из файла application.properties
в поля класса в компоненте, управляемом Spring GreetController
.
Затем у нас есть пара конечных точек REST, которые просто возвращают эти значения:
Использование @Value
позволяет установить значение по умолчанию, если запрошенное значение по какой-либо причине недоступно:
@Value("${message.default.welcome:SomeDefaultValue}") private String welcomeMessage;
Если сообщение.по умолчанию.добро пожаловать
значение отсутствует, значение будет установлено как Некоторое значение по умолчанию
.
Если вы хотите узнать больше об аннотации @Value , у нас есть подробная статья об этом!
Ввод Свойств С Помощью @ConfigurationProperties
Если наши свойства имеют какой-то общий контекст, например один и тот же префикс, мы можем использовать аннотацию @ConfigurationProperties
, которая сопоставит эти свойства объектам Java:
@Configuration @ConfigurationProperties(prefix = "message.default") public class MessageProperties { private String welcome; private String goodbye; // Getters and Setters }
@Configuration
сообщит Spring о создании компонента этого класса.@ConfigurationProperties
инициализирует поля с соответствующими именами свойств.
Теперь мы можем использовать этот боб в других бобах, управляемых весной:
@Autowired MessageProperties messageProperties;
Переопределение Свойств
Естественно, по мере расширения и изменения нашей среды приложений (разработка, контроль качества, производство и т.д.), Некоторые из наших свойств также изменятся. Они могут мешать друг другу, если мы их каким-то образом не разделим.
Мы достигаем этого, сохраняя различные файлы или получая значения свойств через переменные среды.
Использование Пружинных Профилей
Наиболее распространенный способ записи “изменяющихся” свойств-хранить их в разных файлах. Эти файлы зависят от среды, и наше приложение может загружать их в зависимости от переменных среды.
Пружинный ботинок обеспечивает очень элегантный способ справиться с этим.
Все, что нам нужно сделать, это следовать соглашению об именовании – приложение-<среда>.свойства
для наших файлов свойств:
- Все, что нам нужно сделать, это следовать соглашению об именовании –
- приложение-<среда>.свойства
- для наших файлов свойств: Все, что нам нужно сделать, это следовать соглашению об именовании –
Чтобы уведомить Spring, какие файлы использовать, мы должны установить переменную среды – spring.profiles.active
.
При этом, если значение spring.profiles.active
равно dev
, например, Spring boot загрузит файл application-dev.properties
и аналогично.
Примечание : application.properties
всегда загружается, независимо от значения spring.profiles.active
. Если в application.properties
и application-<среда>.properties
присутствует одно и то же значение ключа , последнее переопределит первое.
Обычно мы записываем все общие свойства каждой среды в application.properties
и переопределяем свойства, относящиеся к конкретной среде, с помощью профиля application-<среда>.свойства
.
Давайте посмотрим на это, создав application-dev.properties
:
message.default.welcome = Welcome to DEV environment...
Существует несколько способов настройки spring.profiles.active
переменной.
Если мы запускаем приложение через Eclipse, мы можем задать это в аргументах виртуальной машины:
Мы можем установить его в переменных среды операционной системы, как в Windows:
Давайте запустим наше приложение, и в журналах вы увидите загружаемый профиль dev
:
Давайте проверим обе наши предыдущие конечные точки REST:
Как мы видим, сообщение.по умолчанию.добро пожаловать
значение получено из application-dev.свойства
файл и сообщение.по умолчанию.до свидания
свойство получено из application.свойства
.
У нас может быть несколько значений в spring.profiles.active
например dev,qa
:
Любой дубликат ключа будет переопределен последним профилем, в приведенном выше случае qa
.
Мы также можем передать spring.profiles.active
в качестве аргумента командной строки, например:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
java -jar -Dspring.profiles.active=dev greeting-service-0.0.1-SNAPSHOT.jar
Создание приложения.свойства из расположения сборки
Мы также можем переопределить внутренние свойства, создав файл application.properties
на том же уровне, с которого выполняется .jar
. Контекст Spring переопределит свойства, используя этот недавно созданный файл.
Это отличный способ распространения вашего приложения среди других пользователей, которые могут переопределять определенные свойства в зависимости от своей среды, например, конфигурации базы данных.
Существуют и другие способы экстернализации ваших свойств, такие как переменные среды операционной системы, аргументы командной строки и т. Д. Порядок, в котором Весна рассматривает это, можно найти здесь .
Экстернализация Свойств С Помощью Сервера Облачной Конфигурации
Многие из приложений, созданных в настоящее время, основаны на архитектуре микросервиса. Эти приложения не только развертываются отдельно, но и могут иметь несколько собственных экземпляров (в зависимости от нагрузки), и общее количество может легко превысить 100.
Управление объектами в этом конкретном архитектурном стиле с помощью обычных методов требует слишком больших усилий. Кроме того, чтобы изменить свойство, мы должны снова перестроить приложение и развернуть его или, в лучшем случае, перезапустить приложение. Это требует простоя, что в некотором роде сводит на нет все назначение микросервисов.
Еще одна проблема традиционного подхода, особенно если свойства были экстернализованы с помощью переменных файла или среды, заключается в отсутствии возможности отслеживания. Последние всегда берутся, и мы не знаем, какие свойства были раньше или кто их изменил.
Spring Cloud Config предоставляет централизованный, внешний, безопасный и простой способ хранения и обслуживания конфигураций приложений для различных сред:
Короче говоря, у нас есть Сервер конфигурации , работающий как отдельное приложение, которое подключается к репозиторию Git.
Когда мы запускаем новое приложение (клиент конфигурации), оно получает все необходимые свойства с сервера конфигурации. Не имеет значения, существовало ли приложение, когда мы настраивали сервер, или нет.
Создание сервера конфигурации
Как всегда, мы начинаем с использования Spring Initializr .
Выберите предпочитаемую версию Spring Boot, добавьте зависимость от сервера конфигурации и создайте ее как проект Maven:
Аннотируя наш основной класс с помощью @EnableConfigServer
, мы помечаем его как сервер конфигурации:
@SpringBootApplication @EnableConfigServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
А теперь нам нужно настроить несколько вещей в файле application.properties
:
server.port = 8888 spring.cloud.config.server.git.uri = https://github.com/dhananjay12/spring-cloud-config spring.cloud.config.server.git.searchPaths = app-properties
Здесь мы определили порт, на котором будет работать сервер конфигурации. Затем мы указали URL Git , который он должен использовать для поиска свойств.
Примечание : По умолчанию Spring выполняет поиск файлов свойств в корневом каталоге. Если нам нужно указать конкретную папку, мы можем указать ее местоположение с помощью путей поиска
.
Вот как выглядит репозиторий Git:
Теперь мы можем запустить сервер конфигурации. Если вы хотите проверить конфигурацию сервера Spring Config, следуя соглашению – http://localhost:8888/<имя приложения>/<профили пружин>
покажет нам всю необходимую информацию.
В нашем случае это было бы – http://localhost:8888/greeting-service-cloud/default :
Создание клиента конфигурации
Давайте создадим ту же службу приветствий, но с парой дополнительных зависимостей:
Здесь мы создали сервис приветствия-облачный
сервис с Веб -|/,
Клиентом конфигурации и
Приводом зависимостями.
Он имеет те же сопоставления REST, что и раньше, с добавлением аннотации @RefreshScope
. Эта аннотация позволяет динамически обновлять компонент во время выполнения:
@RestController @RefreshScope public class GreetController { @Value("${message.default.welcome}") private String welcomeMessage; @Value("${message.default.goodbye}") private String goodBye; @RequestMapping("/welcome") public String welcome() { return welcomeMessage; } @RequestMapping("/bye") public String bye() { return goodBye; } }
Помимо application.properties
теперь нам нужно создать bootstrap.properties
, который загружается перед application.properties
.
Обычно он используется клиентом Spring Config для получения свойств с сервера Spring Config :
spring.application.name = greeting-service-cloud spring.cloud.config.uri = http://localhost:8888
Здесь мы сначала задаем имя приложения. Сервер конфигурации Spring будет искать это имя файла в репозитории Git и обслуживать его содержимое.
Мы также должны упомянуть, где работает сервер конфигурации, указав его в spring.cloud.config.uri
.
Давайте запустим эту службу и взглянем на журналы:
Обратите внимание, что сначала он получил свойства с сервера конфигурации Spring.
Примечание : Если сервер конфигурации недоступен, приложение не запустится.
Теперь давайте проверим наши конечные точки ОТДЫХА:
Таким образом, мы экстернализировали наши свойства и обеспечили их хорошую отслеживаемость в нашем репозитории Git. Некоторые важные моменты, которые стоит отметить:
- Мы также можем использовать
пружинные профили-активные
здесь. Если эта переменная задана в клиентской среде конфигурации, например.dev
, он будет передан на сервер конфигурации при запросе свойств. Затем сервер конфигурации будет искатьприветствие-сервис-облако-dev.свойства
в репозитории Git и передавать его клиенту. - Если в репозитории Git присутствует файл
application.properties
, он будет передан всем клиентам в дополнение к другим файлам. - Если клиент Конфигурации запрашивает свойства, например, скажем
dev
профиль, сервер Конфигурации вернетapplication.properties
,application-dev.properties
иприветствие-сервис-облако-dev.свойства
. Общие свойства будут переопределены последним.
Обновление свойств без перезапуска
По умолчанию значения конфигурации из файлов свойств готовы или извлекаются при запуске приложения, а не повторно. Если необходимо внести какие-то изменения, нам все равно придется перезапустить приложение.
Чтобы решить эту проблему, мы добавили в наше приложение зависимость Привод . Он предоставляет некоторые готовые к производству конечные точки , которые могут дать представление о нашем приложении, которое можно использовать в административных целях.
Мы должны включить эти конечные точки вручную, указав management.endpoints.web.exposure.include = *
в свойствах приложения.
Давайте добавим это в репозиторий Git и перезапустим приложение. Мы можем проверить многие детали вашего приложения, посетив конечные точки, такие как http://localhost:8080/actuator/env , http://localhost:8080/actuator/mappings и т.д.
Тот, который нас интересует, – это /привод/обновление
. Мы можем заставить компонент обновить его конфигурацию (т. Е. Снова извлечь конфигурацию с сервера конфигурации), аннотируя компонент с помощью @RefreshScope
.
Примечание : Если компонент обновляется, то при следующем доступе к компоненту (т. Е. выполняется метод) создается новый экземпляр.
Это может быть вызвано отправкой пустого HTTP POST запроса на конечную точку обновления клиента – http://<хост:порт>/привод/обновить
.
Давайте изменим значение одного из них в репозитории Git на что – то другое:
message.default.welcome = Welcome from cloud config server changed... message.default.goodbye = Goodbye... management.endpoints.web.exposure.include = *
Теперь давайте запустим конечную точку обновления:
curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
Проверьте /добро пожаловать
конечную точку:
Таким образом, мы смогли обновить свойство запущенного приложения, не перезапуская его.
Вывод
В этой статье мы рассмотрели, как настроить свойства в нашем приложении Spring Boot.
Во-первых, мы обсудили простые способы добавления свойств в наше приложение, а затем изменения/переопределения этих свойств в зависимости от различных сред.
Во-вторых, мы рассмотрели, как получить свойства с сервера Spring Config и как обновить свойства без перестройки или перезапуска.
Как всегда, код для примеров, используемых в этой статье, можно найти на Github .