В чем разница между микросервисной и сервис-ориентированной архитектурой

«В чем разница между микросервисной и сервис-ориентированной архитектурой» — вопрос из категории Архитектура, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Микросервисная архитектура (MSA) и сервис-ориентированная архитектура (SOA) — это два разных подхода к декомпозиции монолитных приложений на сервисы. Основные различия с точки зрения разработки и тестирования:

Критерий SOA MSA
Гранулярность Крупные, многофункциональные сервисы (например, «Сервис заказов»). Мелкие, автономные сервисы, отвечающие за одну бизнес-возможность (например, «Сервис расчета стоимости доставки»).
Способ коммуникации Часто через централизованную шину (ESB), которая управляет маршрутизацией и трансформацией данных. Легковесные протоколы (HTTP/REST, gRPC, асинхронные сообщения). Сервисы общаются напрямую или через простой брокер сообщений.
Управление данными Общая база данных или несколько тесно связанных БД. Каждый сервис владеет своей собственной базой данных (принцип bounded context из DDD).
Связность и независимость Сервисы тесно связаны через общие контракты и ESB. Сервисы слабо связаны, могут разрабатываться, развертываться и масштабироваться независимо.

Для QA это означает разный подход к тестированию:

  • В SOA фокус на интеграционное тестирование через ESB, проверку сложных бизнес-процессов и контрактов (XSD, WSDL).
  • В MSA критически важны:
    1. Изолированные модульные тесты для каждого сервиса.
    2. Контрактное тестирование (например, с Pact) для проверки взаимодействия между сервисами.
    3. Тестирование устойчивости (resilience testing) — как сервисы ведут себя при отказе соседних сервисов.
    4. Сквозное (E2E) тестирование ключевых пользовательских сценариев, проходящих через несколько сервисов.

Пример теста для микросервиса на Python (с использованием pytest и requests):

import pytest
import requests

SERVICE_URL = "http://user-service:8080"

def test_user_creation_and_retrieval():
    """E2E-сценарий: создание пользователя и получение его данных."""
    # 1. Создание пользователя
    create_payload = {"username": "test_user", "email": "test@example.com"}
    create_resp = requests.post(f"{SERVICE_URL}/users", json=create_payload)
    assert create_resp.status_code == 201
    user_id = create_resp.json()["id"]

    # 2. Получение созданного пользователя
    get_resp = requests.get(f"{SERVICE_URL}/users/{user_id}")
    assert get_resp.status_code == 200
    user_data = get_resp.json()
    assert user_data["username"] == "test_user"
    assert user_data["email"] == "test@example.com"

SOA часто применяется в крупных корпоративных системах с унаследованной инфраструктурой, а MSA — в облачных приложениях, где важны скорость разработки, независимость команд и горизонтальное масштабирование.