JavaRush /Курсы /Модуль 5. Spring /Лекция 272: Архитектура микросервисного приложения: как д...

Лекция 272: Архитектура микросервисного приложения: как декомпозировать систему

Модуль 5. Spring
28 уровень , 1 лекция
Открыта

Теперь пора перейти к следующему важнейшему этапу — планированию архитектуры и декомпозиции системы на отдельные микросервисы. Ведь, как и в жизни, без четкого плана нас ждет полный хаос. А никто, кроме Святого Рефакторинга, нас от этого хаоса не спасет!


Принципы декомпозиции

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

Принципы правильной декомпозиции

  1. Единая ответственность (Single Responsibility Principle)
    Каждый микросервис должен выполнять только одну функцию или группу тесно связанных функций. Например, если вы строите магазин, можно выделить отдельные микросервисы для управления пользователями, заказами, товарами и оплатой.
  2. Независимость сервисов
    Микросервисы должны быть как можно менее зависимыми друг от друга. Это позволяет обновлять, тестировать и развертывать их без нарушения работы всей системы.
  3. Бизнес-ориентированность
    Границы микросервисов должны основываться на бизнес-логике. Например, в банковской системе уместно разделить сервисы для обработки платежей, управления счетами и проверки кредитной истории.
  4. Изоляция данных
    Каждый микросервис должен владеть своими "данными". Это важный момент! Забудьте про огромные общие базы данных: так вы превратите свои микросервисы обратно в монолит. Разделяйте овец от козлищ, данные от данных.

Архитектурный подход

Когда мы смотрим на нашу будущую систему, всегда лучше начинать с вышеуровневой картины. Задайте себе несколько вопросов:

  • Какие основные бизнес-задачи решает наша система?
  • Какие операции связаны с каждым из процессов?
  • Находятся ли какие-то операции в отдельных "домах" (контексты) или они пересекаются?

Вы можете использовать Domain-Driven Design (DDD), чтобы спроектировать свою систему через призму Бизнес-Контекстов (Bounded Contexts). Бизнес-контексты — это логические области с четко определенными границами ответственности. Например:

  • В системе интернет-магазина контексты могут быть такие: Пользователи, Продукты, Заказы, Платежи.

Рассмотрим пример

Итак, допустим, у нас есть гипотетический проект для интернет-магазина. Пусть будет называться "SpringWebStore" (оригинально, правда?). Мы рассматриваем ключевые процессы:

  • Пользователи регистрируются и покупают товары.
  • Менеджеры добавляют новые товары.
  • Система обрабатывает заказы и платежи.

На основании этих задач можно выделить следующие микросервисы:

  • User Service: управление пользователями (регистрация, аутентификация, обновление профиля).
  • Catalog Service: управление каталогом товаров (добавление, удаление, изменение информации о продуктах).
  • Order Service: обработка заказов.
  • Payment Service: управление платежами.

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

Каждый сервис должен:

  • Иметь собственную базу данных. Например, User Service владеет таблицей пользователей, а Order Service — таблицей заказов.
  • Общаться с другими сервисами только через публичный API (например, REST или события Kafka). Забудьте про общее "прикосновение" к чужой базе данных, иначе будет больно (ну, буквально всегда).

Диаграммы и схемы

Создание диаграмм

Без визуализации наша архитектура легко может превратиться в "техническое болото", где каждый микросервис будет обвинять другой в своих проблемах. Поэтому рисуем схемы взаимодействия!

Пример диаграммы архитектуры для SpringWebStore:


+----------------+            +-------------------+
|    User        |   REST     |    Catalog        |
|    Service     +----------->|    Service        |
+----------------+            +-------------------+
         |
         | Kafka: UserCreatedEvent
         v
+----------------+            +-------------------+
|    Order       |   REST     |    Payment        |
|    Service     +----------->|    Service        |
+----------------+            +-------------------+

Вот вы и показали, как взаимодействуют сервисы:

  • Пользователь создает заказ — его отправляют в Order Service.
  • Сам заказ проверяется на уровне товаров через Catalog Service.
  • Успешные заказы оплачиваются через Payment Service.

Инструменты для визуализации

Хотите красивые диаграммы? Используйте инструменты:

  • Lucidchart для создания диаграмм.
  • Draw.io — бесплатный инструмент для схематизации (интеграция с GitHub).
  • PlantUML — текстовый способ создания UML-диаграмм (встроенный плагин для IntelliJ IDEA).

Частые ошибки в декомпозиции

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

  • Слишком большие микросервисы. Если один из ваших сервисов называется "Main Service" и содержит 90% всей вашей бизнес-логики, что-то явно пошло не так.
  • Слишком маленькие микросервисы. Разделение на микросервисы не должно быть таким, чтобы каждый сервис выполнял одну операцию ("Добавить пользователя").
  • Слишком много общих зависимостей. Если множество микросервисов обращаются к одному и тому же хранилищу данных или к одному общему компоненту, вы, скорее всего, нарушили принцип независимости.
  • Отсутствие четких границ ответственности. Если два сервиса решают одну и ту же задачу, лучше вернуться к планированию и пересмотреть границы.

Применение в реальной жизни

Представьте типичную микросервисную систему Netflix: миллионы пользователей, тысячи фильмов, миллиарды запросов каждый день. Чтобы такая система работала надежно, они разделили свои сервисы на логические модули: рекомендации фильмов, управление подписками, обработка потоков данных. Каждый из них выполняет одну функцию и взаимодействует через четко определенные интерфейсы (где-то REST, где-то — Kafka).

Ваш финальный проект — это небольшой Netflix. Но принцип остаётся прежним: если вы правильно декомпозируете систему, вы уменьшите количество проблем и увеличите скорость разработки.

Теперь, когда мы разобрались с декомпозицией системы, пора отправиться к следующему этапу — подготовке инфраструктуры! Там нас ждут Kafka, Eureka и API Gateway, чтобы связать всё воедино.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