Организация микросервисов


какова стандартная схема организации микросервисов?

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

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

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

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

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

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

Я понимаю, что это можно считать высоко мнения. но есть конкретика сторона к нему, так как микросервисы не должны делать выше. Поэтому должно быть "что он должен по определению делать вместо этого", которое не основано на мнении.

стрелять.

7 139

7 ответов:

Книги Микрослужб Здания подробно описывает стили, упомянутые @RogerAlsing в своем ответе.

на странице 43 В разделе оркестровка против хореографии книга говорит:

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

затем книга переходит к объяснению двух стилей. Оркестровка стиль больше соответствует идее SOA согласование/услуги, тогда как хореографический стиль соответствует тупые трубы и умные конечные точки упоминается в статье Мартина Фаулера.

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

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

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

примечание: Я предполагаю, что когда автор упоминает инструменты он имеет в виду что-то вроде BPM (например,активность,Apache ODE,Camunda). На самом деле Веб-Сайт Шаблонов Рабочих Процессов имеет удивительный набор шаблонов, чтобы сделать этот вид оркестровки, а также предлагает детали оценки различных инструментов, которые помогут реализовать это таким образом. Я не думаю, что автор подразумевает, что необходимо использовать один из этих инструментов для реализации этого стиля интеграции, хотя могут использоваться и другие облегченные структуры оркестровки, например Весна Интеграции,Apache Camel или мул ESB

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

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

под хореографическим стилем автор говорит:

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

примечание: по сей день я все еще не уверен, что хореография-это просто другое название для событийно-управляемой архитектуры (EDA), но если EDA-это только один способ сделать это, каковы другие способы? (Также см. что вы подразумеваете под "событийным"? и значения событийной архитектуры). Также кажется, что такие вещи, как CQRS и Даже в этом архитектурном стиле много резонирует, правда?

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

так что насчет HATEOAS?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Более Дальнеишее Чтение

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

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

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

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

Domain events

Прокси

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

Proxies.

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

  1. счет микро-услуги
  2. обслуживание пересылки микро

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

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

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

HTH, Марк

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

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

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

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

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

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

ответ на исходный вопрос является Сага шаблон.

Я написал несколько постов на эту тему:

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

шаблон шлюз по API - курс-grained АПИ против мелкозернистой Апис

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

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

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