Автор статьи: Артем Михайлов

Микросервисная архитектура - это подход к разработке программного обеспечения, который в настоящее время очень популярен среди разработчиков. Эта архитектура позволяет разбить большой монолитный приложения на маленькие и независимые сервисы, каждый из которых выполняет свою собственную функцию.

Почему микросервисная архитектура стала популярным решением?

Микросервисная архитектура позволяет разработчикам сосредоточиться на отдельных сервисах, что упрощает тестирование и обслуживание каждого сервиса по отдельности. Как правило, каждый сервис может быть развернут и масштабирован отдельно от остальных, что делает систему более гибкой и масштабируемой. Это также способствует распределенному развитию, ускоряет процесс разработки, и позволяет компании более быстро адаптироваться к изменениям бизнес-требований.

Но не все так однозначно. В этой статье мы разберем основные преимущества и недостатки микросервисной архитектуры.

Основные преимущества

1. Гибкость и масштабируемость

Гибкость - это способность системы быстро и легко изменяться в зависимости от изменяющихся потребностей пользователей или рынка. В микросервисной архитектуре гибкость достигается благодаря тому, что каждый сервис является отдельным компонентом, который может быть легко изменен или заменен без влияния на остальную систему. Например, если нужно добавить новую функциональность, можно создать новый сервис и подключить его к системе, не затрагивая уже существующие сервисы. В результате система становится более гибкой, так как её компоненты могут изменяться независимо друг от друга.

Масштабируемость - это способность системы расти и масштабироваться под высокие нагрузки без значительного увеличения затрат. В микросервисной архитектуре масштабируемость достигается благодаря тому, что каждый сервис может быть масштабирован независимо от других сервисов. Например, если один из сервисов сталкивается с большой нагрузкой, можно просто добавить еще несколько экземпляров этого сервиса, не затрагивая другие сервисы в системе. В результате система становится более масштабируемой, так как её компоненты могут масштабироваться независимо друг от друга.

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

2. Легкость добавления новых функций и сервисов

Микросервисная архитектура предоставляет возможность быстро и легко добавлять новые функции и сервисы в систему, не затрагивая работу других сервисов. Она предусматривает создание каждого сервиса независимо и их интеграцию с остальными сервисами.

Например, интернет-магазин может использовать микросервисную архитектуру для работы с платежами, уведомлениями, складом и другими функциями. Если магазин решит добавить новые возможности, например, программу лояльности для клиентов, он может просто создать новый микросервис и интегрировать его в систему. Это ускоряет разработку новых функций и помогает предусмотреть возможные будущие изменения.

3. Повышенная надежность и устойчивость к сбоям

Компоненты микросервисной архитектуры работают в отдельности и могут быть запущены даже на разных серверах. Это делает архитектуру более устойчивой и менее уязвимой к отказам и сбоям. Если приложение в монолитной архитектуре перестает работать, это означает, что проблема возникла в одной большой системе и весь код приложения обнаруживает сбой. В случае же с микросервисной архитектурой, даже если один компонент выходит из строя, всё приложение не перестаёт работать и некоторые компоненты или функционал могут оставаться доступными.

Если один из сервисов не работает или работает с ошибками, это позволяет быстро и легко его заменить или перезапустить, не останавливая все приложение.. Это гарантирует своевременную поддержку и надежную работу приложения. 

К примеру, если мы рассмотрим сайт магазина, который работает на микросервисной архитектуре, то возможна ситуация, когда компонент отвечающий за корзину не работает. В этом случае все остальные компоненты продолжают работать и пользователь может продолжить выбор и добавление товаров в корзину, а проблемный компонент может быть заменен на новый сайтом без более длительных перерывов в работе.

4. Улучшенная переносимость и развертывание

Давайте представим, что ваша компания делает игры. Вы работаете в отделе разработки и вам постоянно нужно выпускать новые игры, обновлять старые и разрабатывать дополнительный контент. Это означает, что вы постоянно должны иметь возможность развернуть вашу игровую платформу на новом сервере, провести быстрый запуск и начать работать.

Когда вы используете монолитную архитектуру, каждое развертывание может стать настоящей головной болью. Вы должны убедиться, что все компоненты вашей платформы работают правильно, протестировать всю систему и убедиться, что она полностью работает перед запуском. Этот процесс может занять несколько дней или недель, в зависимости от размера вашей платформы.

