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


200

Яка стандартна схема мікроорганізацій?

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

Скажімо, у нас є щось подібне:

  • Рахунок-фактура
  • Відвантаження

І заради аргументу, скажімо, що після того, як замовлення буде відправлено, рахунок-фактура повинен бути створений.

Десь хтось натискає кнопку в тексті GUI"Я закінчую, давайте це зробимо!" У класичній архітектурі сервісу моноліту я б сказав, що це або ESBобробка даних, або служба відправлення володіє знаннями рахунків-фактур і просто викликає це.

Але яким чином люди мають справу з цим у цьому сміливому новому світі мікросервісів?

Я розумію, що це можна вважати високоосновним. але тут є конкретна сторона, оскільки мікросервіси не повинні робити вищезазначене. Отже, повинно бути "що слід робити за визначенням", що не ґрунтується на думці.

Стріляти.

Відповіді:


316

Мікросервіси " Будівництво книг" докладно описують стилі, згадані @RogerAlsing у своїй відповіді.

На сторінці 43 у розділі Оркестрація проти хореографії книга говорить:

Починаючи моделювати все більш складну логіку, ми маємо мати справу з проблемою управління бізнес-процесами, які простягаються через межу окремих служб. І за допомогою мікросервісів ми досягнемо цієї межі раніше, ніж зазвичай. [...] Що стосується фактичного впровадження цього потоку, ми можемо дотримуватися двох стилів архітектури. За допомогою оркестрації ми покладаємось на центральний мозок для керівництва та керування процесом, як диригент в оркестрі. За допомогою хореографії ми повідомляємо кожну частину системи про свою роботу і даємо їй розробити деталі, як танцівники, які знаходять свій шлях і реагують на оточуючих їх у балеті.

Потім книга переходить до пояснення двох стилів. Стиль оркестрації більше відповідає ідеї SOA щодо оркестрації / служб завдань , тоді як стиль хореографії відповідає дурним трубам та розумним кінцевим точкам, згаданим у статті Мартіна Фаулера.

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

Під цим стилем книга вище згадує:

Поміркуймо, як виглядатиме рішення для оркестрації для цього потоку. Тут, мабуть, найпростіше зробити, щоб наше обслуговування клієнтів виступало центральним мозком. Під час створення, він спілкується з банком лояльності, службою електронної пошти та поштовою службою [...], через низку дзвінків на запит / відповідь. Служба замовника сама може відстежувати, де знаходиться замовник у цьому процесі. Він може перевірити, чи налаштовано обліковий запис клієнта, чи надіслано електронний лист, чи відправлено повідомлення. Ми беремо взяти діаграму потоку [...] і моделювати її безпосередньо в код. Ми навіть могли використовувати інструменти, які реалізують це для нас, можливо, використовуючи відповідний механізм правил. Для цього існують комерційні інструменти у вигляді програмного забезпечення для моделювання бізнес-процесів. Якщо ми використовуємо синхронний запит / відповідь, ми навіть могли б знати, чи спрацював кожен етап [...] Недоліком цього підходу до оркестрування є те, що обслуговування клієнтів може стати занадто багато центральним органом управління. Він може стати центром посеред Інтернету та центральною точкою, де починає жити логіка. Я бачив, що такий підхід призводить до того, що невелика кількість розумних «богових» служб підказує анемічним службам на основі CRUD, що робити.

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

Однак інші книги, які я читав на тему «Мікросервіси», і загалом більшість статей, які я знайшов в Інтернеті, здаються недобрими таким підходом до оркестрації, а натомість пропонують використовувати наступну.

Хореографічний стиль

Під стиль хореографії автор говорить:

За допомогою хореографічного підходу, ми могли б замість того, щоб служба обслуговування клієнтів випускала подію асинхронно, кажучи, що Клієнт створений. Служба електронної пошти, поштова служба та банк лояльності потім просто підписуються на ці події та реагують відповідно [...] Цей підхід значно більше відокремлюється. Якщо для створення клієнта потрібна якась інша послуга, вона просто повинна підписатися на події та виконувати свою роботу, коли це потрібно. Мінус полягає в тому, що чіткий погляд на бізнес-процес, який ми бачимо в [робочому процесі], тепер лише неявно відображається в нашій системі [...] Це означає, що необхідна додаткова робота для того, щоб ви могли відстежувати та відстежувати, що потрібні речі є сталося. Наприклад, Ви б знали, якщо в банку очок лояльності була помилка і чомусь не створили правильний рахунок? Один із підходів, який мені подобається займатися цим, - це побудувати систему моніторингу, яка явно відповідає погляду на бізнес-процес у [робочому процесі], але потім відслідковує те, що кожен із служб виконує як незалежні суб'єкти, дозволяючи бачити непарні винятки, відображені на більш чіткий потік процесу. [Блок-схема] [...] - це не рушійна сила, а лише одна лінза, завдяки якій ми можемо побачити, як поводиться система. Взагалі, я виявив, що системи, які більше схильні до хореографічного підходу, є більш вільно пов'язаними і є більш гнучкими і піддаються змінам. Однак вам потрібно зробити додаткову роботу для контролю та відстеження процесів через межі системи. Я вважав, що більшість оркестрованих реалізацій є надзвичайно крихкими, з більшою вартістю змін. Зважаючи на це, я дуже вважаю за краще націлюватись на хореографічну систему, де кожна служба досить розумна, щоб зрозуміти її роль у всьому танці.

