[Перевод] Шаблоны проектирования микросервисов — 1. Шаблон монолитного приложения

Java Микросервисы

Оригинальный адрес:микросервисы.IO/patterns/mo…

описание сцены

Предположим, вы разрабатываете большое серверное корпоративное приложение со следующими требованиями:

  • Должны поддерживаться различные клиенты, в том числе: веб-браузеры, WAP-браузеры и собственные мобильные приложения.
  • Предоставлять общедоступные API для вызова
  • Обработка HTTP-запросов или сообщений и выполнение соответствующей бизнес-логики.
  • Доступ к базе данных, кэширование или сохранение данных ответов
  • Связь с другими системами для обмена необходимой информацией
  • Вернуть ответ HTTP, указав конкретный метод сериализации, такой как JSON, XML и т. д.
  • В соответствии с бизнес-логикой и функциями спроектируйте и разделите различные логические модули.

Такое приложение, как бы вы спроектировали архитектуру и развернули его?

Соображения

  • Это проект, разработанный командой, при этом независимая команда отвечает за
  • Члены команды меняются, и новые участники должны быстро приступить к работе.
  • Приложения должны быть простыми для понимания и изменения
  • Ожидайте непрерывную интеграцию и развертывание приложений
  • Приложения должны развертываться в нескольких экземплярах, чтобы соответствовать требованиям масштабируемости и доступности.
  • Хотите использовать относительно новые технологии (фреймворки, языки программирования и т.д.)

решение

использоватьМонолитная архитектура,Например:

  • Программа, запускаемая WAR-файлом Java.
  • Программа Rails или NodeJS с одним каталогом

Пример

Предположим, вы разрабатываете приложение для электронной коммерции, функции которого включают в себя получение заказов от клиентов (StoreFrontUI), проверку и поддержание остатков на складе (служба инвентаризации), проверку и поддержание доступных пользователям остатков (служба бухгалтерского учета), успешное размещение заказов и доставку (служба доставки). ) ). Это приложение разработано какмономерАрхитектурные приложения, такие как веб-приложения Java, состоят из одного файла WAR, работающего в веб-контейнере, таком как Tomcat. Приложения Rails состоят из одной иерархии каталогов на JRuby или Nginx, развернутых на Nginx или Tomcat. Несколько экземпляров можно развернуть за балансировщиком нагрузки для масштабирования и повышения доступности.

image

анализировать

Преимущества этого решения:

  • легко развиваться, текущая IDE в основном разработана в соответствии с разработкой одного приложения.
  • Простота развертывания, просто разверните файл или каталог в веб-контейнере.
  • Легко расширить, который можно масштабировать, развернув несколько экземпляров за балансировщиком нагрузки.

Однако по мере того, как продукт продолжает итерироваться, это монолитное приложение будет становиться все больше и больше, а также будет увеличиваться размер команды, у этой монолитной конструкции будут некоторые недостатки, и эти недостатки будут становиться все более и более серьезными:

  • Код монолитного приложения находится в одной кодовой базе, и эта кодовая база будет становиться все больше и больше, заставляя разработчиков чувствовать себя большими, особенно новичков в команде.Приложение будет сложно понять и модифицировать, следовательно, открытьволосы обычно замедляются. Кроме того,Без четких границ модулей модульность кода со временем становится все более размытой.. Кроме того, из-за того, что трудно понять, как правильно внедрять изменения, и, возможно, также необходимо обеспечить совместимость с ошибками из более старых версий, качество кода со временем ухудшается, постепенно превращаясь в гору дерьма.
  • IDE может вызвать стресс. Чем больше кодовая база, тем медленнее будет IDE.Как правило, IDE индексирует код и загружает его в память для интеллектуального завершения кода. Раздутый код замедлит работу IDE и снизит эффективность разработки.
  • Давление веб-контейнера увеличивается. Чем более раздута программа, тем дольше будет время запуска, что приведет к более медленной отладке кода и большему времени развертывания.
  • Непрерывное развертывание интеграции становится все сложнее и сложнее. Чтобы обновить компонент, необходимо повторно развернуть все приложение. Это приводит к тому, что весь бизнес, независимо от того, есть ли обновления или нет, будет затронут или нарушен. При этом время отката растет, если что-то пойдет не так. Следовательно, это ограничивает частое постоянное обновление программы.
  • Не гибкий для расширения. Различные бизнес-модули могут иметь разную нагрузку, и период высокого давления также может быть разным, но каждый раз расширение требует, чтобы все модули расширялись вместе, что приводит к потерям.
  • распространение ошибки. Если возникает проблема с одним модулем, вызывающая утечку памяти, это повлияет на весь бизнес.
  • Барьеры для разделения команды. Например, нам может понадобиться команда пользовательского интерфейса, команда бухгалтеров, группа инвентаризации и так далее. Проблема с монолитными приложениями заключается в том, что они не позволяют командам работать независимо. Команды должны координировать свои усилия по разработке и передислокации. Команде намного сложнее вносить изменения и обновлять производство.
  • Необходимость использовать один и тот же технологический стек в течение длительного времени. Монолитная архитектура заставляет вас придерживаться стека технологий (а в некоторых случаях и конкретной версии этой технологии), который вы выбираете в начале разработки. В случае монолитных приложений сложно постепенно внедрять новую технологию. Например, используемый вами фреймворк перестает обновляться или устарел, и сложно постепенно адаптировать новую реализацию фреймворка под монолитное приложение.