Эффективная разработка: есть ли в вашем проекте служба агрегации интерфейсов?

Java

Эта статья была впервые опубликована в личном паблике WeChat: coder Xiaohei

Боль службы раскололась

После разделения сервиса ссоры между front-end и back-end студентами по поводу детализации API становятся все более частыми:

«Студенты фронтенда запрашивают два интерфейса, почему бы просто не агрегировать данные?» Студенты бэкенда хотят предоставить только базовые сервисные возможности API в сфере бизнеса, и ожидается, что обработка сборки данных будет завершена фронтендом. кончают студенты.

«Агрегация серверной части, интерфейсная часть может иметь на один запрос меньше и отвечает только за отрисовку страницы!» Студенты клиентской части надеются нести ответственность только за отрисовку страницы и ту же логику агрегации для H5, APP и апплета. может появиться на трех концах, а агрегация серверной части должна быть только один раз.

Сервис агрегации интерфейсов — одно из наших решений.

Что такое служба агрегации интерфейсов?

Служба агрегации интерфейсов — это средство переноса, которое только помогает студентам переднего плана агрегировать возвращаемые данные нескольких интерфейсов и возвращает результат соответствующего запроса клиенту сразу после агрегации.. Мы надеемся, что с помощью службы агрегации интерфейсов, среднего уровня, клиентская часть сможет напрямую получать данные, в то время как серверная часть сможет по-прежнему сосредоточиться на предоставлении основных возможностей службы API бизнес-домена.

Анализ сценария

  • Сценарий 1: серийный сбор данных. Несколько запросов связаны.
    • Например: получить информацию о комментарии по идентификатору продукта, получить информацию о пользователе по идентификатору пользователя в комментарии.
  • Сценарий 2. Параллельный сбор данных. Несколько запросов, не связанных между собой.
    • Например: получить информацию о продукте через идентификатор продукта, получить информацию о активности продукта и получить приобретенную текущую информацию пользователя

Программа исследований

Сценарий А Вариант Б
абонент клиент клиент
API-Server Самостоятельное изучение GraphQL
Payload соглашение GraphQL
Response соглашение GraphQL
Отказоустойчивость соглашение соглашение
Динамически выбирать поля да да

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

Поэтому есть сервис агрегации интерфейсов: api-aggregator. Фреймворк имеет следующие особенности:

  • Код ядра составляет около тысячи строк,Легкая реализация.

  • Не навязчивый к существующему коду, нет необходимости модифицировать и адаптировать существующие сервисы и коды, а существующие интерфейсы можно использовать напрямую.

  • Предоставляет точки расширения ApiAggregatePostProcessor для вмешательства на различных этапах агрегации интерфейса,Сильная масштабируемость.

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

  • Логика агрегации интерфейса взаимодействует напрямую с API-агрегатором через файлы конфигурации,Добавить интерфейс агрегации, публиковать не нужно.

API-агрегатор: сервис агрегации интерфейсов

api-aggregator

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

ApiDefinition: метаданные интерфейса

ApiDefinition не только определяет метаинформацию интерфейса, но также описывает источник параметров, требуемых интерфейсом.

API-агрегатор считает, что при агрегации интерфейса параметры интерфейса метаинформации могут иметь следующие источники:

  1. Он передается напрямую клиентом, то есть параметры получаются напрямую из HttpRequest.
  2. Получается из возвращаемого значения предыдущего интерфейса. Например: получить информацию о комментарии по идентификатору продукта, получить информацию о пользователе по идентификатору пользователя в комментарии. На этом этапе параметр uid должен быть получен из возвращаемого значения предыдущего интерфейса.

ResponseDefinition: логика агрегации между интерфейсами.

ResponseDefinition описывает логику агрегации между интерфейсами.Благодаря ResponseDefinition учащиеся могут настраивать структуру данных, возвращаемую интерфейсом, или динамически выбирать необходимые поля.

描述接口聚合关系

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

простой дизайн чата

Предварительная загрузка файла конфигурации

Информация о конфигурации объединения интерфейсов настраивается разработчиками внешнего интерфейса в фоновом режиме управления.

После того, как фронтенд-студенты отправят файл конфигурации, API-агрегатор проведет некоторый статический анализ файла конфигурации: проанализирует зависимость интерфейса и наличие проблем, таких как циклические зависимости.

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

Упрощенная модель http-запроса

HttpMethodInvoker

API-агрегатор абстрагирует HttpMethodInvoker для инициирования HTTP-запросов. Возвращаемый результат получается через Поставщика, который скрывает различия API между разными Http-клиентами.

Помните сцену, упомянутую ранее?

Сценарий 1: серийный сбор данных. Несколько запросов связаны.

Сценарий 2. Параллельный сбор данных. Несколько запросов, не связанных между собой.

В API-агрегаторе эти два сценария упрощаются в один.

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

Например:

Предполагая, что при агрегации интерфейсов необходимо запрашивать интерфейсы A, B и C, а данные интерфейса B зависят от интерфейса A, параметры запроса интерфейса A и интерфейса C могут напрямую получать параметры из HttpRequest.

Затем, в фактическом процессе агрегации интерфейсов, API-агрегатор сначала запросит интерфейс A и интерфейс C, затем заблокирует, чтобы получить возвращаемый результат интерфейса A, и, наконец, запросит интерфейс B.

предоставить точки расширения

API-агрегатор предоставляет ApiAggregatePostProcessor для облегчения последующего расширения.

Через ApiAggregatePostProcessor API-агрегатор может вмешиваться во весь процесс агрегации интерфейса, например: кэширование информации об интерфейсе, добавление журналов мониторинга и т. д.

ApiAggregatePostProcessor

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

Наконец, приглашаем всех оставить сообщение и обсудить в области комментариев, спасибо за чтение~~


Приглашаем обратить внимание на личный публичный номер:

Coder小黑