Эффективное управление вашим GraphQL API с помощью API Gateway

Bobur Umurzokov

Bobur Umurzokov

March 21, 2023

Technology

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

Одной из ключевых особенностей современных API Gateway, таких как Apache APISIX, является поддержка GraphQL API. APISIX упрощает управление и масштабирование GraphQL API благодаря своей гибкой системе конфигурации и мощным плагинам. Одним из таких плагинов является degrapghql, который позволяет преобразовывать GraphQL API в REST API. В этой статье мы рассмотрим эту функцию на примере.

Цели обучения

В ходе статьи вы узнаете ответы на следующие вопросы:

  • Что такое плагин DeGraphQL?
  • Каковы варианты использования и особенности плагина DeGraphQL?
  • Как использовать плагин DeGraphQL.
  • Как преобразовать REST в GraphQL?
  • Как управлять трафиком GraphQL API?

Управление вашим GraphQL API с помощью API Gateway

Зачем использовать плагин DeGraphQL?

Этот плагин способен преобразовывать API, предоставляемые GraphQL-сервером (бэкенд-сервисом), в традиционный REST-эндпоинт, сопоставляя URI с GraphQL-запросами. Вызов REST API из типичного клиента открывает преимущества GraphQL для большего числа людей, рассмотрим следующие варианты использования:

Вариант использования 1: Ваши существующие клиенты привыкли использовать REST API и не слишком знакомы с тем, как писать GraphQL-запросы. Чтобы упростить им задачу, вы можете использовать Apache APISIX API Gateway для преобразования GraphQL API в REST API.

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

Вариант использования 3: У вас нет доступа для изменения бэкенда, так как это существующий набор GraphQL API, возможно, управляемый третьей стороной.

Вариант использования 4: У вас есть существующая инфраструктура REST API, но вы хотите оценить, подойдет ли GraphQL для ваших нужд.

Вариант использования 5: У вас большая кодовая база, и миграция на GraphQL происходит на бэкенде, но вы хотите использовать GraphQL сейчас, не дожидаясь завершения.

Вариант использования 6: У вас есть несколько микросервисов, и они используют комбинацию обоих подходов. Вы хотите обеспечить плавное взаимодействие между ними.

Каковы особенности плагина DeGraphQL?

Плагин DeGraphQL предоставляет ряд полезных функций, которые упрощают настройку и управление вашим GraphQL API, включая:

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

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

Трансформация ответов: Наконец, он может преобразовывать GraphQL-ответы перед их возвращением клиенту. Это может быть полезно для нормализации структур данных, удаления конфиденциальной информации или добавления дополнительных данных в ответ.

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

Как использовать плагин DeGraphQL (Демо)

Имея достаточно теоретических знаний, теперь мы можем перейти к практической демонстрации плагина DeGraphQL. DeGraphQL требует GraphQL-эндпоинт для запросов. В качестве примера мы будем использовать один из бесплатных публичных GraphQL API, который предоставляет информацию о странах, континентах и языках: https://countries.trevorblades.com/.

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

Запросы к GraphQL API

Вы также можете создать собственный GraphQL API с помощью StepZen или ApollographQL, которые предоставляют студии для создания и развертывания вашего собственного GraphQL API, объединяя предварительно созданные API, такие как Accuweather, Airtable, GitHub, Twitter, Trello и другие. Например, вы можете объединить два API Accuteweather и Countries, чтобы собирать информацию о погоде, предоставляемую по названию страны/города, и использовать APISIX для запросов к API через REST.

Теперь наша задача — преобразовать вышеуказанный запрос в простой REST-вызов и отправить его в виде JSON-данных. В результате API Gateway Apache APISIX должен предоставлять REST-эндпоинт и маршрутизировать все запросы к GraphQL API.

Например, все REST-запросы к API Gateway по пути /country-info с запросом по коду страны должны быть преобразованы и переданы в GraphQL API https://countries.trevorblades.com/graphql.

Пример команды curl может выглядеть так:

curl -i http://127.0.0.1:9080/country-info -X POST -d \ '{ "code": "EE" }'

