2015-03-18 3 views
111

Каков стандартный шаблон для настройки микросервисов?Организация микросервисов

Если микросервис знает только о своем собственном домене, но есть поток данных, который требует, чтобы несколько служб каким-то образом взаимодействовали, каким образом это можно сделать?

Допустим, у нас есть что-то вроде этого:

  • Invoicing
  • Пересылка

И ради аргумента, скажем, что, как только заказ был отправлен, счет-фактура должны быть созданы.

Где-то кто-то нажимает кнопку в графическом интерфейсе: «Я закончил, давайте сделаем это!» В классической архитектуре обслуживания монолита я бы сказал, что есть либо ESB, обрабатывающий это, либо служба отправки имеет знания о службе счета и просто вызывает это.

Но как люди справляются с этим в этом храбром новом мире микросервисов?

Я понимаю, что это можно считать высокоразвитым. но есть конкретная сторона, поскольку микросервисы не должны делать выше. Итак, должно быть «что должно по определению делать», которое не основано на мнениях.

Стрелять.

ответ

174

В книге Building Microservices подробно описаны стили, упомянутые @RogerAlsing в его ответе.

На странице 43 под оркестровке против Хореография книги говорит:

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

Затем в книге объясняется два стиля. Стиль оркестровки больше соответствует идее SOA orchestration/task services, тогда как стиль хореографии соответствует dumb pipes and smart endpoints, упомянутому в статье Мартина Фаулера.

аранжировка Стиль

В соответствии с этим стилем, книга выше упоминает:

Давайте подумаем о том, что оркестровка решение будет выглядеть для этого потока. Здесь, вероятно, самой простой задачей было бы иметь наш сервис обслуживания клиентов как центральный мозг. При создании он рассказывает банку лояльности, почтовому сервису и почтовому сервису [...], через серию запросов/ответов. Служба сама может отслеживать, где находится клиент в этом процессе . Он может проверить, была ли установлена ​​учетная запись клиента , или отправленное электронное письмо, или отправленное сообщение.Мы получаем блок-схему [...] и моделируем ее непосредственно в коде. Мы могли бы даже использовать оснастку , которая реализует это для нас, возможно, используя соответствующий механизм правил . Коммерческие инструменты существуют для этой цели в форме программного обеспечения для моделирования бизнес-процессов. Предполагая, что мы используем синхронный запрос/ответ , мы могли бы даже знать, работал ли каждый этап [...] Недостатком этого подхода оркестровки является то, что сервис может стать слишком большим авторитетом центрального органа управления. Он может стать центром в центре сети и центральной точкой, где начинается логика . Я видел этот подход в небольшом количестве умных сервисов «бог», рассказывающих анемичные службы на основе CRUD, что делать.

Примечание: Я полагаю, что, когда автор упоминает набор инструментов, он имеет в виду что-то вроде BPM (например Activity, Apache ODE). На самом деле у Workflow Patterns Website есть удивительный набор шаблонов для такого рода оркестровки, а также подробные сведения об оценках различных инструментов поставщика, которые помогают реализовать его таким образом. Я не думаю, что автор предполагает, что один из этих инструментов должен использовать один из этих инструментов для реализации этого стиля интеграции, хотя можно использовать другие легкие структуры оркестровки, например. Spring Integration, Apache Camel или Mule ESB

Однако other books я прочитал на тему Microservices и в целом большинство статей, которые я нашел в Интернете, кажется, disfavor this approach оркестровки и вместо этого предлагают использовать следующий.

Хореография Стиль

Под стилем хореографии автор говорит:

