Gymterview
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.