Примітка. На сьогоднішній день я все ще не впевнений, що хореографія - це лише інша назва архітектури, орієнтованої на події (EDA), але якщо EDA - це лише один із способів зробити це, якими є інші способи? (Див Що ви маєте в виду під «Event-Driven»? І смисли Event-Driven Architecture ). Крім того, здається, що такі речі, як CQRS та EventSourcing, дуже перегукуються з цим архітектурним стилем, правда?

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

Отже, що з HATEOAS? (Hypermedia як двигун стану заявки)

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

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

Отже, як ви бачите, Філдінг вважає, що без HATEOAS ви не справді будуєте RESTful програми. Для Fielding HATEOAS - це шлях, який стосується послуг з оркестрування. Я просто все це вчу, але для мене HATEOAS не чітко визначає, хто чи що є рушійною силою насправді за посиланнями. У користувальницькому інтерфейсі, який міг би бути користувачем, але у взаємодії комп'ютер-комп'ютер, я вважаю, що це потрібно зробити сервісом вищого рівня.

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

Незважаючи на те, наскільки це здорово звучить, клієнт все ще повинен знати, чи повинно бути посилання POSTed, PUTed, GETed, PATCHed тощо. І клієнту все ж потрібно вирішити, яку корисну навантаження пройти. Клієнту все одно потрібно знати, що робити, якщо це не вдалося (повторити, компенсувати, скасувати тощо).

Я досить новий у всьому цьому, але для мене, з точки зору HATEOAs, цей клієнт або споживач API - це послуга високого замовлення. Якщо ми вважаємо це з точки зору людини, ви можете уявити собі кінцевого користувача на веб-сторінці, вирішивши, які посилання слід переходити, але все-таки програміст веб-сторінки повинен був вирішити, який метод використовувати для виклику посилань, і яке корисне навантаження пройти. Отже, на мій погляд, у взаємодії комп'ютер-комп'ютер комп'ютер бере роль кінцевого споживача. Ще раз це ми називаємо службою оркестрації.

Я думаю, ми можемо використовувати HATEOAS або з оркестрацією, або з хореографією.

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

Ще одна цікава модель запропонована Крісом Річардсоном, який також запропонував те, що він назвав API шлюзового інтерфейсу API .

У монолітній архітектурі клієнти програми, такі як веб-браузери та власні програми, роблять HTTP-запити через балансир навантаження до одного з N однакових примірників програми. Але в архітектурі мікросервісу моноліт був замінений набір послуг. Отже, ключовим питанням, на яке ми повинні відповісти, є те, з чим взаємодіють клієнти?

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

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

Шлюз API знаходиться між клієнтами програми та мікросервісами. Він надає API, адаптовані до клієнта. Шлюз API забезпечує грубозернистий API для мобільних клієнтів та більш дрібнозернистий API для настільних клієнтів, які використовують високопродуктивну мережу. У цьому прикладі настільні клієнти роблять кілька запитів для отримання інформації про продукт, тоді як мобільний клієнт робить один запит.

Шлюз API обробляє вхідні запити, роблячи запити до деякої кількості мікросервісів через високоефективну локальну мережу. Наприклад, Netflix описує, як вентилятори кожного запиту отримують в середньому шість сервісів заходу. У цьому прикладі дрібнозернисті запити від настільного клієнта просто пов'язані з відповідною послугою, тоді як кожен грубозернистий запит мобільного клієнта обробляється шляхом агрегування результатів виклику декількох служб.

Шлюз API не тільки оптимізує спілкування між клієнтами та додатком, але й інкапсулює деталі мікросервісів. Це дає можливість мікросервісам розвиватися, не впливаючи на клієнтів. Наприклад, дві мікросервіси можуть бути об'єднані. Інша мікросервіс може бути розділений на дві або більше служб. Необхідно оновити лише шлюз API, щоб відобразити ці зміни. Клієнти не зачеплені.

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

Це звучить досить схоже на згаданий вище стиль оркестрації, лише з дещо іншим наміром, в цьому випадку, здається, все стосується продуктивності та спрощення взаємодій.


15
Хороша відповідь! Одне питання: якщо я поєднаю мікросервіси в хореографічному стилі з API-шлюзом, чи не перетвориться API-шлюз в центральний орган управління, який ви описуєте як зворотній бік мікросервісів у стилі оркестрації? Або, інакше кажучи, де саме різниця між "стилем оркестрації" та шаблоном API-шлюзу?
Фріц Дюшардт