С хореографией подходом, мы могли бы вместо того, чтобы просто иметь обслуживание клиентов испускает событие в асинхронном режиме, говоря Клиент создано. Почтовый сервис, почтовая служба и лояльность точек банка затем просто подпишитесь на эти события и отреагируйте соответственно [...] Этот подход значительно более развязан. Если какой-либо другим службам необходимо связаться с созданием клиента, ему просто нужно подписаться на мероприятия и выполнять свою работу по мере необходимости. Недостатком является то, что явный вид бизнес-процесса, который мы видим в [рабочий процесс], теперь неявно отражается в нашей системе [...] Это означает, что необходима дополнительная работа, чтобы вы могли контролировать и отслеживать, что правильные вещи произошли. Например, знаете ли вы, что у банка лояльности есть ошибка, и почему-то не установили правильную учетную запись? Один из подходов, который мне нравится в работе с этим , заключается в создании системы мониторинга, которая явно соответствует представлению бизнес-процесса в [рабочем процессе], но затем отслеживает, что каждый из услуг выполняет как независимые объекты, позволяя вам видеть нечетные исключения отображаются на более явный поток процесса. [Блок-схема] [...] не является движущей силой, а только одним объективом через , который мы видим, как система ведет себя. В общем, я нашел , что системы, которые больше стремятся к хореографическому подходу, более слабо связаны и более гибки и пригодны для изменения. Вы делаете необходимо сделать дополнительную работу для мониторинга и отслеживания процессов в системе границ.Я обнаружил, что наиболее интенсивно реализовано реализаций, чтобы быть чрезвычайно хрупкими, с более высокой стоимостью изменений. Имея это в виду, я решительно настроен на создание хореографической системы , где каждая услуга достаточно умна, чтобы понять ее роль в танце .

Примечание: Это очень похоже на CQRS и EvenSourcing. По сей день я все еще не уверен, что хореография - это просто другое имя для event-driven architecture (EDA), но если EDA - это всего лишь один способ сделать это, каковы другие способы? (См. Также What do you mean by "Event-Driven"? и The Meanings of Event-Driven Architecture)

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

Итак, что относительно HATEOAS?

Теперь, если мы хотим следовать подходу RESTful, мы не можем игнорировать HATEOAS, или Рой Филдинг будет очень рад сообщить в своем блоге, что наше решение не является действительно REST. Посмотрите на его блоге на REST API Must be Hypertext Driven:

Я получаю разочарование по количеству людей, призывающих любой HTTP на основе интерфейс REST API. Что нужно сделать, чтобы сделать архитектурный стиль REST понятным тем, что гипертекст - это ограничение ? Другими словами, если двигатель состояния приложения (и , следовательно, API) не управляется гипертекстом, то он не может быть RESTful и не может быть REST API. Период. Есть ли какая-то неисправная инструкция где-то, что нужно исправить?

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

Согласно HATEOAS, единственной ссылкой, которую действительно должен знать пользователь API, является тот, который инициирует связь с сервером (например, POST/order). С этого момента REST собирается провести поток, потому что в ответе этой конечной точки возвращаемый ресурс будет содержать ссылки на следующие возможные состояния. Затем пользователь API решает, какую ссылку следовать и переместить приложение в следующее состояние.

Несмотря на то, что это звучит круто, клиенту все еще нужно знать, должна ли быть ссылка на POSTED, PUTED, GETED, PATCHED и т. Д. И клиент все равно должен решить, какую полезную нагрузку передать. Клиент все равно должен знать, что делать, если это не удается (повторите попытку, компенсируйте, отмените и т. Д.).

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

Предположим, мы можем использовать HATEOAS с оркестровкой или хореографией.

API-интерфейс шлюза шаблон

Еще один интересный образец предлагается Крис Ричардсон, который также предложил, что он назвал API Gateway Pattern.

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

Клиент приложения, такой как родное мобильное приложение, может сделать RESTful HTTP-запросы к отдельным услугам [...] На поверхности это может показаться привлекательным. Тем не менее, вероятно, будет значительное несоответствие между API API отдельных и данными, требуемыми клиентами. Например, при отображении одной веб-страницы потенциально могут потребоваться вызовы для большого количества услуг. Amazon.com, например, describes Как некоторые страницы требуют звонков в 100+ сервисов. Создание большого количества запросов, даже , по высокоскоростному подключению к Интернету, не говоря уже о более низкой пропускной способности, мобильной сети с более высокой задержкой, было бы очень неэффективным и приводило бы к плохой работе пользователя в .

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

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

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

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

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

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

Дальнейшее чтение

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

+8

