Как правильно разделить микросервисы?

Привет! У меня есть свой pet-проект — онлайн-магазин. Я решил разделить REST API на микросервисы, написал proto-файлы и сгенерировал код, и, кажется, все работает нормально. У меня клиент использует HTTP, а взаимодействие между микросервисами происходит через gRPC. 

У меня остался вопрос: следует ли размещать все микросервисы в одном репозитории и запускать их таким образом, или лучше распределить их по разным веткам проекта и затем импортировать в главный?
  • 16 февраля 2025 г. 18:04
Ответы на вопрос 3
Привет! Разделение на микросервисы — это важный шаг, и правильно организовать их структуру и развертывание — ключ к успеху.

### Репозиторий микросервисов

1. **Monorepo (один репозиторий для всех микросервисов)**:
   - **Преимущества**:
     - Упрощенное управление зависимостями.
     - Легко обеспечивать согласованность версий между сервисами.
     - Упрощает координацию изменений и рефакторинг общего кода.
   - **Недостатки**:
     - При развитии большого проекта может сильно увеличиться размер репозитория.
     - Чтобы обновить один сервис, возможно, придется работать с другими, даже если они не изменились.

2. **Multirepo (раздельные репозитории для каждого микросервиса)**:
   - **Преимущества**:
     - Большая гибкость при развертывании и масштабировании, так как каждая команда может работать независимо.
     - Удобно регулировать доступ и разрешения к различным сервисам.
     - Легче управлять версиями одним сервиcом без учета остальных.
   - **Недостатки**:
     - Сложность в координации изменений между сервисами.
     - Необходимость в инструментах для управления зависимостями между репозиториями.
   
### Рекомендации

1. **Размер и сложность проекта**: Если ваш проект еще небольшой и не очень сложный, вам может быть проще начать с monorepo. Это упростит разработку и тестирование.

2. **Команда и управление**: Если у вас есть большая команда, разделение на разные репозитории (multirepo) может помочь избежать конфликтов и упростить процесс разработки.

3. **Автоматизация и CI/CD**: Независимо от выбора, важно настроить автоматизацию для сборки и развертывания ваших сервисов, чтобы упростить производственный процесс.

4. **Контейнеризация**: Если не делали этого ранее, посмотрите в сторону Docker и orchestration-систем (например, Kubernetes) для управления деплоем микросервисов.

5. **Документация**: Обязательно поддерживайте актуальную документацию API и схемы взаимодействия. Это поможет избежать путаницы при взаимодействии между командами.

### Вывод

В конечном счете, решение зависит от ваших конкретных потребностей и структуры команды. Если вы планируете постепенно масштабировать проект и команду, возможно, стоит сразу рассмотреть подход с многими репозиториями. Але если вы только начинаете и хотите минимизировать трудности на первоначальном этапе, monorepo может быть лучшим выбором.
микросервисы - сущность характерная для более-менее активных нагрузок, ибо сама идея была на уровне горизонтального масштабирования. 
То есть грубо если на 100500 запросов масштабировать монолит - то надо xN экземпляров монолита с такой же кратностью ресурсов, а если прикладная система рубится на те самые функциональные части (микросервисы), то оказывается что надо разное количество экземпляров для разных "кусков" (микросервисов), что на больших цифрах и даст профит.
Естественно у этого профита есть и обратная сторона - передача данных между микросервисами это совсем не то же самое что передача параметров в вызов метода (даже по значению) и т.п.

Так что для pet проектов - это всё будет баловством и натягиванием микросервисом за уши.
Но если уж очень захочется - можно и пострадать микросервисами головного мозга и сделать вычурное:
- взять и разделить всё например по api - грубо на каждую crud четвёрку - свой микросервис
- не дать взаимодействовать микросервисам между собой - пусть этим занимается отдельный микросервис-передаст
- аналогично базой - вот пусть с ней работает отдельный микросервис, а остальные ходят к нему (хотя это слегка нарушит концепт "каждому микросервису по своей БД")

Ну и дальше - каждый микросервис сможет пилить отдельная команда разработки -> каждому по своему репозиторию... ну а знание друг о друге микросервисов замкнутся на одном/нескольких репозиториях контрактов

Монстр - готов)
Микросервисы — не только для нагрузки, а также инструмент менеджмента разработки. 

Что это значит?
Это значит, что есть большая команда и наличие одной кодовой базы — есть точка препятствия, когда одна команда зависит от другой, а нужно делать быстро и независимо. Иными словами пример: есть в Яндекс.Такси 10 команд, в одной кодовой базе ни будут толкаться и зависеть друг от друга, зависимости общие, разрезание на микросервисы помогают разделить эту работу, выделить скоуп и каждая команда теперь может работать со своей скоростью, своими логами, своим релизным циклом и не зависеть от других...
Похожие вопросы