Некоторые из перечисленных источников этой статьи могут быть ненадежными . Пожалуйста ( Октябрь 2018 ) |
Тон или стиль этого раздела может не отражать энциклопедический тон , используемый в Википедии . ( Июнь 2024 г. ) |
В программной инженерии архитектура микросервисов — это архитектурный шаблон , который организует приложение как набор слабосвязанных , мелкозернистых сервисов, взаимодействующих через легкие протоколы . Архитектура на основе микросервисов позволяет командам разрабатывать и развертывать свои сервисы независимо, уменьшать взаимозависимость кода и повышать читаемость и модульность в кодовой базе. Это достигается за счет сокращения нескольких зависимостей в кодовой базе, что позволяет разработчикам развивать свои сервисы с ограниченными ограничениями и уменьшать дополнительную сложность. [1] Следовательно, организации могут разрабатывать программное обеспечение с быстрым ростом и масштабируемостью, а также проще реализовывать готовые сервисы. Эти преимущества сопряжены с затратами на необходимость поддержания разъединенной структуры в кодовой базе, что означает, что ее первоначальная реализация сложнее, чем у монолитной кодовой базы . [2] Интерфейсы должны быть тщательно спроектированы и рассматриваться как API .
Микросервис аналогичен ограниченному контексту в доменно-ориентированном проектировании . [3]
Единого определения для микросервисов не существует. Со временем в отрасли сформировался консенсус. Некоторые из часто упоминаемых определяющих характеристик включают:
Микросервис не является слоем внутри монолитного приложения (например, веб-контроллера или бэкэнда для фронтэнда). [10] Скорее, это самостоятельная часть бизнес-функциональности с понятными интерфейсами, и может, через свои внутренние компоненты, реализовывать многоуровневую архитектуру. Со стратегической точки зрения, архитектура микросервисов по сути следует философии Unix «Делай одно дело и делай это хорошо». [11] Мартин Фаулер описывает архитектуру на основе микросервисов как имеющую следующие свойства: [4]
Микросервисные архитектуры обычно принимаются для облачных приложений , серверных вычислений и приложений, использующих легкое развертывание контейнеров . По словам Фаулера, из-за большого количества (по сравнению с монолитными реализациями приложений) сервисов, децентрализованная непрерывная доставка и DevOps с целостным мониторингом сервисов необходимы для эффективной разработки, поддержки и эксплуатации таких приложений. [15] Следствием (и обоснованием) следования этому подходу является то, что отдельные микросервисы могут масштабироваться по отдельности. В монолитном подходе приложение, поддерживающее три функции, должно быть масштабировано полностью, даже если только одна из этих функций имеет ограничение по ресурсам. [16] С микросервисами необходимо масштабировать только микросервис, поддерживающий функцию с ограничениями по ресурсам, что обеспечивает преимущества оптимизации ресурсов и затрат. [17]
В феврале 2020 года в отчете по исследованию рынка облачных микросервисов был сделан прогноз, что объем мирового рынка архитектуры микросервисов будет увеличиваться в среднем на 21,37% в период с 2019 по 2026 год и достигнет 3,1 млрд долларов США к 2026 году. [18]
В 1999 году разработчик программного обеспечения Питер Роджерс работал над исследовательским проектом Dexter в Hewlett Packard Labs , целью которого было сделать код менее хрупким и сделать крупномасштабные сложные программные системы устойчивыми к изменениям. [19] В конечном итоге этот путь исследований привел к разработке ресурсно-ориентированных вычислений (ROC), обобщенной абстракции вычислений, в которой REST является особым подмножеством. В 2005 году во время презентации на конференции Web Services Edge Роджерс выступил за « REST -сервисы» и заявил, что « Программные компоненты являются микро-веб-сервисами... Микро-сервисы составлены с использованием конвейеров, подобных Unix (Web встречает Unix = настоящая слабая связь ). Сервисы могут вызывать сервисы (+многоязыковые среды выполнения). Сложные сборки сервисов абстрагируются за простыми интерфейсами URI . Любой сервис, на любой гранулярности, может быть представлен». Он описал, как хорошо спроектированная платформа микросервисов «применяет базовые архитектурные принципы веб- и REST-сервисов вместе с планированием и конвейерами в стиле Unix, чтобы обеспечить радикальную гибкость и улучшенную простоту в сервисно-ориентированных архитектурах. [20]
Также в 2005 году Алистер Кокберн написал о гексагональной архитектуре , которая является шаблоном проектирования программного обеспечения, используемым вместе с микросервисами. Этот шаблон делает возможным проектирование микросервиса, поскольку он изолирует по слоям бизнес-логику от вспомогательных сервисов, необходимых для развертывания и запуска микросервиса полностью независимо от других.
Ключевым шагом в определении архитектуры микросервисов является выяснение того, насколько большим должен быть отдельный микросервис. Для этого нет консенсуса или лакмусовой бумажки, поскольку правильный ответ зависит от бизнес- и организационного контекста. [21] Например, Amazon использует сервисно-ориентированную архитектуру, где сервис часто сопоставляется 1:1 с командой из 3–10 инженеров. [22]
Чтобы найти правильный уровень детализации сервиса, архитекторы должны постоянно итерировать свои проекты компонентов с программистами . Архитекторы должны учитывать требования пользователей, обязанности и архитектурные характеристики (т. е. нефункциональные требования ). [3]
В контексте архитектуры программного обеспечения службы, предназначенные для одной задачи, например, вызова определенной бэкэнд-системы или выполнения определенного вычисления, называются атомарными службами. Службы, которые вызывают атомарные службы для консолидации вывода, называются составными службами.
Считается плохой практикой делать сервис слишком маленьким, так как тогда накладные расходы времени выполнения и эксплуатационная сложность могут перевесить преимущества подхода. Когда сервисы становятся слишком мелкозернистыми, следует рассмотреть альтернативные подходы, такие как упаковка функции в виде библиотеки или интеграция ее в другие микросервисы. [7]
Если при моделировании домена, для которого создается система, используется доменно-ориентированное проектирование , то микросервис может быть настолько же малым, как агрегат, или настолько большим, как ограниченный контекст. [23]
В обсуждении детализации микросервисов есть спектр. На одном конце находятся Анемичные сервисы, которые не имеют большого количества обязанностей, а на другом конце — Модульный монолит, представляющий собой большие модули системы.
Преимуществ разбиения приложения на несколько более мелких сервисов множество:
Подход на основе микросервисов подвергается критике по ряду причин:
Архитектура вносит дополнительную сложность и новые проблемы, с которыми приходится иметь дело, такие как задержка , дизайн формата сообщений , [41] резервное копирование /доступность/согласованность (BAC), [42] балансировка нагрузки и отказоустойчивость . [35] Все эти проблемы должны решаться в масштабе. Сложность монолитного приложения не исчезает, если оно повторно реализуется как набор микросервисов. Часть сложности преобразуется в операционную сложность. [43] Другие места, где проявляется сложность, — это увеличенный сетевой трафик, что приводит к снижению производительности. Кроме того, приложение, состоящее из любого количества микросервисов, имеет большее количество точек интерфейса для доступа к своей соответствующей экосистеме , что увеличивает архитектурную сложность. [44] Различные принципы организации (такие как гипермедиа как механизм состояния приложения (HATEOAS), документация по интерфейсу и модели данных, полученная с помощью Swagger и т. д.) были применены для уменьшения влияния такой дополнительной сложности.
По словам О'Рейли, каждый микросервис должен иметь свои собственные архитектурные характеристики (т. е. нефункциональные требования ), и архитекторы не должны определять единые характеристики для всей распределенной системы . [3]
Задержка часто измеряется с помощью «99-го процентиля», поскольку медианное и среднее значение задержки может вводить в заблуждение, поскольку они могут пропускать выбросы . [45] [ нужна страница ] [46]
Микросервисы компьютеров могут быть реализованы на разных языках программирования и могут использовать разные инфраструктуры. Поэтому наиболее важным выбором технологий является способ взаимодействия микросервисов друг с другом (синхронный, асинхронный, интеграция пользовательского интерфейса) и протоколы, используемые для взаимодействия (RESTful HTTP, обмен сообщениями, GraphQL ...). В традиционной системе большинство технологических выборов, таких как язык программирования, влияют на всю систему. Поэтому подход к выбору технологий совершенно иной. [47]
Фонд Eclipse опубликовал спецификацию для разработки микросервисов, Eclipse MicroProfile. [48] [49]
В сервисной сетке каждый экземпляр сервиса сопряжен с экземпляром обратного прокси-сервера, называемым сервисным прокси, прокси-сервером sidecar или sidecar. Экземпляр сервиса и прокси-сервер sidecar совместно используют контейнер, а контейнеры управляются инструментом оркестровки контейнеров, таким как Kubernetes , Nomad, Docker Swarm или DC/OS . Прокси-серверы сервисов отвечают за связь с другими экземплярами сервисов и могут поддерживать такие возможности, как обнаружение сервисов (экземпляров), балансировка нагрузки, аутентификация и авторизация, защищенная связь и другие.
В сервисной сетке экземпляры служб и их прокси-серверы sidecar, как говорят, составляют плоскость данных, которая включает не только управление данными, но и обработку запросов и ответ. Сервисная сетка также включает плоскость управления для управления взаимодействием между службами, опосредованным их прокси-серверами sidecar. [ необходима цитата ]
Реализация архитектуры микросервисов очень сложна. Существует множество проблем (см. таблицу ниже), которые должна решать любая архитектура микросервисов. Netflix разработала фреймворк микросервисов для поддержки своих внутренних приложений, а затем открыла исходный код [50] многих частей этого фреймворка. Многие из этих инструментов были популяризированы через Spring Framework — они были повторно реализованы как инструменты на основе Spring под эгидой проекта Spring Cloud [51] . В таблице ниже показано сравнение реализации функции из экосистемы Kubernetes с эквивалентом из мира Spring Cloud. [52] Одним из примечательных аспектов экосистемы Spring Cloud является то, что все они основаны на Java, тогда как Kubernetes — это многоязычная платформа времени выполнения.
Микросервисы вызывают беспокойство | Spring Cloud и Netflix OSS | Кубернетес |
---|---|---|
Управление конфигурацией: [53] конфигурация для приложения микросервиса должна быть вынесена из кода и иметь возможность извлечения с помощью простого вызова службы. | Spring Config Server, Netflix Archaius поддерживают расположение конфигурации на основе Git-репозитория. Archaius поддерживает типизацию данных конфигурации. | Kubernetes ConfigMaps раскрывает конфигурацию, хранящуюся в etcd, через сервисы. Kubernetes Secrets поддерживает безопасное развертывание на основе сервисов и использование конфиденциальной информации о конфигурации (такой как пароли, сертификаты и т. д.). |
Обнаружение сервисов : ведение списка экземпляров сервисов, доступных для работы в домене микросервисов. | Spring Cloud Eureka позволяет клиентам регистрироваться, поддерживает связь с зарегистрированными клиентами и сопоставляет имена служб с именами хостов для клиентов, которые ищут службы по имени службы. | Службы Kubernetes обеспечивают регистрацию во время развертывания экземпляров служб, которые доступны внутри кластера. Ingress — это механизм, посредством которого служба может быть представлена клиентам за пределами кластера. |
Балансировка нагрузки : ключ к масштабированию распределенной системы — возможность запускать более одного экземпляра компонента. Затем нагрузка должна быть распределена по этим экземплярам с помощью балансировщика нагрузки. | Spring Cloud Ribbon предоставляет клиентам сервиса возможность балансировать нагрузку между экземплярами сервиса. | Служба Kubernetes обеспечивает возможность балансировки нагрузки службы по всем экземплярам службы. Это не эквивалент того, что предоставляет Ribbon. |
API-шлюз: Детализация API, предоставляемых микросервисами, часто отличается от того, что нужно клиенту сервиса. API-шлюзы реализуют фасады и предоставляют дополнительные сервисы, такие как проксирование, трансляция протоколов и другие функции управления. | Spring Cloud Zuul предоставляет API-фасады на основе конфигурации | Kubernetes Service и Ingress-ресурсы, Istio, Ambassador — это решения, которые предоставляют как север-юг (трафик в центр обработки данных и из него), так и восток-запад (трафик между центрами обработки данных, облаками или регионами) функции API-шлюза. Zuul также может быть реализован вместе с Kubernetes, обеспечивая настройку на уровне отдельных служб. |
Проблемы безопасности: Многие проблемы безопасности перекладываются на реализацию шлюза API. При использовании распределенных микросервисных приложений имеет смысл не изобретать велосипед безопасности и разрешить определение и реализацию политики в компонентах, которые являются общими для всех сервисов. | Spring Cloud Security решает множество проблем безопасности с помощью Spring Cloud Zuul | Экосистема Kubernetes предоставляет сервисные сети, такие как Istio, которые способны обеспечивать безопасность с помощью механизмов шлюза API. |
Централизованное ведение журнала: важно иметь централизованную инфраструктуру сбора и анализа журналов для управления множеством служб, многие из которых работают распределенно. | Стек ELK ( Elasticsearch , Logstash , Kibana ) | Стек EFK ( Elasticsearch , Fluentd , Kibana ) |
Централизованные показатели: для надлежащей работы необходима централизованная область, где можно отслеживать работоспособность и производительность отдельных служб и всей системы. | Спринг Спектатор и Атлас | Хипстер, Прометей и Графана |
Распределенная трассировка: ведение журнала по процессам и мониторинг метрик имеют свое место, но ни то, ни другое не может реконструировать сложные пути, по которым проходят транзакции при распространении по распределенной системе. Распределенная трассировка является важным инструментом для платформы микросервисов. | Весенний Облачный Сыщик | Ястреб, Йегер |
Устойчивость к сбоям и отказам: распределенные системы должны иметь возможность автоматической маршрутизации в обход сбоев и маршрутизации запросов к экземпляру службы, который обеспечит оптимальный ответ. | Пружинный Hystrix, турбина и лента | Проверка работоспособности, сервисные сетки (пример: Istio) [54] |
Автомасштабирование и самовосстановление: распределенные системы реагируют на более высокую нагрузку путем горизонтального масштабирования: платформа должна обнаруживать и автоматически реагировать на такие условия. Кроме того, система должна обнаруживать сбои и пытаться автоматически перезапускаться без участия оператора. | - | Проверка работоспособности, самовосстановление и автоматическое масштабирование |
Упаковка, развертывание и планирование: крупномасштабные системы требуют надежного управления пакетами и систем развертывания для управления скользящими или сине-зелеными развертываниями и откатами при необходимости. Планировщик помогает определить, на каком конкретно узле выполнения может быть развернут новый набор служб на основе текущих условий. | Spring Boot, Apache Maven. Система Spring Cloud не имеет настоящего планировщика. | Docker, Rkt, Планировщик и развертывание Kubernetes, Helm [55] |
Управление заданиями: запланированные вычисления, не привязанные к отдельным запросам пользователей. | Весенняя партия | Задания Kubernetes и запланированные задания |
Приложение-одиночка: ограничение работы определенной службы как единственного экземпляра этой службы во всей системе. | Весеннее скопление облаков | Модули Kubernetes |
Среднее значение и медиана часто маскируют выбросы