Лучшие практики для создания надежных API
August 18, 2022
По мере масштабирования ваших API возрастает необходимость сделать их надежными и устойчивыми.
В этой статье обсуждаются лучшие практики создания надежных API путем введения специального вида обратных прокси, называемых API-шлюзами.
Мы рассмотрим:
- Проблемы традиционных проектов API
- Что такое API-шлюзы
- Как API-шлюзы улучшают API и
- Паттерны и примеры использования API-шлюзов
Но сначала, что такое "надежные" API?
Что делает API надежным?
Как поставщик услуг, у вас могут быть соглашения об уровне обслуживания (SLA) с вашими клиентами, обычно выраженные в виде времени доступности — количества времени, в течение которого услуга гарантированно будет доступна и работоспособна.
Время доступности — это узкий взгляд на надежность. Чтобы понять, что значит быть надежным, нужно рассмотреть факторы, влияющие на время доступности. Как только вы поймете эти факторы, вы будете в лучшем положении для создания надежных услуг.
Давайте рассмотрим эти факторы и вопросы, которые они ставят:
- Задержка: Как быстро ваш API отвечает на запросы?
- Безопасность: Кто может получить доступ к вашему API? Насколько он безопасен?
- Частота простоев: Как часто ваш API недоступен?
- Постоянство: Постоянны ли конечные точки вашего API? Нужно ли потребителям часто менять свой код?
- Мониторинг и отчетность: Можете ли вы наблюдать за проблемами и сбоями в вашем API? Сообщаете ли вы о них своим потребителям?

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

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

Существует множество открытых и управляемых решений API-шлюзов. В этой статье я буду использовать Apache APISIX.
В следующем разделе будут описаны некоторые из лучших практик для повышения надежности ваших API с использованием API-шлюзов.
Лучшие практики надежности с использованием API-шлюзов
Мы сосредоточимся больше на паттернах, чем на конкретной реализации, так как она может варьироваться в зависимости от выбранного вами API-шлюза.
Я разделю эти паттерны на три категории:
- Аутентификация и безопасность
- Мониторинг и наблюдаемость
- Управление версиями и нулевое время простоя
Мы рассмотрим каждую категорию подробнее ниже.
Аутентификация и безопасность
Аутентификация пользователей
Аутентифицированные запросы с использованием API-шлюзов обеспечивают безопасное взаимодействие клиентов с API. После аутентификации клиента ваш API-шлюз может использовать полученные данные клиента для детального контроля.

APISIX обрабатывает аутентификацию напрямую через плагины, такие как key-auth и jwt-auth. APISIX также поддерживает аутентификацию OAuth и системы контроля доступа на основе ролей, такие как wolf, через плагины openid-connect и wolf-rbac, соответственно.
Ограничение скорости
Намеренные (DoS-атаки) и ненамеренные (клиенты, делающие слишком много запросов) всплески трафика к вашим API могут обрушить их, как карточный домик. Настройка ограничения скорости повысит надежность ваших систем в таких сценариях.
Вы можете настроить ограничение скорости на вашем API-шлюзе, и если количество запросов превысит порог, API-шлюз может либо задержать, либо отклонить превышающие запросы.

С APISIX вы можете использовать любой из трех плагинов для настройки ограничений скорости на основе количества запросов, количества одновременных запросов на клиента и счетчика (limit-req, limit-conn, limit-count).
Мониторинг и наблюдаемость
Надежность вашего API и ваша система мониторинга идут рука об руку. Вы можете отслеживать метрики надежности, настроив мониторинг на вашем API-шлюзе.

Логи API и трассировки предоставляют подробную информацию о вызове API. Эта информация поможет вам узнать о сбоях или ошибках в вашем API как можно раньше. Тихие сбои приводят к неисправленным ошибкам, которые могут вызвать проблемы в будущем.
С некоторой настройкой вы также сможете прогнозировать и предвидеть трафик на будущее, помогая вам масштабироваться надежно.
APISIX имеет плагины, которые интегрируются с системами логирования (Apache SkyWalking, RocketMQ), метриками (Prometheus, Datadog) и трассировкой (OpenTelemetry, Zipkin) платформами/спецификациями. Вы можете узнать больше о наблюдаемости API с плагинами APISIX.
Управление версиями и нулевое время простоя
Канареечные выпуски
При переходе на новые версии ваших API вы должны убедиться, что не теряете трафик. Клиенты по-прежнему должны иметь возможность делать запросы к вашему API и получать правильный ответ.
С API-шлюзом вы можете настроить канареечные выпуски. Это обеспечит функциональность вашего API во время перехода, а также позволит вам вернуться к старой версии, если возникнут какие-либо проблемы.
Изначально API-шлюз будет направлять весь трафик на старую версию вашего API.

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

Наконец, вы можете перенаправить весь трафик на ваш новый API.

APISIX использует плагин traffic-split, который позволяет вам контролировать трафик к вашим сервисам. Вы можете использовать его для настройки канареечных выпусков или вашей собственной конфигурации выпуска.
Прерывание цепи
Когда один из ваших вышестоящих сервисов недоступен или испытывает высокую задержку, его необходимо отключить от вашей системы. В противном случае клиент будет продолжать повторять запрос, что приведет к истощению ресурсов. Этот сбой может распространиться на другие сервисы в вашей системе и обрушить их.
Подобно тому, как электрические прерыватели цепи изолируют неисправные компоненты от цепи, API-шлюзы имеют функцию прерывания цепи, которая отключает неисправные сервисы, поддерживая здоровье системы. Трафик к этим сервисам перенаправляется или задерживается до тех пор, пока сервис не станет здоровым.

APISIX поставляется с плагином api-breaker, который реализует этот паттерн.
Перенаправления
По мере обновления ваших API их конечные точки могут изменяться. Традиционно это означало бы, что клиентское приложение должно отправлять запросы на /new-api-endpoint вместо /old-api-endpoint, что означает, что ваши потребители должны вручную изменять каждый вызов к этой конечной точке API.
Если это не предусмотрено, это может нарушить работу клиентских приложений.
С API-шлюзом вы можете предоставить уровень абстракции и перенаправлять запросы на /new-api-endpoint, не требуя от клиентов изменения их запросов. С правильными кодами состояния и сообщениями перенаправления вы можете постепенно устаревать /old-api-endpoint, не вызывая простоев у ваших потребителей.

С APISIX вы можете использовать плагин redirect для настройки перенаправлений.
Заключение
Когда надежность становится основной задачей, очевидно, что API-шлюзы необходимы, так как все больше организаций разделяют свои монолиты на микросервисы и переходят на облачные архитектуры.
Однако это не означает, что API-шлюзы подходят всем. В зависимости от размера и использования вашего API, API-шлюз может быть излишним, и вы можете обойтись использованием обратного прокси с базовыми возможностями маршрутизации и балансировки нагрузки.
Упомянутые здесь случаи использования лишь поверхностно затрагивают возможности API-шлюзов. Вы можете узнать больше об API-шлюзах и Apache APISIX на apisix.apache.org.