Что такое микросервисы: архитектура, плюсы и минусы, примеры

Когда монолит перерос себя, а когда микросервисы — overkill. Паттерны декомпозиции, service mesh, distributed tracing на примерах из Netflix и Uber.

Обложка: Что такое микросервисы: архитектура, плюсы и минусы, примеры

Ваш монолитный сервер падает под нагрузкой, деплой занимает полдня, а любое изменение в одном модуле ломает три других? Вероятно, пора задуматься о микросервисах. Но подходят ли они именно вам — разбираемся в этой статье.

Микросервисы (microservices) — это архитектурный подход, при котором приложение разбивается на набор небольших автономных сервисов. Каждый сервис отвечает за одну бизнес-функцию, имеет собственную базу данных, развёртывается независимо и взаимодействует с другими сервисами через API. Такой подход противопоставляется монолитной архитектуре, где всё приложение — единый неделимый блок.

Ключевые выводы

— Микросервисы — это архитектура из независимых сервисов, каждый из которых решает одну задачу и развёртывается отдельно

— Главные преимущества: независимый деплой, масштабирование отдельных компонентов, свобода выбора технологий

— Главные недостатки: сложность отладки, сетевые задержки, необходимость оркестрации

— Переходить с монолита стоит при команде от 5-8 разработчиков и понятных границах доменов

— Ключевые технологии: Docker, Kubernetes, API Gateway, брокеры сообщений (Kafka, RabbitMQ)

Монолит vs микросервисы — в чём разница

В монолитной архитектуре всё приложение — один развёртываемый артефакт. Код UI, бизнес-логики и доступа к данным живёт в одной кодовой базе, компилируется и деплоится как единое целое.

В микросервисной архитектуре приложение разделено на несколько независимых сервисов. Например, интернет-магазин может состоять из сервиса каталога, сервиса заказов, сервиса оплаты и сервиса уведомлений — каждый работает в своём процессе и имеет свою БД.

Основные различия:

  • Размер и сложность — монолит проще на старте, но растёт в «комок грязи»; микросервисы сложнее изначально, но легче масштабируются
  • Деплой — в монолите любое изменение требует передеплоя всего приложения; в микросервисах — только изменённого сервиса
  • Масштабирование — монолит масштабируется только целиком; микросервис — точечно, по нагрузке
  • Технологии — в монолите один стек; в микросервисах каждый сервис может быть на своём языке и фреймворке
  • Отказоустойчивость — падение монолита роняет всё; падение одного микросервиса не обязательно роняет систему

По данным O'Reilly, к 2020 году 61% компаний, внедривших микросервисы, использовали их больше года, а 28% — больше трёх лет.

Преимущества микросервисной архитектуры

  1. Независимый деплой. Каждая команда деплоит свой сервис без координации с другими. По данным отчёта DORA, это один из ключевых факторов высокой частоты релизов — лидеры индустрии деплоят изменения несколько раз в день
  2. Точечное масштабирование. Нагрузка на каталог товаров выросла в 10 раз? Масштабируем только его, не трогая сервис аналитики
  3. Технологическая свобода. Сервис рекомендаций можно написать на Python с ML-библиотеками, а высоконагруженный API — на Go или Rust
  4. Изоляция сбоев. Если сервис уведомлений упал, пользователь всё ещё может оформить заказ. Паттерн Circuit Breaker (автоматический выключатель) предотвращает каскадные отказы
  5. Гибкость команд. Каждый сервис — зона ответственности одной команды (2-8 человек). Это соответствует «правилу двух пицц» Джеффа Безоса
  6. Упрощённый рефакторинг. Переписать один сервис на 2000 строк проще и безопаснее, чем рефакторить монолит на 200 000 строк

Недостатки и когда НЕ стоит использовать микросервисы

Микросервисы — не серебряная пуля. Вот реальные проблемы, с которыми сталкиваются команды:

  • Сетевая сложность. Вместо вызовов функций — HTTP-запросы и очереди сообщений. Это добавляет задержки (latency), а сеть может быть ненадёжной
  • Распределённые транзакции. Обеспечить атомарность операции, затрагивающей 3 сервиса, — нетривиальная задача. Паттерн Saga решает это, но добавляет сложность
  • Отладка и мониторинг. Баг, затрагивающий цепочку из 5 сервисов, искать сложнее, чем в одном процессе. Нужны распределённая трассировка (Jaeger, Zipkin) и централизованные логи
  • Дупликация данных. Каждый сервис имеет свою БД — данные неизбежно дублируются, и обеспечивать их согласованность (eventual consistency) сложно
  • Операционные затраты. Вместо одного сервера — десятки контейнеров, сетевые политики, секреты, CI/CD-пайплайны для каждого сервиса
  • Порог входа. Команде нужно знать Docker, оркестрацию, паттерны распределённых систем — кривая обучения крутая

