Как устроена клиент-серверная архитектура на основе микросервисов?

«Как устроена клиент-серверная архитектура на основе микросервисов?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Микросервисная архитектура — это подход, при котором приложение состоит из множества небольших, независимо развертываемых сервисов, каждый из которых отвечает за отдельную бизнес-возможность и общается по сети.

Ключевые компоненты и принципы

1. Самостоятельные сервисы

  • Каждый микросервис инкапсулирует свою логику и данные.
  • Имеет отдельную базу данных или схему (принцип "Database per Service").
  • Разрабатывается, развертывается и масштабируется независимо.

2. Способы взаимодействия

  • Синхронное (HTTP/REST, gRPC):
    // Пример REST-запроса между сервисами (Node.js/Express)
    const axios = require('axios');
    async function getUserOrders(userId) {
        // Запрос из сервиса Orders в сервис Users
        const user = await axios.get(`http://user-service:3000/api/users/${userId}`);
        // ... дальнейшая обработка
    }
  • Асинхронное (брокеры сообщений): Используется для повышения отказоустойчивости и связности.
    • Технологии: Apache Kafka, RabbitMQ, AWS SQS.
    • Паттерны: публикация/подписка (pub/sub), очереди задач.

3. API Gateway — единая точка входа

  • Маршрутизирует запросы от клиентов к соответствующим сервисам.
  • Выполняет кросс-сервисные задачи: аутентификация, SSL-терминация, кэширование, ограничение запросов (rate limiting).
  • Примеры: Kong, Apigee, AWS API Gateway.

4. Service Discovery и Configuration

  • Service Discovery (например, Consul, Eureka): помогает сервисам находить друг друга в динамической среде.
  • Config Server: централизованное управление конфигурациями для всех сервисов.

5. Наблюдаемость и мониторинг

  • Логи: агрегируются в центральную систему (ELK Stack, Loki).
  • Метрики и трейсинг: для отслеживания производительности и зависимостей (Prometheus, Grafana, Jaeger).

Пример простой схемы взаимодействия

Клиент → [ API Gateway ] → Маршрутизация
                              ↓
        [ Auth Service ]    [ Order Service ]    [ Payment Service ]
              (JWT)           (HTTP/gRPC)          (Kafka Event)
              |                     |                     |
        [ PostgreSQL ]       [ MongoDB ]          [ RabbitMQ ]

Преимущества для тестирования и разработки

  • Гибкость: Можно тестировать и развертывать сервисы по отдельности.
  • Устойчивость: Отказ одного сервиса не должен "валить" всю систему.
  • Сложность: Требует тестирования не только функциональности, но и интеграции, сетевой задержки, отказоустойчивости (Circuit Breaker) и контрактов API (Pact, OpenAPI).