Кратко

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

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

Как понять

Традиционно существовала концепция приложения, которое полностью решает все задачи программного продукта - монолит. В эпоху быстрого развития рынка IT стало важным уменьшить показатель time-to-market - время доведения до потребителя новой функциональности или продукта. Схематично работу монолита можно изобразить так:

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

Критерий минимальной функциональности микросервиса прост - логика работы микросервиса должна уместиться в голове одного человека.

Плюсы микросервисов:

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

Минусы микросервисов:

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

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

  • Для разработки: GitLab CI, TeamCity, Jenkins, Github Actions, Circle CI, Docker.
  • Для оркестрации: Nomad, Apache Mesos, Kubernetes, Docker Swarm.
  • Для обнаружения активных сервисов: Consul, Eureka, Apache Zookeeper.
  • Для мониторинга: Zabbix, ELK, TICK, Prometheus, Grafana, Graphite.
  • Для организации очередей: RabbitMQ, Apache Kafka, ActiveMQ.

Когда применять

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

Выросла команда разработки. Команда уже больше 10-15 человек и постоянно растёт, новичков становится сложнее погружать во все тонкости разработки. Микросервисы могут упростить командную работу и привести к единому набору стандартов разработки.

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

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

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

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

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