← Назад к вопросам

Какие знаешь способы конфигурации микросервисов?

2.0 Middle🔥 191 комментариев
#REST API и микросервисы#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы конфигурации микросервисов

Конфигурация микросервисов — это управление параметрами (порты, БД, API ключи, timeouts и т.д.) для разных окружений (dev, staging, prod). Вот основные подходы:

1. Environment Variables

Простейший и самый распространённый способ:

# .env файл (НЕ коммитить в Git!)
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
API_KEY=secret-key-12345
PORT=8080
LOG_LEVEL=DEBUG

Java (Spring Boot):

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AppConfig {
    @Value("${database.url:jdbc:mysql://localhost:3306/db}")
    private String databaseUrl;
    
    @Value("${api.key}")
    private String apiKey;
    
    @Value("${server.port:8080}")
    private int port;
}

application.properties:

database.url=jdbc:mysql://localhost:3306/mydb
api.key=${API_KEY}  # Читай из env переменной
server.port=${PORT:8080}  # Дефолт 8080
logging.level.root=INFO

2. Property Files (Profile-based)

Разные файлы конфигов для разных окружений:

src/main/resources/
├── application.properties (общий)
├── application-dev.properties
├── application-staging.properties
└── application-prod.properties

application-dev.properties:

database.url=jdbc:mysql://localhost:3306/dev_db
api.key=dev-key-123
server.port=8080
logging.level.root=DEBUG

application-prod.properties:

database.url=jdbc:mysql://prod-db:3306/prod_db
api.key=${API_KEY}  # Из env переменной
server.port=8080
logging.level.root=WARN

Запуск с профилем:

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

3. YAML конфигурация

Удобнее чем properties для вложенных структур:

application.yml:

server:
  port: 8080
  servlet:
    context-path: /api

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: ${DB_PASSWORD}  # Из env
  jpa:
    hibernate:
      ddl-auto: validate
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      acks: all
      retries: 3

app:
  api:
    key: ${API_KEY}
    timeout-ms: 5000
  features:
    enable-cache: true

Java:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app.api")
public class ApiConfig {
    private String key;
    private int timeoutMs;
    
    // Getters/Setters
}

4. Spring Cloud Config Server

Централизованное управление конфигурацией для множества микросервисов:

┌─────────────────────────────────┐
│  Config Server (Git Repo)       │
│  - orders-service.yml           │
│  - users-service.yml            │
│  - payment-service.yml          │
└─────────────────────────────────┘
         ↑
         │ (HTTP запрос)
         │
┌─────────────────┬──────────────┬──────────────┐
│ Orders Service  │ Users Service│ Payment Svc  │
└─────────────────┴──────────────┴──────────────┘

pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

bootstrap.properties:

spring.cloud.config.uri=http://config-server:8888
spring.cloud.config.name=orders-service
spring.cloud.config.profile=prod

Git репозиторий (конфиг сервер):

config-repo/
├── orders-service.yml
├── orders-service-prod.yml
├── users-service.yml
└── users-service-prod.yml

5. Docker & Environment Variables

Dockerfile:

FROM openjdk:17-slim

WORKDIR /app
COPY target/app.jar app.jar

ENV DATABASE_URL=jdbc:mysql://mysql:3306/db
ENV API_KEY=default-key
ENV LOG_LEVEL=INFO

EXPOSE 8080

CMD ["java", "-jar", "app.jar"]

docker-compose.yml:

version: "3.9"
services:
  api:
    build: .
    ports:
      - "8080:8080"
    environment:
      DATABASE_URL: jdbc:mysql://mysql:3306/production
      API_KEY: ${API_KEY}  # Из .env
      LOG_LEVEL: WARN
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}

Запуск:

API_KEY=secret-123 docker-compose up

6. Kubernetes ConfigMaps & Secrets

Для контейнеризованных микросервисов:

configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: api-config
data:
  LOG_LEVEL: "INFO"
  CACHE_ENABLED: "true"
  TIMEOUT_MS: "5000"

secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: api-secrets
type: Opaque
data:
  DATABASE_URL: amRiYzpteXNxbDovL3VzZXI6cGFzc0Bkb...  # base64
  API_KEY: c2VjcmV0LWtleS0xMjM0NQ==  # base64

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-service
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: api
        image: myrepo/api:latest
        envFrom:
        - configMapRef:
            name: api-config
        - secretRef:
            name: api-secrets

7. Consul & Eureka (Service Discovery)

Динамическая конфигурация с обнаружением сервисов:

@Configuration
@EnableConsulCacheAutoConfiguration
public class ConsulConfig {
    // Консул автоматически загружает конфиг
}

Eureka Client:

eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka-server:8761/eureka/
  instance:
    preferIpAddress: true

8. Feature Flags (Togglz, LaunchDarkly)

Динамические переключатели без переразвёртывания:

import org.togglz.spring.security.SecurityContextUserProvider;
import org.togglz.core.Feature;

public enum MyFeatures implements Feature {
    CACHE_ENABLED,
    NEW_PAYMENT_GATEWAY,
    BETA_UI;
    
    public boolean isActive() {
        return FeatureContext.getFeatureManager().isActive(this);
    }
}

@RestController
public class PaymentController {
    @GetMapping("/process")
    public void processPayment() {
        if (MyFeatures.NEW_PAYMENT_GATEWAY.isActive()) {
            // Новый способ
        } else {
            // Старый способ
        }
    }
}

9. Vault (Secret Management)

Централизованное управление секретами:

import org.springframework.vault.annotation.VaultPropertySource;

@Configuration
@VaultPropertySource("secret/my-app")
public class VaultConfig {}

@Component
public class ServiceWithSecrets {
    @Value("${database.password}")
    private String dbPassword;
    
    @Value("${api.token}")
    private String apiToken;
}

Сравнение подходов

ПодходПростотаМасштабируемостьБезопасностьСлучай использования
Env vars⭐⭐⭐⭐⭐⭐⭐⭐⭐Простые приложения
Properties файлы⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Монолиты
Spring Cloud Config⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Микросервисы
Kubernetes⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐K8s кластеры
Vault⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐Критичные секреты

Лучшие практики

  1. Никогда не коммитьте секреты в Git
  2. Разделяй конфиги по окружениям
  3. Используй конфиг серверы для микросервисов
  4. Логируй только non-sensitive данные
  5. Валидируй конфиг при старте приложения
  6. Используй типизированные конфиги (ConfigurationProperties)
  7. Кэшируй конфиг в памяти, не читай каждый раз

Итог

Для простых приложений — env переменные и .properties файлы. Для микросервисов — Spring Cloud Config или Kubernetes. Для высокоуровневой безопасности — Vault.

Какие знаешь способы конфигурации микросервисов? | PrepBro