Хороший ответ! Один вопрос: если я объединю Microservices в стиле хореографии с API-шлюзом, разве API-шлюз не превратится в центральный орган управления, который вы описываете как недостаток микросервисов в стиле оркестрового? Или, другими словами, где именно заключается разница между «Стиль оркестровки» и API-Gateway Pattern? –

+1

@FritzDuchardt не совсем. Хотя api-gateway становится единственной точкой отказа, он не обязательно является управляющим органом любого рода. Очень простой api-gateway может просто аутентифицировать запросы и прокси-серверы их целевой службе. Шаблон api-gateway предназначен, в основном, для упрощения взаимодействия клиент-бэкэнд с помощью единой службы, он не решает проблему организации или хореографии служб, к которым доверяет API-шлюз (который сам является сервисом). – Porlune

+0

Отличный ответ! Только один вопрос относительно шлюзов API: Является ли GraphQL шлюзом API следующего поколения и может очень хорошо заменить шлюзы API? – kenneho

4

Так у Вас есть две услуги:

  1. Счет микро сервис
  2. Пересылка микро сервис

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

  • Простой графический интерфейс, зная все ваши услуги и реализации прецедентов («Я сделал» звонки служба отгрузки)
  • Бизнес-процесс двигатель, который ждет «я буду сделано ". Этот движок реализует варианты использования и поток.
  • микро сервис оркестровки, скажем, служба обработки заказов сама, что знает случаи поток/использование домена
  • Что еще я не думал о еще

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

НТН, Марк

22

Попытка объединить различные подходы здесь.

Доменные События

Доминирующий подход для этого, похоже, использует доменные события, где каждая служба опубликовывать события относительно того, что произошло, и другие услуги могут подписаться на эти события. Это, кажется, идет рука об руку с концепцией смарт конечных точек, немые трубы, что описывается Мартин Фаулер здесь: http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes

Domain events

Proxy

Другой apporach, что кажется распространенным является обертывание бизнес-поток в своей собственной службе. Где прокси-сервер организует взаимодействие между микросервисами, как показано на рисунке ниже:

Proxies.

+0

Вот хороший видеоролик, каковы другие узоры и как их можно объединить https://youtu.be/tSN1gOVQfPs?t=35m35s Предложите добавить их к вашему ответу –

+0

Nic images @Roger, какой инструмент вы использовали? –

+0

@SelvakumarEsra draw.io –

4

Итак, как оркестровка microservices, отличных от оркестровки сервисов SOA, которые не «микро»? Совсем нет.

Микросервисы обычно связываются с использованием http (REST) ​​или обмена сообщениями/событиями. Оркестровка часто связана с платформами оркестровки, которые используют BPEL или аналогичные языки для автоматизации рабочих процессов. Пока ваша платформа оркестровки поддерживает механизм связи, используемый в ваших микросервисах, они могут участвовать в оркестровке. Но имейте в виду, что оркестровка представляет собой сложный шаблон, который предлагает несколько возможностей для создания сложных композиций сервисов. Микросервисы чаще рассматриваются как услуги, которые не должны участвовать в сложных композициях и скорее быть более автономными.

Я вижу, что микропроцессор вызывается в организованном рабочем процессе для выполнения простой обработки, но я не вижу, что микросервис является сервисом оркестров, который часто использует механизмы, такие как компенсационные транзакции и государственный репозиторий (обезвоживание).

1

Если необходимо управлять государством, то идеальным источником связи может служить Event Sourcing с CQRS. Кроме того, для обмена данными между микросервисами может использоваться асинхронная система обмена сообщениями (AMQP).

С вашего вопроса ясно, что ES с CQRS должен быть правильным микс. Если вы используете java, взгляните на инфраструктуру Axon. Или создайте собственное решение с помощью Kafka или RabbitMQ.

-1

я написал несколько сообщений на эту тему:

Может быть, эти сообщения также могут помочь:

API шлюза модели - Курс зернами апи против мелкозернистых APIs

https://www.linkedin.com/pulse/api-gateway-pattern-ronen-hamias/ https://www.linkedin.com/pulse/successfulapi-ronen-hamias/

Крупнозернистый и мелкозернистый сервис API

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

0

Ответ на оригинальный вопрос - образец SAGA.

+1

Помогите расширить свой ответ? –

Смежные вопросы