В чем разница между сервисом и микросервисом?

Ответ

Сервис — это общий термин для компонента, который предоставляет чётко определённую функциональность через API (например, сервис отправки email или расчёта налогов). Он может быть частью монолитной архитектуры.

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

  1. Инкапсулирует свою бизнес-домен (например, «Пользователи», «Заказы», «Оплата»).
  2. Имеет собственную базу данных, не разделяемую напрямую с другими сервисами.
  3. Общается через лёгкие механизмы (чаще HTTP/REST, gRPC, асинхронные сообщения).
  4. Может быть разработан на независимом технологическом стеке.

Пример сравнения:

  • В монолите: Класс OrderService вызывает метод EmailSender::send() внутри того же процесса.
  • В микросервисах: Сервис orders публикует событие OrderCreated в брокер сообщений (например, RabbitMQ), а независимый сервис notifications подписывается на это событие и отправляет email.

Главное отличие: Микросервис — это сервис, построенный по принципам слабой связанности и высокой автономности, что позволяет независимое масштабирование, развёртывание и отказоустойчивость.

Ответ 18+ 🔞

А, ну это классика, ёпта! Объясняю на пальцах, без этих ваших заумных буклетов.

Представь себе здоровенный, ебаный монолит. Это как старый совковый завод-гигант: в одном здании и литейный цех, и конвейер, и бухгалтерия, и столовая. Всё в одной куче. Вот внутри этого завода есть отделы — это и есть сервисы. EmailSender — это как служба доставки корреспонденции по заводу. Работает, но если завод встал на плановый ремонт, то и почтальон сидит без дела, жрёт печеньки. Всё в одном процессе, одна база данных на всех — общага, блядь.

А теперь смотри сюда, микросервисы — это когда этот ебучий завод разобрали нахуй и построили вместо него технопарк. Отдельный модный офис для «Заказов», через дорогу — склад «Товаров», в соседнем здании — call-центр «Оплаты». Каждый — самостоятельная контора.

  1. У каждой конторы своя, блядь, база данных. Склад не лезет в бухгалтерские проводки оплаты напрямую. Доверия ебать ноль, так сказать. Общаются они между собой не через внутренние телефоны (вызов метода), а через документооборот или курьеров — то есть HTTP или асинхронные сообщения в очередь.
  2. Развёртываются независимо. Захотел склад «Товаров» обновить стеллажи — пожалуйста, остальные работают. В монолите же чтобы гвоздь в столбовую забить, надо весь завод останавливать.
  3. Технологический пиздец (в хорошем смысле). Офис «Заказов» может быть на Python, склад — на Go, а «Оплата» — на Java 1.8, как будто на дворе 2015-й год. Главное, чтобы договора (API) между ними соблюдались.

Пример, чтобы совсем пиздец стало понятно:

  • В монолите (старый завод): Менеджер из отдела OrderService берёт трубку внутреннего телефона (вызывает метод) и орёт: «Вась, из почтовой службы EmailSender! Клиенту чек отправь, быстро!». Всё внутри одного здания.
  • В микросервисах (технопарк): Офис orders печатает уведомление «Заказ №666 создан» и кладёт его в ящик «Исходящие» (публикует событие OrderCreated в RabbitMQ). Его вообще не ебёт, кто это прочитает. Отдельно, в здании notifications, курьер (подписчик) забирает эту бумажку из ящика «Входящие» и везёт клиенту email. Если сервис нотификаций сгорел, заказы всё равно будут создаваться, просто уведомления в очереди накопятся.

Короче, главная разница как между здоровенной дубиной и швейцарским ножом с кучей лезвий. Дубина (монолит) — простая, но если сломалась, ты просто с палкой. А нож (микросервисы) — гибкий, можно одно лезвие поточить, не трогая остальные, но если его роняешь, собирать полчаса по двору, ядрёна вошь. За автономность и масштабируемость платишь херовой сложностью взаимодействия.