middle
Как организовать конфигурацию микросервисов?
Централизованная конфигурация позволяет управлять настройками всех микросервисов из одного места и менять их без переразвёртывания. Основные инструменты: Spring Cloud Config, Consul KV, HashiCorp Vault, Kubernetes ConfigMaps.
Spring Cloud Config Server
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
# Config Server — application.yml
spring:
cloud:
config:
server:
git:
uri: https://git.bank.ru/config-repo
default-label: main
search-paths: '{application}'
# Клиент (payment-service) — application.yml
spring:
config:
import: configserver:http://config-server:8888
application:
name: payment-service
Конфигурационные файлы хранятся в Git-репозитории:
config-repo/
├── application.yml # Общие настройки
├── payment-service.yml # Настройки payment-service
├── payment-service-prod.yml # Настройки для production
└── customer-service.yml # Настройки customer-service
Consul KV Store
Пример
spring:
cloud:
consul:
config:
enabled: true
format: YAML
prefix: config
default-context: application
HashiCorp Vault – для секретов
Vault предназначен для безопасного хранения секретов (пароли БД, API-ключи, сертификаты).
Конфигурация Vault
spring:
cloud:
vault:
uri: https://vault.bank.ru:8200
authentication: APPROLE
app-role:
role-id: ${VAULT_ROLE_ID}
secret-id: ${VAULT_SECRET_ID}
kv:
enabled: true
backend: secret
default-context: payment-service
// Секреты автоматически инжектируются в Environment
@Value("${database.password}")
private String dbPassword; // Получен из Vault
Kubernetes ConfigMaps и Secrets
Пример
apiVersion: v1
kind: ConfigMap
metadata:
name: payment-service-config
data:
application.yml: |
payment:
max-amount: 1000000
currency: RUB
Динамическое обновление конфигурации (без перезапуска)
Пример
@RefreshScope
@RestController
public class PaymentController {
@Value("${payment.max-amount}")
private BigDecimal maxAmount; // Обновится при POST /actuator/refresh
}
Для массового обновления используется Spring Cloud Bus с Kafka/RabbitMQ — один POST-запрос обновляет конфигурацию всех экземпляров сервиса.
На собеседовании: упомяните три уровня: конфигурация (Config Server), секреты (Vault), динамическое обновление (@RefreshScope). Частая ошибка — хранить секреты в Git-репозитории конфигурации вместо Vault.