И мы должны получить ответ от API следующим образом:

{ "data": { "country": { "code": "EE", "capital": "Tallinn", "currency": "EUR", "languages": [ { "name": "Estonian" } ] } } }

В следующих разделах мы узнаем, как достичь этого шаг за шагом.

Запустим Apache APISIX

Прежде чем использовать плагин degrapghql, вам нужно установить Apache APISIX. Вы можете следовать инструкциям по установке на сайте Apache APISIX, чтобы начать.

Предварительные требования

  • Docker используется для установки контейнеризованных etcd и APISIX.
  • curl используется для отправки запросов в APISIX для проверки. Вы также можете использовать удобные инструменты, такие как Postman, для взаимодействия с API.

APISIX можно легко установить и запустить с помощью следующего скрипта быстрого старта:

curl -sL https://run.api7.ai/apisix/quickstart | sh

Это создаст два Docker-контейнера — etcd для хранения конфигурации и сам APISIX Gateway. Как только вы увидите сообщение «✔ APISIX is ready!», мы сможем настроить апстрим, плагин и маршрут через Admin API APISIX, который проксирует запросы к GraphQL API.

Создаем апстрим

Далее мы создадим объект Upstream, чтобы зарегистрировать наш Countries GrapghQL API в API Gateway:

curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d ' { "name": "GraphQL API upstream", "desc": "Register Countries GraphQL API as the upstream", "type": "roundrobin", "scheme": "https", "nodes": { "countries.trevorblades.com": 1 } }'

Создаем конфигурацию плагина

Далее настроим новый объект plugin config. Мы будем использовать два плагина трансформации: proxy-rewrite и degraphql, чтобы переписать хост и URI запроса и выполнить запрос к GraphQL API соответственно.

curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PUT -d ' { "plugins":{ "proxy-rewrite":{ "uri":"/graphql", "host":"countries.trevorblades.com" }, "degraphql":{ "query":"query Country($code: ID!) { country(code: $code) { code capital currency languages { name } } }", "variables":[ "code" ] } } }'

В приведенной выше конфигурации плагина DeGraphQL мы задали два атрибута: query и variables. Переменные GraphQL-запроса могут быть определены в теле POST-запроса или в URI REST-вызова.

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

query ($code: ID!) { country(code: $code) { code capital currency languages { name } } }

Создаем маршрут с плагином DeGraphQL

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

curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d ' { "name":"GraphQL API route", "desc":"Create a new route in APISIX for the Countries GraphQL API", "uri":"/country-info", "upstream_id":"1", "plugin_config_id":1 }'

Тестируем активацию плагина DeGraphQL

Теперь давайте протестируем эту новую настройку с помощью следующей команды curl.

curl -i http://127.0.0.1:9080/country-info -X POST -d \ '{ "code": "EE" }'

Мы получим ответ от APISIX:

{ "data": { "country": { "code": "EE", "capital": "Tallinn", "currency": "EUR", "languages": [ { "name": "Estonian" } ] } } }

Ту же переменную code можно также передать как GET-аргументы:

curl -i http://127.0.0.1:9080/country-info?code=EE

Трансформация ответа

С помощью плагина response-rewrite Apisix можно преобразовывать GraphQL-ответы перед их возвращением клиенту. Давайте используем этот плагин, чтобы удалить ключ currency и его значение из JSON-ответа, чтобы показать только остальное. Для этого нам нужно добавить плагин response-rewrite в существующую конфигурацию плагина.

curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PATCH -d ' { "plugins":{ "response-rewrite": { "filters":[ { "regex":"(?:\"currency\":\")(.*?)(?:\")", "scope":"once", "replace":"" } ], "vars":[ [ "status", "==", 200 ] ] } } }'

После установки этого плагина вы можете снова сделать запрос к /country-info и увидеть преобразованный ответ:

{ "data": { "country": { "code": "EE", "capital": "Tallinn", "languages": [ { "name": "Estonian" } ] } } }

Итог

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

Связанные ресурсы

Tags: