Питання 29 · Розділ 5

Що таке profiles in Spring?

Профілі vs Feature Flags: якщо потрібно вмикати/вимикати функціональність в production БЕЗ перезапуску — використовуйте Feature Flags (Unleash, LaunchDarkly). Якщо різна інфраст...

Мовні версії: English Russian Ukrainian

🟢 Junior Level

Profiles — спосіб використовувати різні налаштування для різних оточень (dev, test, prod).

# application.yaml (загальні налаштування)
server.port: 8080

# application-dev.yaml (для розробки)
spring.datasource.url: jdbc:h2:mem:dev

# application-prod.yaml (для продакшену)
spring.datasource.url: jdbc:postgresql://prod-db:5432/mydb

Активація:

java -jar app.jar --spring.profiles.active=prod

🟡 Middle Level

Способи активації

# 1. Командний рядок
--spring.profiles.active=prod

# 2. Змінна оточення
SPRING_PROFILES_ACTIVE=prod

# 3. JVM параметр
-Dspring.profiles.active=prod

# 4. У тестах
@ActiveProfiles("test")

@Profile на бінах

@Bean
@Profile("dev")
public DataSource devDataSource() { ... }

@Bean
@Profile("prod")
public DataSource prodDataSource() { ... }

Логічні вирази

@Profile("prod & !cloud")    // Prod, але не в хмарі
// Spring 5.1+ підтримує логічні оператори в @Profile: &, |, !
@Profile("dev | test")       // Dev або test
@Profile("prod & (mysql | postgres)")  // Складні умови

🔴 Senior Level

Profile Groups

spring:
  profiles:
    group:
      "highload": "cache, async, metrics"

# Активація highload → включає cache, async, metrics

Profile-specific Imports (Boot 2.4+)

# application.yaml
server.port: 8080
---
spring.config.activate.on-profile: dev
server.port: 9090
---
spring.config.activate.on-profile: prod
server.port: 80

Profiles vs Feature Flags

Profiles:
  → Інфраструктура (БД, черги)
  → Вимагає перезапуску

Feature Flags:
  → Бізнес-логіка
  → Змінюються на льоту

→ Не плутайте!

Профілі vs Feature Flags: якщо потрібно вмикати/вимикати функціональність в production БЕЗ перезапуску — використовуйте Feature Flags (Unleash, LaunchDarkly). Якщо різна інфраструктура для dev/test/prod — Profiles.

Cloud-Native

Kubernetes ConfigMaps → замінюють профілі
Spring Cloud Config → зовнішній сервер конфігів
HashiCorp Vault → секрети

Профілі → місток до зовнішніх конфігів

Production Experience

Реальний сценарій: забули активувати prod

Додаток стартував з default профілем
→ Підключився до dev БД!
→ Втрата даних!

Рішення:
  → Вимагати профіль через validation
  → ConfigMaps в K8s

Діагностика

# Активні профілі:
/actuator/env → activeProfiles

# Лог при старті:
"The following 1 profile is active: prod"

# Програмно:
@Autowired Environment env;
env.getActiveProfiles();

Best Practices

  1. Не зберігайте секрети в application.yaml
  2. Вимагайте профіль для prod → validation
  3. Profile Groups → групування
  4. Feature Flags → для бізнес-логіки
  5. Cloud Config → зовнішнє керування
  6. @ActiveProfiles → для тестів

Резюме для Senior

  • Profiles → різна конфігурація для оточень
  • Пріоритет джерел (від вищого до нижчого): CLI аргументи > JVM -D параметри > змінні оточення > application-{profile}.properties > application.properties
  • Groups → об’єднання профілів
  • Profile vs Feature Flags → інфраструктура vs бізнес
  • Cloud-Native → ConfigMaps, Vault
  • Validation → вимагайте профіль для prod

🎯 Шпаргалка для інтерв’ю

Обов’язково знати:

  • Profiles — механізм різної конфігурації для оточень (dev, test, prod)
  • Активація: –spring.profiles.active, SPRING_PROFILES_ACTIVE, JVM -D, @ActiveProfiles в тестах
  • @Profile на @Bean методах та класах — бін створюється тільки при активному профілі
  • Логічні вирази в @Profile (Spring 5.1+): “prod & !cloud”, “dev test”
  • Profile Groups (Spring Boot 2.4+): один профіль активує групу — spring.profiles.group
  • Multi-document YAML: кілька профілів в одному файлі через spring.config.activate.on-profile
  • Profiles != Feature Flags: профілі — інфраструктура (перезапуск), прапорці — бізнес-логіка (на льоту)

Часті уточнюючі запитання:

  • Як активувати кілька профілів? — Через кому: –spring.profiles.active=prod,cache,async.
  • Що буде, якщо не активувати жоден профіль? — Використовуються тільки application.yaml (дефолтні налаштування) — небезпечно для prod.
  • Чим Profiles відрізняються від Feature Flags? — Profiles вимагають перезапуску та змінюють інфраструктуру; Feature Flags перемикають бізнес-логіку на льоту.
  • Як гарантувати запуск тільки з потрібним профілем? — Validation: перевірити env.getActiveProfiles() при старті та викинути помилку, якщо prod без профілю.

Червоні прапорці (НЕ говорити):

  • «Профілі можна змінювати без перезапуску» — ні, активація тільки при старті.
  • «Feature Flags — це те саме, що Profiles» — ні, прапорці змінюють бізнес-логіку на льоту.
  • «Секрети можна зберігати в application-prod.yaml» — ні, використовуйте Vault, K8s Secrets, CI/CD variables.
  • «Profile groups замінюють окремі профілі» — ні, groups — це аліас для набору профілів.

Пов’язані теми:

  • [[22. Що таке стартер в Spring Boot]]
  • [[21. Як працює @SpringBootApplication]]
  • [[24. Що таке @Configuration клас]]
  • [[27. Що робити, якщо є кілька бінів одного типу]]