Переваги використання окремих серверів API та UI для веб-додатків


17

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

Вибачте, якщо нижче трохи довше, я просто хочу спробувати намалювати гарну картину того, що є системою, перш ніж поставити питання :)

  • Спосіб налаштування системи полягає в тому, що у нас є один основний веб-додаток (asp.net, AngularJS), який здебільшого просто агрегує дані з різних інших сервісів. Таким чином, це в основному хост для програми AngularJS; існує буквально один контролер MVC, який завантажує клієнтську сторону, а потім кожен інший контролер - контролер WebAPI.

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

  • Однак, в кінцевому рахунку, дзвінки в кінцевому рахунку перенаправляються до іншого набору додатків WebAPI (як правило, це стосується бізнес-сфери, наприклад, безпеки, даних клієнтів, даних про продукт тощо). Усі ці WebAPI також розгортаються разом у виділені вікна; у нас також є 4 таких скриньки.

  • За єдиним винятком, ці WebAPI не використовуються жодними іншими частинами нашої організації.

  • Нарешті, ці WebAPI здійснюють ще один набір дзвінків до "зворотного" сервісу, які, як правило, є застарілими службами asmx або wcf, ляпають поверх різних ERP-систем і сховищ даних (над якими ми не маємо контролю).

  • Більшість бізнес-логіки нашої програми є в таких WebApis, як перетворення застарілих даних, їх агрегація, виконання ділових правил, звичайний тип речей.

Що мене збентежило - це яка можлива вигода від такого поділу між WebApplication та WebAPI, які його обслуговують. Оскільки ніхто інший не використовує їх, я не бачу користі від масштабування (тобто немає сенсу вводити ще 4 вікна API для обробки підвищеного навантаження, оскільки збільшення навантаження на сервери API повинно означати, що на веб-серверах збільшується навантаження - тому повинно бути співвідношення веб-сервера 1: 1 до Api-сервера)

  • Я також не бачу ніякої користі у тому, що потрібно робити додатковий браузер HTTP-дзвінків => HTTP => WebApp => HTTP => WebAPI => HTTP => сервіс Backend. (HTTP-дзвінок між WebApp та WebAPI - моя проблема)

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

  • Це означає, що у нас буде 8 веб-ящиків з повним стеком, на відміну від 4 + 4.

Переваги, які я бачу від нового підходу, є

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

Тож питання: я помиляюся? Чи пропустив я якусь фундаментальну "магію" розділення вікон WebApplication та WebAPI?

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

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


Якщо всі 8 ящиків справді під вашим контролем, я не можу придумати жодної вагомої причини для розлуки. Чи знаєте ви, чи мали вони окреме право власності в минулому?
Іксрек

@Ixrec - так, всі 8 ящиків належать організації, а додаток на 100% лише внутрішній. Я підозрюю, що розлука спочатку була розроблена частково через те, що інша внутрішня група володіла інфраструктурою (багато політики), а почасти тому, що хтось сказав "N-Tier", і всі просто пішли з нею.
Стівен Берн

Відповіді:


25

Однією з причин є безпека - якщо (ха-ха! Коли ) хакер отримує доступ до вашого веб-сервера на передньому рівні, він отримує доступ до всього, до чого має доступ. Якщо ви розмістили свій середній рівень на веб-сервері, то він має доступ до всього, що він має - тобто до вашої БД, і наступне, що ви знаєте, він просто запустить "select * from users" у вашій БД та відібрав її в автономному режимі злом пароля.

Ще одна причина масштабування - веб-рівень, де сторінки створюються та обробляються та обробляються XML, і все, що вимагає набагато більше ресурсів, ніж середній рівень, що часто є ефективним методом отримання даних з БД до веб-рівня. Не кажучи вже про передачу всіх тих статичних даних, які знаходяться (або кешовані) на веб-сервері. Додавання більшої кількості веб-серверів - це просте завдання після того, як ви минули 1. Не повинно бути співвідношення 1: 1 між рівнем веб-та логіки - я вже бачив 8: 1 (і співвідношення між логікою 4: 1) рівень і БД). Це залежить від того, чим займаються ваші яруси та скільки кешування відбувається в них.

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

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


дякую за перспективу Я не вважав, що додаткова робота проводиться створенням сторінок і т. Д. Однак, враховуючи, що в додатку є буквально один вигляд бритви, і все щойно завантажується - це AngularJs, я не впевнений, що це турбує в цьому випадку. Крім того, оскільки додаток є лише внутрішнім, я не вважаю, що безпека викликає надто велике занепокоєння - маючи на увазі, що бек-енд-сервіси, де фактично зберігаються всі дані, завжди будуть знаходитись в окремих полях за послугами wcf, тонни безпеки на них, оскільки ними користується вся організація.
Стівен Берн

Звичайно, ваш випадок - це ваш випадок. Мені цікаво, чи можуть ці послуги в майбутньому споживатися іншим веб-сайтом (або призначеним для нього), і тому його архітектор, як це є. Знову ж, старий архітектор, можливо, просто дивився на нього з 10 000 футів!
gbjbaanb

1
У нашому сценарії ми вирішили розробити додаток для мобільних пристроїв після того, як ця річ була деякий час у виробництві. Ми були раді, що сервер API був розділений від сервера інтерфейсу, оскільки мобільний додаток не мав нічого спільного з веб-додатком. Ми могли окремо масштабувати "мобільні" та "веб-" частини. Ще одна річ, яку варто зауважити: Веб-додаток насправді є просто переднім клієнтом, це означає, що клієнт веб-додатків (браузер) викликає сервер API для отримання даних (у нашому випадку це можливо). "Зайві" HTTP-дзвінки між серверами API та інтерфейсу користувача були незначними порівняно з трафіком між браузером / мобільним телефоном та сервером API.
Міхал Вікіан

2

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

З того, як я розумію ваші описи, " WebAPI " у вашій архітектурі служить видом саморобного середнього програмного забезпечення. Тепер ви можете дослідити, які переваги є в програмах Middleware. В основному ваш Webapp ніколи не потребуватиме прийняття, якщо ви змінили систему bakoffice (до тих пір, поки інтерфейс WebAPI зберігатиме те саме).

Щоб піти далі: Уявіть, що у вас є база даних клієнтів (сервіс бекенда) і у вас є 5 веб-додатків, які спілкуються з цією базою даних. Якщо ви заміните систему баз даних клієнтів на нову систему (наприклад, від іншого постачальника, і ви не можете впливати на інтерфейси веб-сервісу), вам, швидше за все, знадобиться змінити рівень зв'язку всіх 5 веб-додатків. Якщо ви спілкуєтеся через веб-веб- сервер , вам просто доведеться змінити рівень зв'язку WebAPI .

В основному, шарова архітектура в даний час розглядається як обидва: візерунок і анти-візерунок. (Див.: Код Лазаньї ) Якщо у вас є лише одна система, яка не планує її більше розширювати протягом наступних кількох років, я вважаю, що це є антидією. Але це може бути нереально жорстким суддею, оскільки я не знаю точних обставин / ситуації :)


дякую за відгуки, остаточні послуги бек-енд використовуються всією організацією та мають чітко визначені (якщо трохи спрощені) договори на обслуговування WCF, якими володіє організація. Тож є безліч непрямих, якщо нам потрібно змінити бек-енд (що, власне, ми зараз робимо, переходячи від однієї ERP до іншої). Але моя проблема полягає в тому, що наша програма надає окремий набір проміжних програм HTTP apis, які лише споживаються ним. Здається, на один рівень занадто багато :)
Стівен Берн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.