Когда НЕ стоит переходить на микросервисы:

  • Команда меньше 5 человек — overhead превысит выгоду
  • Проект на ранней стадии, когда границы доменов ещё не ясны
  • Нет DevOps-культуры и опыта с контейнерами
  • Монолит справляется с текущей и прогнозируемой нагрузкой
Если вы не можете построить хорошо структурированный монолит, что заставляет вас думать, что микросервисы — ответ?
Саймон Браунавтор книги Software Architecture for Developers

Технологии микросервисной архитектуры

Микросервисы опираются на экосистему инструментов. Разберём ключевые.

Docker — контейнеризация

Docker упаковывает каждый сервис в контейнер — изолированную среду со всеми зависимостями. Контейнер работает одинаково на ноутбуке разработчика и в продакшене. Без контейнеризации управлять десятками сервисов с разными зависимостями было бы практически невозможно.

Kubernetes — оркестрация

Kubernetes (K8s) управляет кластером контейнеров: автоматически перезапускает упавшие сервисы, балансирует нагрузку, масштабирует реплики. Для небольших проектов можно обойтись Docker Compose, но для продакшена с десятками сервисов Kubernetes стал стандартом де-факто.

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

API Gateway (например, Kong, NGINX или облачные решения) принимает все внешние запросы и маршрутизирует их к нужным сервисам. Он также берёт на себя авторизацию, rate limiting и агрегацию ответов от нескольких сервисов.

Брокеры сообщений — асинхронное взаимодействие

Apache Kafka и RabbitMQ обеспечивают асинхронную коммуникацию между сервисами. Вместо прямых HTTP-вызовов сервис публикует событие в очередь, а заинтересованные сервисы его обрабатывают. Это снижает связанность (coupling) и повышает отказоустойчивость.

Дополнительные инструменты, которые часто используются вместе:

  • Service Mesh (Istio, Linkerd) — управление трафиком между сервисами, mTLS-шифрование
  • Распределённая трассировка (Jaeger, Zipkin) — отслеживание запроса через цепочку сервисов
  • Централизованные логи (ELK Stack, Grafana Loki) — сбор логов со всех сервисов в одном месте
  • Feature Flags (Unleash, LaunchDarkly) — постепенное включение функций без передеплоя

Подробнее о паттернах проектирования, которые применимы к микросервисам, читайте в нашей статье о шаблонах проектирования.

Частые вопросы
1
Когда стоит переходить с монолита на микросервисы?

Переход оправдан, когда монолит становится узким местом: деплой занимает часы, команды блокируют друг друга при мёрдже, отдельные модули нуждаются в независимом масштабировании. Практическое правило — если над проектом работают 3+ команды (от 8-10 разработчиков) и границы доменов понятны, можно начинать выделять сервисы. Стратегия Strangler Fig Pattern позволяет делать это постепенно, без «большого переписывания».

2
Обязательно ли использовать Kubernetes?

Нет. Kubernetes решает задачи оркестрации десятков и сотен сервисов, но для 3-5 микросервисов он избыточен. На старте можно использовать Docker Compose, а для облачных решений — AWS ECS, Google Cloud Run или Yandex Serverless Containers. Kubernetes становится оправданным при 10+ сервисах с активным масштабированием.

3
Как микросервисы общаются друг с другом?

Два основных подхода: синхронный — через REST API или gRPC (сервис ждёт ответа), и асинхронный — через брокеры сообщений вроде Kafka или RabbitMQ (сервис отправляет событие и продолжает работу). Синхронный подход проще для запросов-ответов, асинхронный — надёжнее для фоновых процессов и снижает связанность между сервисами.

4
Сколько разработчиков нужно для микросервисной архитектуры?

Минимум — 5-8 человек. Каждый сервис нуждается в поддержке, а помимо бизнес-логики потребуются навыки DevOps, мониторинга и работы с распределёнными системами. Для одного разработчика или маленькой команды из 2-3 человек монолит будет значительно продуктивнее — микросервисы при таком размере команды создают больше проблем, чем решают.

Заключение

Микросервисы — мощный архитектурный подход, но не универсальное решение. Они дают независимый деплой, точечное масштабирование и технологическую свободу, но взамен требуют зрелую DevOps-культуру, инвестиции в инфраструктуру и опыт работы с распределёнными системами.

Прежде чем переходить на микросервисы, убедитесь, что ваш монолит действительно стал узким местом — и что команда готова к новому уровню сложности. Начните с хорошо структурированного модульного монолита, выделите чёткие границы доменов, а затем постепенно извлекайте сервисы по мере роста нагрузки и команды.

Для запуска микросервисов в продакшене нужно освоить всю связку инструментов: Docker обеспечивает упаковку и изоляцию каждого сервиса, Kubernetes — оркестрацию в кластере, а REST API определяет, как сервисы взаимодействуют между собой.

Рекомендуем