Микросервисная архитектура помогает решить эту проблему. Каждый компонент вашей платформы, например, чат, игровая статистика или магазин игр, запускается в виде отдельного микросервиса. Каждый микросервис уже спроектирован таким образом, чтобы запускаться и работать независимо, без зависимостей от других сервисов.

Теперь, когда вы хотите развернуть вашу платформу на новом сервере, вам нужно просто перенести каждый микросервис на новый сервер и запустить его. Такой процесс занимает всего несколько минут. Еще одним преимуществом микросервисной архитектуры является то, что вы можете обновлять и тестировать каждый микросервис отдельно без влияния на другие компоненты вашей платформы.

Таким образом, микросервисная архитектура похожа на набор маленьких "камней", из которых состоит ваша платформа. Каждый "камень" независим, легок и его можно легко перенести в любое место. Это делает микросервисную архитектуру идеальным решением для быстрого развертывания и улучшенной переносимости.

Недостатки

1. Усложнение инфраструктуры и управления сервисами

Представим себе микросервисную архитектуру как город, где каждый сервис - это отдельный дом. В маленьком городке управлять строительством и содержанием домов не довольно трудно, но, если город становится слишком большим и сложным, управление становится более сложным процессом.

Аналогично, когда применяется микросервисная архитектура, инфраструктура и управление сервисами также становятся сложными. После того, как приложение становится более сложным, количество сервисов превышает пороговое значение, и компании начинают сталкиваться с новыми проблемами и трудностями.

Например, у каждого сервиса должен быть свой набор настроек, настройка которых занимает время и требует определенных навыков. Кроме того, необходимо следить за тем, чтобы все сервисы работали максимально эффективно и было возможно быстрое обнаружение и устранение проблем.

Конечно, с помощью современных инструментов и технологий можно значительно упростить управление микросервисами. Однако их внедрение также требует времени и усилий.

Кроме того, каждый новый сервис в микросервисной архитектуре увеличивает количество необходимых инструментов, кластеров и фреймворков. Это приводит к увеличению расходов на инфраструктуру, что может оказаться проблемой, особенно для небольших компаний.

2. Высокий уровень зависимости сервисов также может быть минусом микросервисов. 

Если один из сервисов временно выйдет из строя, тогда мы не сможем использовать функциональность, которую предоставляет этот сервис. Если такой сбой произойдет в основном сервисе, весь процесс приложения может столкнуться с сбоем и привести к недостатку в эффективности.

Другой пример недостатка высокого уровня зависимости сервисов может быть представлен на примере сбоя одного из сервисов, который зависит от другого сервиса, на котором есть узкие места. В этом случае проблема на одном из сервисов может привести к сбою на другом сервисе, который зависит от него. Это приведет к сокращению эффективности приложений и может снизить скорость их работы.

Более того, если сервисы разработаны на разных технологиях, высокий уровень зависимости между ними может стать проблемой. Если один из сервисов обновится, это может привести к сбою работы других сервисов, которые с ним связаны.

Высокий уровень зависимости сервисов в микросервисной архитектуре может привести к усложнению тестирования и проблеме достаточности тестовой площадки. Если наши сервисы высоко связаны, то при изменении одного из них нужно будет изучить также влияние этих изменений на другие сервисы, что усложнит тестирование приложения.

3. Проблемы с безопасностью и целостностью данных

Во-первых, разделение приложения на отдельные сервисы усложняет контроль за доступом к данным. Если данные хранятся в разных сервисах, то необходимо убедиться, что каждый сервис имеет доступ только к тем данным, к которым ему нужен доступ. В противном случае, возможны утечки конфиденциальной информации или несанкционированный доступ к данным.

Метафорой для данной ситуации может служить замок с несколькими ключами. Каждый ключ открывает отдельную комнату, но есть риск того, что один ключ может быть использован для доступа к другой комнате. Точно так же, как и в случае с ключами, необходимо убедиться, что каждый сервис имеет доступ только к тем данным, которые ему нужны, и не может получить доступ к другим данным.

Во-вторых, сложность микросервисной архитектуры увеличивает вероятность ошибок, которые могут привести к нарушению целостности данных. При отдельной разработке каждого сервиса возможно использование разных баз данных и разных форматов данных, что увеличивает риск проблем с интеграцией данных и целостностью документов.

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

Таким образом, проблемы с безопасностью и целостностью данных являются серьезным недостатком микросервисной архитектуры. Необходимо уделить особое внимание контролю доступа к данным и целостности данных, чтобы избежать рисков нарушения конфиденциальности и помех в работе приложения.

