Преимущества использования отдельных серверов 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 должно означать увеличение нагрузки на веб-серверы - поэтому соотношение веб-сервера и сервера Api должно составлять 1: 1)

  • Я также не вижу никакой пользы от необходимости делать дополнительный HTTP-вызов Browser => HTTP => WebApp => HTTP => WebAPI => HTTP => Backend services. (что HTTP-вызов между WebApp и WebAPI - моя проблема)

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

  • С точки зрения развертывания это означает, что у нас будет 8 веб-блоков "с полным стеком", а не 4 + 4.

Я вижу преимущества нового подхода

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

Итак, вопрос: я ошибаюсь? Я пропустил фундаментальную «магию» разделения ящиков WebApplication и WebAPI?

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

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

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

Ответы:

25

Одной из причин является безопасность - если (хаха! Когда ) хакер получает доступ к вашему интерфейсному веб-серверу, он получает доступ ко всему, к чему у него есть доступ. Если вы разместили свой средний уровень на веб-сервере, то у него есть доступ ко всему, что у него есть - например, к вашей БД, а затем, что вы знаете, он просто запустил «выбрать * из пользователей» в вашей БД и забрал его из офлайн взлом пароля

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

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

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

gbjbaanb
источник
спасибо за перспективу. Я не рассматривал дополнительную работу, выполняемую при построении страницы и т. Д. Однако, учитывая, что в приложении буквально один вид бритвы, и все, что было загружено, - это AngularJs, я не уверен, что это проблема в этом случае. Кроме того, поскольку приложение является только внутренним, я не думаю, что безопасность является слишком большой проблемой, учитывая, что внутренние сервисы, в которых хранятся все данные, всегда будут находиться в отдельных блоках за сервисами wcf, с тонны безопасности на них, так как они используются всей организацией.
Стивен Бирн
Конечно, ваше дело то, что ваше дело. Интересно, могут ли эти сервисы использоваться другим веб-приложением в будущем (или предполагаться), и поэтому его архитектура такова, как есть. Там снова, старый архитектор, возможно, просто смотрел на него с высоты 10 000 футов!
gbjbaanb
1
В нашем сценарии мы решили разработать мобильное приложение после того, как все это было в производстве некоторое время. Мы были рады отделить сервер API от сервера пользовательского интерфейса, поскольку мобильное приложение не имело ничего общего с веб-приложением. Мы могли бы масштабировать «мобильные» и «веб» части по отдельности. Еще одна вещь, на которую стоит обратить внимание: веб-приложение на самом деле является просто fron-end / клиентом, это означает, что клиент (браузер) веб-приложения вызывает API-сервер для получения данных (в нашем случае это возможно). «Избыточные» HTTP-вызовы между API и серверами пользовательского интерфейса были незначительными по сравнению с трафиком между браузером / мобильным устройством и сервером API.
Михал Вициан
2

Я думаю, что здесь нет правильного / неправильного ответа. Вы спрашивали своих коллег о назначении этой архитектуры?

Из того, как я понимаю ваши описания, « WebAPI » в вашей архитектуре служит своего рода самодельным промежуточным программным обеспечением. Теперь вы можете исследовать, какие преимущества есть в использовании Middleware. По сути, ваше Webapp никогда не нужно будет принимать, если вы изменили свою бэк-офисную систему (если интерфейс WebAPI остается прежним).

Чтобы пойти дальше: представьте, что у вас есть база данных клиентов (бэкэнд-сервис) и у вас есть 5 веб-приложений, взаимодействующих с этой базой данных. Если вы замените систему базы данных клиентов новой системой (например, от другого поставщика и не сможете повлиять на интерфейсы веб-сервиса), вам, скорее всего, потребуется изменить уровень связи всех 5 веб-приложений. Если вы общаетесь через WebAPI , вам просто нужно изменить уровень связи WebAPI .

В основном, Layer Architecture в настоящее время рассматривается как: Pattern и Anti-Pattern. (См .: Лазанья-код ). Если у вас есть только одна система без планов дальнейшего расширения в ближайшие несколько лет, я бы предпочел считать это анти-паттерном. Но это будет нереалистично, так как я не знаю точных обстоятельств / ситуации :)

Стефан Вёрер
источник
спасибо за обратную связь, конечные внутренние службы используются всей организацией и имеют четко определенные (хотя и несколько упрощенные) контракты на предоставление услуг WCF, которыми владеет организация. Таким образом, существует много косвенных указаний, если нам нужно изменить серверную часть (что, на самом деле, мы находимся в процессе, переходя от одного ERP к другому). Но моя проблема в том, что наше приложение предоставляет отдельный набор промежуточных программ HTTP API, которые используются только им. Кажется, что один уровень слишком много :)
Стивен Бирн