Приложения, разрабатываемые программистами, запускаются в разных окружениях (или, как говорят, средах), которые требуют разных настроек для своей работы. Например, локально, на своей машине разработчик может использовать одну базу данных, а в продакшене другую. То же самое касается настроек логирования, правил безопасности и всех остальных аспектов работы приложения.
Возможность иметь свои наборы параметров под разные окружения в Spring Boot реализуется с помощью механизмов профайлов (Profiles). С помощью профайлов мы можем включать специфические бины или параметры конфигурации без необходимости изменения исходного кода.
Среды разработки
Как минимум выделяют две среды разработки:
- Продакшен (Production). Место, где запускается проект для его реальной работы. Как правило, это происходит в облаках Amazon, Yandex или Google.
- Девелопмент (Development). Почти всегда локальная машина разработчика. Обычно среда одна, даже если разработчиков больше одного человека.
Кроме указанных, часто, добавляют среду Staging. Это предпродакшен среда, где имитируется окружение, максимально приближенное к продакшену. Эту среду используют для тестирования приложения перед тем как выполнить его деплой на продакшен.
Итого, в типовых ситуациях, мы можем говорить о трех средах, для которых в Spring Boot будут определены три профайла:
- production
- development
- staging
Активация профайла
Активация профайла выполняется двумя основными способами.
С помощью переменной окружения
SPRING_PROFILES_ACTIVE
export SPRING_PROFILES_ACTIVE=development java -jar myproject.jar
С помощью аргумента во время запуска приложения
java -jar myproject.jar --spring.profiles.active=development // Или Gradle ./gradlew run --args='--spring.profiles.active=development'
Формирование профайла
Аннотация @Profile
указанная для @Component
или @Configuration
указывает на то, что эти классы должны использоваться только в определенном окружении:
@Configuration
@Profile("development")
public class DevelopmentConfig {
// Configuration for the development profile
}
Таким образом можно реализовать подмену как настроек, так и реализацию каких-то классов.
Конфигурационные параметры предпочтительно подменять с помощью файлов, специфичных для своих профилей: application-{profile}.yml расположенных рядом с оригинальным application.yml. Например:
- application-production.yml
- application-staging.yml
Наличие файлов специфичных для разных окружений не отменяет наличие общего application.yml, в котором полезно оставлять общие настройки, чтобы не дублировать их в каждом профайле.
Самостоятельная работа
В этом упражнении вы научитесь настраивать Spring Boot так, чтобы приложение могло работать с разными базами данных в зависимости от окружения. Это позволит безопасно запускать проект локально, тестировать его в памяти и подключаться к реальной PostgreSQL в продакшене.
Что нужно сделать
- Создать три профиля:
production
,development
иtest
. - Для production создать файл application-production.yml с настройками подключения к PostgreSQL.
- Для development создать файл application-development.yml с настройкой H2 базы в файле.
- Для test создать файл application-test.yml с H2 базой в памяти.
- При необходимости использовать аннотацию
@Profile
для бинов, специфичных для конкретного окружения (например,DataSource
). - Задеплоить приложение на Render.com с профилем
production
. - Проверить работу приложения с разными профилями и убедиться, что подключение к базе соответствует выбранному окружению.
Пример файлов конфигурации
Нажмите, чтобы увидеть пример application.yml и профайл-специфичных файлов
application.yml — общие настройки
spring:
datasource:
driver-class-name: org.h2.Driver # общий драйвер (будет переопределен для prod)
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
application-development.yml — локальная H2 база в файле
spring:
profiles: development
datasource:
url: jdbc:h2:file:./data/devdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: update
База хранится в файле ./data/devdb.mv.db
, данные сохраняются между запусками.
application-production.yml — PostgreSQL
spring:
profiles: production
datasource:
url: ${DB_URL:jdbc:postgresql://localhost:5432/myapp}
username: ${DB_USERNAME:postgres}
password: ${DB_PASSWORD:password}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: validate
show-sql: false
В продакшене подключаемся к реальной PostgreSQL. ddl-auto: validate
проверяет схему, но не меняет её.
application-test.yml — H2 в памяти для тестов
spring:
profiles: test
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop # схема создается для каждого теста и уничтожается после
show-sql: false
Используем память: база создаётся на старте теста и очищается после.
Итог
- Приложение использует H2 локально для быстрого запуска без внешней базы данных.
- В тестах применяется in-memory H2 для изолированных и быстрых юнит-тестов.
- В продакшене подключение идет к реальной PostgreSQL.
- Профили позволяют гибко управлять конфигурацией и легко переключаться между окружениями.
Дополнительные материалы
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.