Применение API Gateway

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

В каком-то смысле API Gateway является аналогом шаблона проектирования «Фасад». Как и фасад, API Gateway предоставляет внешним клиентам общий интерфейс взаимодействия с системой.

Зачем нужен API Gateway?

Представим себе систему

API Gateway

Основной вопрос: как получить данные из конкретного сервиса в микросервисной архитектуре, учитывая высокую гранулярность сервисов и динамику их изменения, постоянно растущее разнообразие устройств со своими требованиями к передаче данных и безопасности?

В этом нам поможет API Gateway. Ниже приведен [не полный] список сквозной функциональности, поддерживаемой шлюзом API:

  • Аутентификация
  • Безопасность
  • Балансировка нагрузки
  • Диспетчеризация запросов
  • Разрешение зависимостей
  • Трансформация транспортного уровня

Аутентификация

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

Один из подходов к аутентификации показан ниже. В нем клиент отправляет аутентификационные данные в API Gateway, который вызывает AuthService, который может быть реализован, например, с применением OAuth и возвращает клиенту JSON Web Token.

 

При обращении к какому-либо ресурсу клиент передает JWT как часть запроса. API Gateway перенаправит запрос с JWT нужному сервису. В зависимости от реализации микросервис либо принимает решение о предоставлении доступа самостоятельно, либо запрашивает у сервиса авторизации права на доступ к заданному ресурсу клиента с полученным токеном. 

 

Безопасность

Шлюз нередко выступает в качестве единственной точки входа для внешних запросов. В таком случае на шлюз может быть возложена ответственность за обеспечение безопасности транспортного уровня с использованием различных каналов безопасности или устранением ограничений безопасности, не требуемых во внутреннем сегменте сети. Например, для RESTful HTTP API шлюз может выступить в качестве «SSL Termination Proxy»: между клиентом и шлюзом устанавливается защищенное соединение, в то время как запросы ко внутренним сервисам идут минуя SSL.

SSL Termination ProxyПомимо этого шлюз может выполнять следующие функции:

  • Автоматическое перенаправление с небезопасного подключения на безопасное
  • Блокировка вызовов с определенных API-адресов или групп API-адресов
  • Обеспечить защиту от DDoS-атак
  • Установить лимит на потребление ресурсов (количество/объем вызовов) в расчете на одного клиента
  • Ограничить максимальное количество подключений
  • Автоматически закрывать медленные подключения

Балансировка нагрузки

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

В микросервисах все немного сложнее. Каждый сервис может иметь свои собственные ограничения по масштабируемости. Дизайн API Gateways позволяет учесть эти ограничении. Например, некоторые сервисы могут масштабироваться за счет создания дополнительных инстансов за различными внутренними конечными точками (end points). Шлюз может направить запрос к внутреннему интерфейсу или создать дополнительные сервисы для поддержки возросшей нагрузки.

Диспетчеризация

В шлюзе могут быть реализованы специальные правила диспетчеризации запросов. В больших системах конечные точки (end points) появляются и исчезают постоянно, например, в связи с изменением топологии сети, выводом новой версии сервиса или выводом из эксплуатации старого. Шлюз может работать совместно с процессом Service Registration/Discovery или базами данных, в которых описано, куда направить тот или иной запрос. Это дает командам разработки исключительную гибкость и позволяет в случае падения каких-то сервисов направить запросы на запасный, избежав полного отказа системы.

Service Register Discovery

Разрешение зависимостей

Одна из специфичных для микросервисов проблем — для выполнения полезной работы сервисам может потребоваться множество вызовов других сервисов. Этот феномен назвали «chatty»-архитектурой. Одно из решений — создание виртуальной конечной точки (virtual end point), своеобразного фасада, который распределяет запросы по конкретным сервисам и собирает унифицированный ответ.

Объединение данных из множества сервисов можно сделать и в памяти, что, однако,  не всегда эффективно с точки зрения производительности, особенно при объединении больших наборов данных. Здесь стоит обратить внимание на клиента. Если клиент — мобильное приложение с условиях слабой сети, то одно обращение к API Gateway с агрегацией данных внутри может дать серьезное преимущество во времени отклика даже несмотря на то, что по внутренним замерам производительности все стало медленнее.

Преобразования транспортного уровня

Существует три вида преобразований:

  • Преобразование тела запроса
  • Преобразование заголовка запроса
  • Преобразование из одного протокола передачи данных в другой

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

Например, мобильному приложению и веб-приложению может требоваться различный объем данных, а регулятор умеет работать только по SOAP, тогда как внутри мы используем JSON для передачи данных.

Преимущества API Gateway

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

Недостатки API Gateway

  • Увеличение сложности — API Gateway — это еще одна система, которую необходимо разработать, выпустить и поддерживать
  • Увеличение времени отклика за счет дополнительных вызовов и затрат на обработку запроса

 

Share

2 комментария

Добавить комментарий