Назад к статьям

Микросервисы на Go: от монолита к распределённой системе

Пошаговый опыт декомпозиции монолита на микросервисы. Когда это нужно и как не сломать всё по пути.

Не начинайте с микросервисов

Самый частый антипаттерн — разбивать на микросервисы до того, как вы понимаете домен. Монолит — это нормально на старте. Микросервисы — это о масштабировании команд и независимом деплое.

Когда декомпозировать

Признаки, что пора:

  • Деплой одного модуля ломает другой
  • Команды мешают друг другу в одном репозитории
  • Части системы требуют разного масштабирования

Стратегия Strangler Fig

Не переписывайте всё разом. Выносите по одному bounded context, оставляя монолит работающим:

// Proxy в монолите перенаправляет трафик
func (h *Handler) GetOrders(w http.ResponseWriter, r *http.Request) {
    if featureFlag("orders-v2") {
        // Проксируем в новый сервис
        proxy.Forward(w, r, orderServiceURL)
        return
    }
    // Старая логика
    h.legacyOrders(w, r)
}

Межсервисная коммуникация

gRPC для синхронных вызовов, Kafka/RabbitMQ для событий. Никогда не используйте REST для внутренних коммуникаций — overhead того не стоит.

Что мы получили

Время деплоя: 40 мин → 3 мин. Независимые команды. Но сложность операций выросла в 3 раза. Trade-offs.

Похожие статьи

Go · Architecture · API

Проектирование высоконагруженных API на Go

Разбираем архитектурные паттерны и подходы к созданию API, способного обрабатывать миллионы запросов.

Go · Clean Architecture · Best Practices

Чистая архитектура в Go: от теории к практике

Как применить принципы Clean Architecture в Go-проекте и не превратить код в Java-подобный boilerplate.