Управление микросервисами

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

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

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

  • Выставление счетов
  • Отгрузка

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

Где-то кто-то нажимает кнопку в GUI "Я готов, давайте сделаем это!" В классической архитектуре монолитного сервиса я бы сказал, что либо ESB обрабатывает это, либо служба доставки знает о службе счетов и просто вызывает ее.

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

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

Стрелять.


person Roger Johansson    schedule 18.03.2015    source источник


Ответы (7)


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

На странице 43 в разделе «Оркестровка против хореографии» в книге говорится:

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

Затем книга переходит к объяснению двух стилей. Стиль оркестрации больше соответствует идее SOA служб оркестровки / задач, тогда как стиль хореографии соответствует < href = "http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipes" rel = "noreferrer"> тупые каналы и интеллектуальные конечные точки, упомянутые в статье Мартина Фаулера.

Стиль оркестровки

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

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

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

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

Стиль хореографии

О стиле хореографии автор говорит:

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

Примечание. Я до сих пор не уверен, что хореография - это просто другое название для архитектура, управляемая событиями (EDA), но если EDA - это всего лишь один из способов сделать это, каковы другие способы? (Также см. Что вы имеете в виду под "управляемым событиями"? и Значения событийно-ориентированной архитектуры). Кроме того, кажется, что такие вещи, как CQRS и EventSourcing, сильно перекликаются с этим архитектурным стилем, верно?

А теперь самое интересное. Книга «Микросервисы» не предполагает, что микросервисы будут реализованы с помощью REST. Фактически, в следующем разделе книги они перейдут к рассмотрению решений на основе RPC и SOA и, наконец, REST. Важным моментом здесь является то, что микросервисы не подразумевают REST.

Итак, как насчет HATEOAS? (гипермедиа как механизм состояния приложения)

Теперь, если мы хотим следовать подходу RESTful, мы не можем игнорировать HATEOAS, иначе Рой Филдинг будет очень рад сказать в своем блоге, что наше решение на самом деле не является REST. См. Его сообщение в блоге REST API должен быть управляемым гипертекстом :

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

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

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

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

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

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

Шаблон шлюза API

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

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

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

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

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

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

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

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

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

person Edwin Dalorzo    schedule 25.05.2015
comment
Хороший ответ! Один вопрос: если я объединю микросервисы в стиле хореографии с API-шлюзом, не превратится ли API-шлюз в центральный управляющий орган, который вы описываете как обратную сторону микросервисов в стиле оркестровки? Или, другими словами, в чем именно разница между стилем оркестрации и шаблоном шлюза API? - person Fritz Duchardt; 03.09.2015
comment
@FritzDuchardt не совсем так. Хотя api-gateway действительно становится единственной точкой отказа, это не обязательно какой-либо управляющий орган. Очень простой API-шлюз может просто аутентифицировать запросы и передавать их своей целевой службе. Шаблон api-gateway в основном предназначен для упрощения взаимодействия клиент-серверная часть с помощью единой службы, он не решает напрямую проблему оркестровки или хореографии сервисов, к которым прокси-сервер API-шлюз (который сам по себе является сервисом). - person Porlune; 22.06.2017
comment
Отличный ответ! Только один вопрос относительно шлюзов API: является ли GraphQL шлюзом API следующего поколения и вполне может заменить шлюзы API? - person kenneho; 08.02.2018
comment
Я пытаюсь понять это с практической точки зрения. Хореография более слабо связана - ›в этом случае нужно динамически добавлять eventListener к методу api? В противном случае, если не каждый метод api всегда будет реагировать на полученное событие (- ›и, следовательно, не является слабосвязанным) - person Vincent; 11.06.2018
comment
Я не согласен с тем, что хореография более слабо связана, и поэтому нужно избегать оркестровки с помощью микросервисов. Я говорил об этом, например, в berndruecker.io/complex-event-flows- в распределенных системах. Вам нужен более сбалансированный подход в вашей архитектуре. - person Bernd Ruecker; 06.04.2020

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

События домена

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

События домена

Прокси

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

Прокси.

Другие образцы композиции

Эта страница содержит различные шаблоны композиции.

person Community    schedule 20.03.2015
comment
Вот хорошее видео, каковы другие шаблоны и как их можно комбинировать youtu.be/tSN1gOVQfPs?t= 35 мин. 35 сек. Предложите добавить их в свой ответ. - person Grygoriy Gonchar; 08.04.2015
comment
Nic images @Roger, какой инструмент вы использовали? - person Selvakumar Esra; 16.10.2016
comment
@SelvakumarEsra draw.io - person Roger Johansson; 16.10.2016

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

Микросервисы обычно обмениваются данными с помощью http (REST) ​​или обмена сообщениями / событиями. Оркестровка часто связана с платформами оркестровки, которые позволяют создавать взаимодействие между службами по сценарию для автоматизации рабочих процессов. В старые времена SOA эти платформы использовали WS-BPEL. Современные инструменты не используют BPEL. Примеры современных продуктов оркестровки: Netflix Conductor, Camunda, Zeebe, Azure Logic Apps, Baker.

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

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

person Paulo Merson    schedule 24.11.2015
comment
Следует отметить, что сегодняшние инструменты в вашем сообщении все еще используют события, данные и действия в той или иной форме для моделирования потока - camunda использует BPMN, который близок к BPEL, а другие просто определили свой собственный DSL представить аналогичную концепцию. - person Hightower; 19.03.2019

Итак, у вас есть две услуги:

  1. Счет-фактура микросервис
  2. Микросервис отгрузки

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

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

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

HTH, Марк

person mp911de    schedule 20.03.2015

Если необходимо управлять состоянием, то источник событий с помощью CQRS - идеальный способ связи. В противном случае для связи между микросервисами можно использовать асинхронную систему обмена сообщениями (AMQP).

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

person Rajeesh Koroth    schedule 27.10.2016

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

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

Шаблон шлюза API - API с определенным курсом или API с мелким разделом

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

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

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

person ronen    schedule 23.11.2017

ответ на исходный вопрос - паттерн САГА.

person Harold Vera    schedule 06.03.2018
comment
Хотите расширить свой ответ? - person Patrick Mevzek; 06.03.2018
comment
Saga пытается имитировать транзакции, для каждой операции вы предоставляете операцию отмены. Если цепочка операций терпит неудачу, операции отмены вызываются полностью обратно в источник. - person sschrass; 06.08.2018
comment
Похоже на какой-то случайный ответ. Требуется доработка. - person bharatesh; 24.03.2020