Решения для минимизации недостатков

Какие решения могут помочь вам обойти эти препятствия и достичь успеха в микросервисной разработке? 

1. Использование контейнеров и оркестраторов: 

Использование контейнеров и оркестраторов является ключевой стратегией для успешной реализации микросервисной архитектуры. 

Контейнеры - это такие, как Docker, предоставляют лёгкую и удобную возможность изолировать, упаковывать и доставлять приложения, упрощая тем самым деплоят и шкалирование микросервисов. Контейнеризация улучшает портативность ваших приложений, упрощая их развёртывания и масштабирование на различных средах. Контейнеры дают возможность разделить микросервисы на отдельные компоненты, каждый из которых контролируется и изолирован от других.

Оркестраторы, такие как Kubernetes и Docker Swarm, позволяют автоматизировать управление контейнерами. Они делают возможным масштабирование микросервисов, распределение нагрузки между различными узлами и обеспечивают отказоустойчивость всего приложения. Оркестраторы предоставляют оптимальный баланс между производительностью и доступностью приложений.

Использование контейнеров и оркестраторов в микросервисной архитектуре позволяет ускорить развертывание и обеспечить более надёжную работу при масштабировании, а также может помочь управлять группами микросервисов, что предоставляет универсальный инструментарий для поддержки цикла разработки приложения - от создания и тестирования до развертывания и эксплуатации в условиях производственной среды.

2. Автоматизация развертывания и тестирования: 

Автоматизация развертывания и тестирования - это еще один важный инструмент в реализации микросервисной архитектуры. При таком подходе, все процессы (как развертывание, так и тестирование) полностью автоматизируются, что позволяет значительно ускорить и упростить разработку и внедрение новых микросервисов, а также снизить вероятность ошибок в процессе версионирования. 

Для автоматизации развертывания и тестирования используются различные инструменты, такие как Jenkins, TravisCI, CircleCI и другие. Они позволяют автоматически собирать, развертывать и тестировать микросервисы при каждом изменении кода в репозитории. Это значительно сокращает время, затрачиваемое на версионирование и обнаружение ошибок (багов), позволяя разработчикам быстро и эффективно выявлять и решать проблемы.

3. Применение микросервисной архитектуры только в тех случаях, когда это действительно необходимо: 

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

Заключение

В заключении стоит отметить, что микросервисная архитектура – один из наиболее актуальных и перспективных подходов в современном IT-отрасли. Она предоставляет значительное количество преимуществ, таких как гибкость, масштабируемость и простота внедрения новых функций. Однако не стоит забывать и о недостатках микросервисов, таких как сложность управления большим количеством сервисов и наличие дополнительных затрат на разработку и поддержку инфраструктуры.

В целом, выбор микросервисной архитектуры должен основываться на конкретных задачах проекта и потребностях бизнеса. Но если проект нуждается в гибкости, масштабируемости и инновационных решениях, то микросервисы – это отличный выбор. Решение, которое может по-настоящему изменить и усовершенствовать работу вашей компании.

Напоследок хочу порекомендовать вам бесплатный вебинар от OTUS, на котором будут рассмотрены основы domain-driven design и применение к предметно-ориентированному проектированию. На вебинаре вы поймете как DDD помогает в построении архитектуры.

Комментарии (5)


  1. nronnie
    06.06.2023 14:04
    +2

    Примером гибкости и масштабируемости микросервисной архитектуры может служить сравнение ее с многоэтажным домом.

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

    возможна ситуация, когда компонент отвечающий за корзину не работает. В этом случае все остальные компоненты продолжают работать и пользователь может продолжить выбор и добавление товаров в корзину

    Это как, если как раз корзина и не работает? Но, вот, например, просматривать каталог, оплачивать и отслеживать уже оформленные заказы, при нужном разбиении на МС будет вполне возможно.

    Все это, конечно, хорошо, но из четырех проектов на МС где работал три были такие, что лучше бы их создатели про МС вообще никогда бы не слышали.


  1. Kodzo
    06.06.2023 14:04
    +1

    Кажется, я это уже много раз читал. Почти слово в слово.


    1. jetteim
      06.06.2023 14:04

      А я даже писал для наших системных аналитиков


  1. FuN_ViT
    06.06.2023 14:04
    +2

    Зачем нужна обзорная статья про микросервисы в 2023?

    А, для рекламы, до свидания!


    1. MaxRokatansky Автор
      06.06.2023 14:04

      Для новичков, например