Spring надає чудовий інструмент для групування властивостей конфігурації у так звані профілі (dev, qa, prod тощо), що дозволяє активувати кілька налаштувань залежно від активного профілю.
Профілі ідеально підходять для налаштування нашого додатку під різні середовища, але також можуть використовуватися в інших випадках, таких як створення Bean на основі профілю тощо.
Таким чином, профіль може впливати на завантажені властивості додатку та біні, що завантажуються у контекст Spring.
Зверніть увагу, що за замовчуванням активним є профіль default
. Spring Boot завантажує всі властивості з application.properties
в цей профіль.
Ми можемо визначати профілі в:
- Файлах властивостей (наприклад,
application-dev.properties
) - YAML файлах (наприклад,
application.yml
) - Java коді (програмно активуючи профілі)
Ми можемо активувати конкретний профіль за допомогою властивості spring.profiles.active
, яку можна передати як аргумент командного рядка під час запуску або додати до стандартного application.properties
.
Давайте почнемо з простого прикладу.
Створіть три файли в папці src/main/java/resource
, назвавши їх application.yml
, application-qa.yml
, application-prod.yml
.
application.yml
server:
port: 8081
spring:
application:
name: "ProductService"
data:
mongodb:
uri: 'mongodb+srv://rijo:[email protected]/product-service?retryWrites=true&w=majority&appName=productCluster'
message:
env: "dev environment"
application-qa.yml
spring:
data:
mongodb:
uri: 'mongodb+srv://rijo:[email protected]/product-service?retryWrites=true&w=majority&appName=productCluster'
message:
env: "qa environment"
application-prod.yml
spring:
data:
mongodb:
uri: 'mongodb+srv://rijo:[email protected]/product-service?retryWrites=true&w=majority&appName=productCluster'
message:
env: "prod environment"
Створіть простий REST контролер, який має один кінцевий точку, що показує значення властивості message.env
, наданої у вищезгаданих файлах конфігурацій.
@RestController
@RequestMapping(value = "/api/v1/product", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProductController {
@Value("${message.env}")
String env;
@GetMapping("/env")
public ResponseEntity getEnv() {
return ResponseEntity.status(HttpStatus.OK).body(env);
}
}
Тепер запустіть додаток і зверніться до кінцевої точки /api/v1/product/env
, яка поверне рядок "dev environment".
Тепер перезапустіть додаток і передайте spring.profiles.active=dev
як змінну командного рядка.
Ви можете використовувати команду java -jar app.jar — spring.profiles.active=dev
, або використати конфігурацію запуску в IntelliJ для передачі spring.profiles.active
.
Тепер знову зверніться до кінцевої точки /api/v1/product/env
, і вона поверне рядок "prod environment".
Перекладено з: Grouping microservice configuration based on the environment(dev, qa, prod etc), using Spring Boot profiles