Отделяйте серверные службы от интерфейсных реализаций, чтобы адаптировать интерфейсные интерфейсы для различных клиентских интерфейсов. Этот шаблон полезен, если вы хотите избежать настройки серверной части, которая обслуживает несколько интерфейсов. Этот шаблон основан на шаблоне : серверные серверы для интерфейсов описаны Сэмом Ньюманом.
Контекст и проблема
Рассмотрим приложение, которое изначально было разработано с помощью классического веб-интерфейса и соответствующей серверной службы. По мере изменения бизнес-требований с течением времени был добавлен мобильный интерфейс. Оба интерфейса взаимодействуют с одной серверной службой, но возможности мобильного устройства значительно отличаются от классического браузера с точки зрения размера экрана, производительности и ограничений отображения.
Серверная служба часто сталкивается с конкурирующими требованиями от разных интерфейсов, что приводит к частым изменениям и потенциальным узким местам в процессе разработки. Конфликтующие обновления и необходимость обеспечения совместимости приводят к чрезмерной работе с одним развертываемым ресурсом.
Если отдельная команда управляет серверной службой, может создать отключение между интерфейсными и внутренними командами, что приводит к задержкам в получении консенсуса и балансировке требований. Например, перед интеграцией необходимо проверить изменения, запрошенные одной командой внешнего интерфейса.
Решение
Введите новый слой, который обрабатывает только требования, относящиеся к интерфейсу. Этот уровень называется серверной службой для интерфейса (BFF), находится между интерфейсным клиентом и серверной службой. Если приложение поддерживает несколько интерфейсов, создайте службу BFF для каждого интерфейса. Например, если у вас есть веб-интерфейс и мобильное приложение, вы создадите отдельные службы BFF для каждого.
Этот шаблон настраивает клиентский интерфейс для определенного интерфейса, не затрагивая другие интерфейсы. Он также настраивает производительность в соответствии с потребностями интерфейсной среды. Так как каждая служба BFF меньше и менее сложная, приложение может воспользоваться преимуществами оптимизации в определенной степени.
Интерфейсные команды имеют автономию по сравнению с собственной службой BFF, позволяя гибко выбирать язык, каденс выпуска, приоритет рабочей нагрузки и интеграцию функций без использования централизованной группы разработки серверной части.
Хотя многие BFFs зависят от REST API, реализации GraphQL становятся альтернативой, что устраняет необходимость уровня BFF, так как механизм запроса не требует отдельной конечной точки.
Дополнительные сведения см. в статье Pattern: Backends For Frontends.
Проблемы и рекомендации
Оцените оптимальное количество служб, так как это приведет к связанным затратам. Обслуживание и развертывание дополнительных служб означает увеличение эксплуатационных накладных расходов. Каждая отдельная служба имеет собственный жизненный цикл, требования к развертыванию и обслуживанию, а также потребности в безопасности.
При добавлении новой службы просмотрите цели уровня обслуживания (SLOS). Повышенная задержка может возникнуть, так как клиенты напрямую не обращаются к вашим службам, а новая служба представляет дополнительный сетевой переход.
Если разные интерфейсы выполняют одни и те же запросы, оцените, можно ли объединить запросы в одну службу BFF. Совместное использование одной службы BFF между несколькими интерфейсами может привести к разным требованиям для каждого клиента, что может усложнить рост и поддержку службы BFF.
Дублирование кода является вероятным результатом этого шаблона. Оцените компромисс между дублированием кода и более подходящим интерфейсом для каждого клиента.
Служба BFF должна обрабатывать только логику, связанную с конкретным пользователем. Перекрестные функции, такие как мониторинг и авторизация, должны быть абстрагированы, чтобы обеспечить освещение службы BFF. Типичные функции, которые могут отображаться в службе BFF, обрабатываются отдельно с , ограничение скорости, маршрутизациии т. д.
Учитывайте влияние на команду разработчиков при обучении и реализации этого шаблона. Для создания новых серверных компонентов требуется время и усилия, потенциально влечет за собой технический долг при сохранении существующей серверной службы.
Оцените, требуется ли этот шаблон вообще. Например, если в организации используется GraphQL с интерфейсными сопоставителями, BFF может не добавлять значение в приложения.
Другим примером является приложение, объединяющее шлюз API с микрослужбами. Этот подход может быть достаточно для некоторых случаев, когда РАНЕЕ были рекомендованы BFF.
Когда следует использовать этот шаблон
Используйте этот шаблон в следующих случаях:
Серверная служба общего или общего назначения должна поддерживаться со значительными затратами на разработку.
Вы хотите оптимизировать серверную часть для требований определенных клиентских интерфейсов.
Настройки выполняются в серверную часть общего назначения для размещения нескольких интерфейсов.
Язык программирования лучше подходит для серверной части определенного пользовательского интерфейса, но не для всех пользовательских интерфейсов.
Эту схему не стоит применять в следующих случаях:
Когда интерфейсы выполняют те же или аналогичные запросы к серверной части.
Если для взаимодействия с серверной частью используется только один интерфейс.
Проектирование рабочей нагрузки
Архитектор должен оценить, как шаблон серверных элементов для интерфейсов можно использовать в проектировании рабочей нагрузки для решения целей и принципов, описанных в Well-Architected платформы Azure. Рассмотрим пример.
Столб | Как этот шаблон поддерживает цели основных компонентов |
---|---|
Решения по проектированию надежности помогают рабочей нагрузке стать устойчивой к сбоям и обеспечить восстановление до полнофункционального состояния после сбоя. | Наличие отдельных служб, которые являются эксклюзивными для определенного интерфейсного интерфейса, содержит сбои, поэтому доступность одного клиента может не повлиять на доступность доступа другого клиента. Кроме того, при обращении с различными клиентами можно определить приоритеты усилий по надежности на основе ожидаемых шаблонов доступа клиентов. - Критически важные потоки RE:02 - RE:07 Самосохранение |
Решения по проектированию безопасности помогают обеспечить конфиденциальность, целостность и доступность данных и систем рабочей нагрузки. | Из-за разделения служб, введенного в этом шаблоне, безопасность и авторизация на уровне служб, поддерживающего один клиент, можно адаптировать к функциональным возможностям, необходимым для этого клиента, потенциально уменьшая область поверхности API и боковое перемещение между различными серверными службами, которые могут предоставлять различные возможности. - SE:04 Сегментация - РЕСУРСЫ SE:08 Для защиты |
Эффективность производительности помогает рабочей нагрузке эффективно соответствовать требованиям путем оптимизации масштабирования, данных, кода. | Разделение серверной части позволяет оптимизировать способы, которые могут быть недоступны с общим уровнем служб. При обработке отдельных клиентов по-разному можно оптимизировать производительность для ограничений и функциональных возможностей конкретного клиента. - Планирование емкости PE:02 - критически важных потоков PE:09 |
Как и любое решение по проектированию, рассмотрите любые компромиссы по целям других столпов, которые могут быть представлены с этим шаблоном.
Пример
В этом примере показан вариант использования шаблона, в котором есть два разных клиентских приложения: мобильное приложение и классическое приложение. Оба клиента взаимодействуют с управлением API Azure (шлюзом плоскости данных), который выступает в качестве уровня абстракции, обрабатывая распространенные перекрестные проблемы, такие как:
авторизации. Обеспечение только проверенных удостоверений с соответствующими маркерами доступа может вызывать защищенные ресурсы с помощью api Management Azure (APIM) с идентификатором Microsoft Entra.
мониторинг— запись и отправка сведений о запросах и ответах в целях наблюдения в Azure Monitor.
кэширование запросов — оптимизация повторяющихся запросов путем обслуживания ответов из кэша с помощью встроенных функций APIM.
маршрутизации & агрегирования — перенаправление входящих запросов к соответствующим службам серверной части для служб Frontend (BFF).
Каждый клиент имеет выделенную службу BFF, выполняющуюся в качестве функции Azure, которая служит посредником между шлюзом и базовыми микрослужбами. Эти BFF для конкретного клиента обеспечивают специализированный интерфейс для разбиения на страницы среди других функций. Хотя мобильные устройства более сознательные с пропускной способностью и кэширование повышают производительность, настольный компьютер объединяет несколько страниц в одном запросе, оптимизируя для более полного взаимодействия с пользователем.
Схема структурирована в четырех отдельных разделах, иллюстрирующих поток запросов, проверки подлинности, мониторинга и обработки для конкретного клиента. В левой части слева два клиентских устройства инициируют запросы: мобильное приложение, оптимизированное для эффективного взаимодействия с пропускной способностью, и веб-браузер, предлагающий полностью функциональный интерфейс. Стрелки расширяются от обоих устройств к центральной точке входа, которая является шлюзом управления API Azure, что означает, что все запросы должны проходить через этот уровень. В рамках второго раздела, заключенного в прямоугольник дефисной линии, архитектура делится на две горизонтальные группы. Левая группа представляет управление API Azure, ответственное за обработку входящих запросов и определение способа их обработки. Две стрелки расширяются наружу с этого шлюза плоскости данных: один, указывающий вверх на идентификатор Microsoft Entra, который управляет авторизацией, а другой указывает вниз на Azure Monitor, который отвечает за ведение журнала и наблюдаемость. Кроме того, стрелка выполняется обратно из шлюза в мобильный клиент, представляющий кэшированный ответ при повторяющемся идентичном запросе, уменьшая ненужные операции обработки. Правильная группа в дефисируемом прямоугольнике фокусируется на настройке ответов серверной части на основе типа клиента, выполняющего запрос. Он включает два отдельных внутренних клиента для интерфейсных клиентов, размещенных с помощью Функций Azure для бессерверных вычислений, один предназначен для мобильного клиента и другой для классического клиента. Две стрелки расширяются от шлюза к этим серверным клиентам для внешнего интерфейса, иллюстрируя, что каждый входящий запрос перенаправляется в соответствующую службу в зависимости от типа клиента. Помимо этого слоя, дефисированные стрелки расширяются дальше вправо, подключая внутренние клиенты для внешнего интерфейса к различным микрослужбам, которые обрабатывают фактическую бизнес-логику. Чтобы визуализировать эту схему, представьте, что поток слева направо, где запросы клиентов перемещаются с мобильных и веб-клиентов в шлюз. Этот шлюз обрабатывает каждый запрос при делегировании проверки подлинности поставщику удостоверений и ведения журнала вниз в службу мониторинга. Оттуда он направляет запросы на соответствующий серверный клиент для внешнего интерфейса на основе того, исходит ли запрос от мобильного или классического клиента. Наконец, каждый серверный клиент перенаправляет запрос в специализированные микрослужбы, которые выполняют требуемую бизнес-логику и возвращают необходимый ответ. Если кэшированный ответ доступен, шлюз перехватывает запрос и отправляет сохраненный ответ непосредственно в мобильный клиент, предотвращая избыточность обработки.
Flow A: Мобильный клиент — первый запрос страницы
- Мобильный клиент отправляет запрос
GET
для страницы1
включая маркер OAuth 2.0 в заголовке авторизации. - Запрос достигает шлюза APIM Azure, который перехватывает его и:
- Проверяет состояние авторизации — APIM реализует защиту в глубине, поэтому проверяет допустимость маркера доступа.
- Потоковая передача действия запроса в виде журналов в Azure Monitor. Сведения о запросе записываются для аудита и мониторинга.
- Политики применяются, а затем APIM Azure направляет запрос на BFF-запрос на функцию Azure Mobile BFF.
- Затем функция Azure Function Mobile BFF взаимодействует с необходимыми микрослужбами, чтобы получить одну страницу и обработать запрошенные данные, чтобы обеспечить упрощенный интерфейс.
- Ответ возвращается клиенту.
Flow B: Мобильный клиент — первый кэшированный запрос на страницу
- Мобильный клиент отправляет тот же запрос
GET
для страницы1
снова в том числе маркер OAuth 2.0 в заголовке авторизации. - Шлюз APIM Azure распознает, что этот запрос был выполнен раньше и:
- Политики применяются и после этого идентифицируют кэшированный ответ, соответствующий параметрам запроса.
- Возвращает кэшированный ответ немедленно, устраняя необходимость пересылать запрос на мобильный BFF-сервер функции Azure.
Flow C: классический клиент — первый запрос
- Классический клиент отправляет запрос
GET
в первый раз, включая маркер OAuth 2.0 в заголовке авторизации. - Запрос достигает шлюза APIM Azure, где обрабатываются аналогичные перекрестные проблемы:
- Авторизация — всегда требуется проверка маркеров.
- Потоковая передача действия запроса — сведения о запросе записываются для наблюдения.
- После применения всех политик Azure APIM направляет запрос на BFF рабочего стола функций Azure, который отвечает за обработку обработки приложений с большим объемом данных. BFF для настольных компьютеров объединяет несколько запросов с помощью базовых вызовов микрослужб, прежде чем отвечать на запрос клиента с несколькими ответами на страницу.
Дизайн
идентификатор Microsoft Entra ID выступает в качестве облачного поставщика удостоверений, выдавая специализированные утверждения аудитории для мобильных и классических клиентов, которые впоследствии используются для авторизации.
управление API Azure выступает в качестве прокси-сервера между клиентами и их BBFs, добавляя периметр. Она настроена с помощью политик для проверкивеб-токенов JSON (JWTs), отклонение запросов, поступающих без маркера или утверждений, недопустимых для целевого BFF. Кроме того, он передает все журналы действий в Azure Monitor.
Azure Monitor функции в качестве централизованного решения для мониторинга, агрегируя все журналы действий для обеспечения комплексной комплексной наблюдаемости.
Функции Azure — это бессерверное решение, которое легко предоставляет логику BFF в нескольких конечных точках, что позволяет оптимизировать разработку, снизить затраты на инфраструктуру и снизить операционные затраты.