Як ви обробляєте спільні концепції в архітектурі мікросервісу?


40

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

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

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

Відповіді:


34

Зазвичай служби телефонують до інших служб, коли їм потрібно отримати доступ до своїх даних. Кожен фрагмент даних повинен належати певній службі, яка буде єдиною точкою входу для доступу до цих даних та їх зміни. Деякі сервіси будуть простими і зазвичай тісно відповідають вашій моделі домену (наприклад, послуга поводження з користувачами), тоді як інші будуть на високому рівні та використовуватимуть дані інших служб (наприклад, показ переліку фотографій разом із інформацією про користувачів, які їх завантажили ).

У вашому випадку використання вам слід почати ззовні і подумати про те, які операції ви хочете зробити доступними для вашого користувача через API (якщо це сервіс задніх днів) або які операції повинні бути доступні в графічному інтерфейсі, якщо це веб-додаток. Зауважте, що частина GUI часто є звичайною програмою з власними контролерами: операції можуть бути викликані через REST (як у AngularJS), але ці кінцеві точки призначені лише для використання програми GUI і не є мікросервісами у здоровому розумінні.

Припустимо, ви хочете відображати фотографії разом із інформацією про завантажувачів. Ви можете мати службу користувача, яка повертає інформацію про користувача з урахуванням ідентифікатора користувача та послугу фотографій, яка може перераховувати фотографії (наприклад, пошук за деякими критеріями). Список фотографій міститиме для кожної фотографії ідентифікатор користувача, що завантажує. Таким чином ці два сервіси не поєднуються - фотосервіс знає лише ідентифікатори користувачів, але нічого про самі дані користувачів. Крім цих двох сервісів, ви можете створити третій сервіс за допомогою такої операції, як "перелік фотографій з інформацією про завантажувачів", які б викликали дві інші служби та поєднували дані, які вони повертають. Крім того, цю операцію може виконувати ваша веб-програма замість послуги.


1
Це мені дуже допомогло. Я почав із написання пари випадків використання інтерфейсу, які б виконували стек, і все здебільшого ставало на свої місця.
anjunatl

1
У цьому конкретному прикладі ми повинні робити, наприклад, 10 дзвінків до служби користувача, щоб отримати дані користувачів, якщо в нашому списку є 10 фотографій? Хіба це не додасть багато накладних витрат?
Рікардо Соуза

1
@rcdmk Ви можете додати кінцеву точку REST, яка отримує список декількох ідентифікаторів як вхідних даних і повертає декілька фотографій як вихід. Це часто робиться на практиці з міркувань продуктивності. Іноді дизайн API - це компроміс між чистотою та практичними міркуваннями.
Michał Kosmulski

@ MichałKosmulski Мені потрібно почати обговорення, але дизайн StackExchange відштовхує їх :) Що мені не подобається у підході до мікросервісу в цьому конкретному прикладі, це те, що прямий запит до базової бази даних (де зберігаються користувачі та зображення) може бути набагато ефективнішим. Уявіть, чи залежать ці сервіси від поточного потоку від інших служб вище за течією тощо. Прямий запит до сховища даних набагато безпечніший. лише мої 5 копійок - нічого більше. Знову я б дуже хотів продумати продуктивну дискусію на цю тему, але StackExachange - це не найкраще місце для цього (можете порекомендувати форуми для обговорення
мікропослуг

@ajukraine Я думаю, що на stackexchange є чати, які можуть бути хорошим місцем для дискусій. Щодо продуктивності: 1. Мікросервіси поставляються із вартістю продуктивності, і 2. Мікросервіси хороші для деяких ситуацій, а не для інших. Що стосується залежностей: в архітектурах мікросервісів ви часто робите локальні копії даних і використовуєте асинхронні повідомлення, щоб зменшити кількість залежностей. Це справжня зміна архітектури, а не просто автоматична зміна кожного модуля програми на окрему програму.
Michał Kosmulski

4

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

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

Якщо це не відповідає на ваше запитання, чи можете ви уточнити, описуючи точну ситуацію, з якою ви маєте справу?


Ця та відповідь Міхала допомогла мені зрозуміти це, але його пропозиція допомогла мені визначити потрібні мені послуги. Я застряг у думці про необхідність представляти повний об'єкт, а не просто посилання на об’єкт (user object vs user ID). Дуже вдячний, спасибі!
anjunatl

@anjunatl Ласкаво просимо;)
Владислав Раструсний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.