4
@FritzDuchardt не зовсім. Незважаючи на те, що шлюз api-шлюбу стає єдиною точкою відмови, він не обов'язково є будь-яким органом управління. Дуже простий api-шлюз може просто автентифікувати запити і проксі-сервер їх до цільової служби. Шаблон шлюзу api-шлюзу здебільшого для спрощення взаємодії клієнт-сервіс за допомогою однієї служби; він не вирішує безпосередньо проблему оркестрування або хореографування сервісів, до яких є проксі-шлюз API (який сам є послугою).
Порлуне

Чудова відповідь! Лише одне запитання щодо шлюзів API: Чи є GraphQL шлюз API наступного покоління і може дуже добре замінити шлюзи API?
kenneho

Я намагаюся зрозуміти це з практичного погляду. Хореографія більш вільно поєднана -> у такому випадку до методу api слід динамічно додавати eventListener? В іншому випадку, якщо не кожен метод api завжди буде реагувати на отриману подію (-> і, таким чином, не є вільно пов'язаним)
Vincent

Я не згоден з тим, що хореографія є більш вільно поєднаною, і, отже, слід уникати оркестрації за допомогою мікросервісів. Я говорив про це, наприклад, у berndruecker.io/complex-event-flows-in-distributed-systems . Вам потрібен більш збалансований підхід у вашій архітектурі.
Бернд Рюкер

35

Спробуємо тут узагальнити різні підходи.

Події домену

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

Події домену

Проксі

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

Проксі.

Інші візерунки композиції

Ця сторінка містить різні схеми композиції.


Ось приємне відео, які є інші шаблони і як ви можете їх поєднувати youtu.be/tSN1gOVQfPs?t=35m35s Запропонуйте додати їх до вашої відповіді
Григорій Гончар

Nic images @Roger, яким інструментом ви користувалися?
Selvakumar Esra

1
@SelvakumarEsra draw.io
Роджер Йоханссон

7

Отже, чим оркестрація мікросервісів відрізняється від оркестрування старих служб SOA, які не є "мікро"? Зовсім не багато.

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

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

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


слід зауважити, що "сьогоднішні інструменти" у вашій публікації все ще використовують події, дані та дії в певній формі, щоб "моделювати" потік - camunda використовує BPMN, близький до BPEL, а інші просто визначили свою власну DSL для представлення подібної концепції.
Hightower

5

Отже, у вас є дві послуги:

  1. Мікро-сервіс-фактура
  2. Мікросервіс для відвантаження

У реальному житті у вас було б щось, де ви тримаєте стан замовлення. Назвемо це послугою замовлення. Далі у вас є випадки використання замовлень для обробки замовлень, які знають, що робити при переході замовлення з одного стану в інший. Всі ці сервіси містять певний набір даних, і тепер вам потрібно щось інше, що виконує всю координацію. Це може бути:

  • Простий графічний інтерфейс, що знає всі ваші послуги та впроваджує випадки використання ("Я закінчує" дзвінки на службу відвантаження)
  • Двигун бізнес-процесів, який чекає події "Я закінчив". Цей двигун реалізує випадки використання та потоки.
  • Мікропослуга оркестрації, скажімо, сама служба обробки замовлень, яка знає випадки потоку / використання вашого домену
  • Про все інше я ще не думав

Основним моментом при цьому є те, що управління є зовнішнім. Це пояснюється тим, що всі компоненти вашої програми - це окремі будівельні блоки, нещільно пов'язані між собою. Якщо ваші випадки використання змінюються, вам доведеться змінити один компонент в одному місці, який є компонентом оркестрації. Якщо ви додасте інший порядок замовлень, ви можете легко додати іншого оркестратора, який не заважає першому. Мислення мікросервісу стосується не лише масштабованості та фантазії REST API, але й чіткої структури, зменшення залежностей між компонентами та повторного використання загальних даних та функціональних можливостей, які спільно використовуються у вашому бізнесі.

HTH, Марк


1

Якщо державою потрібно керувати, то ідеальний спосіб спілкування - це проведення подій за допомогою CQRS. Крім того, асинхронна система обміну повідомленнями (AMQP) може використовуватися для міжмікросервісного зв'язку.

З вашого запитання зрозуміло, що ES із CQRS має бути правильним поєднанням. Якщо ви використовуєте Java, погляньте на рамку Axon. Або створити індивідуальне рішення, використовуючи Kafka або RabbitMQ.


-2

я написав кілька публікацій на цю тему:

Можливо, ці повідомлення також можуть допомогти:

Шаблон 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 може залучати різні технології та протоколи комунікацій, тоді як грубозернисті абстрагують їх у єдиний потік. при розробці системи враховуйте і те, і інше як не існує жодного золотого підходу, який вирішує все, і для кожного є компроміс. Грубозернисті особливості підходять як послуги, що використовуються в інших бізнес-контекстах, таких як інші програми,


-2

відповідь на початкове запитання - модель SAGA.


4
Хочете розширити свою відповідь?
Патрік Мевзек

Saga намагається імітувати транзакції, для кожної операції ви надаєте скасування операції. Якщо ланцюг операцій виходить з ладу, скасовуються операції скасування повністю назад до початку.
sschrass

Схоже на якусь випадкову відповідь. Необхідна розробка.
бхаратш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.