Найти тему
KotoJava

GraphQL все еще неизвестный зверь в промышленной разработке

Оглавление

В данной статье мы разберем, что такое GraphQL, и построим приложение с использованием Java и Spring.

Атмосферный логотип GraphQL
Атмосферный логотип GraphQL

GraphQL стал опенсорсным в 2015 году, однако за десять лет так и не достиг такой же популярности, как REST-архитектура (на графике ниже видно, что нет явной тенденции к большему росту). Нельзя прямо сравнивать GraphQL с REST, поскольку первый представляет собой язык запросов, а второй – архитектурный стиль. Тем не менее, оба имеют реализации в промышленной разработке.

GraphQL все еще остается аутсайдером.
GraphQL все еще остается аутсайдером.

GraphQL в двух словах это гибкий контракт.

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

Spring и GraphQL

Довольно ожидаемо что Spring поглотил стандарное решение GraphQL и, конечно же, добавил несколько новых аннотаций. Spring хлебом не корми - дай новых аннотаций наклепать. Давайте напишем своё первое - апи сотрудники.

Для работы со спрингом нужно добавить зависимости.

Для интеграции добавьте в зависимости org.springframework.boot:spring-boot-starter-graphql а также установите переменную в application.properties: spring.graphql.graphiql.enabled: true

Все начинается с GraphQL схемы.

При проектировке контракта, используемого внутри канала, нам необходимо предварительно задекларировать структуру данных. Наша схема будет выглядеть вот так:

Пример так себе, но для нашего примера сгодится.
Пример так себе, но для нашего примера сгодится.

Суть апи которое мы сделаем - предоставлять сотрудников. У каждого сотрудника есть ссылка на департамент, который в свою очередь имеет ссылку на локацию и руководителей этого отдела. Основной посыл такой - скорее всего многим потребителям нашего апи понадобятся данные о сотрудниках и их отделах. Но также некоторым из них все же могут пригодится все данные.

Составляем схему.

Делаем схему, которая будет соответствовать нашим классам. Слева я расположил знакомые нам Java классы, а справа схему которая будет сохранена в schema.graphqls файле и затем использована для построения соединения.

-4

Язык graphql (справа) довольно интуитивен

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

Последний шаг - декларация запроса. В нашем случае allEmployees.

Создадим метод который будет возвращать данные - он должен быть помечен аннотацией @QueryMapping. Также зарегистрируем его в schema файле:

-5

Возвращаемый тип и название метода должны совпадать.

На этом все. Мы закончили разработку. Пишем первые запросы.

Довольно просто получилось интегрировать GraphQL, осталось научиться им пользоваться. Для этого мы воспользуемся встроенной веб интерфейсом который поставляется из коробки. После старта приложения откройте: http://localhost:8080/graphiql?path=/graphql

-6

Вот какую красоту мы увидим.

Что это такое? Более детально:

  • Слева у нас есть конструктор который помогает кликами создавать запрос
  • По центру мы готовим сам контракт для запроса - его можно править в ручную
  • Справа результат работы апи для выбранного контракта

В примере выше мы выбрали лишь два поля которые нужно вернуть для каждого сотрудника - имя и айдишник. Давайте добавим туда и департамент с локациями:

-7

Лишь измения в контракте дали нам новый результат. На бэкэнде мы не сделали изменений.

Как можно заметить, добавив необходимые поля, мы изменили контракт. Теперь данные о сотрудниках, департаментах и их локациях возвращаются с бэкенда.

Это не все возможности GraphQL.

Данная статья не включает все возможности GraphQL такие как:

  • Мутации - возможность делать гибкие запросы на изменение данных
  • Подписка - возможность подписываться на изменения
  • Более гибкие возможности работы с GraphQL - например возможность читать данные из контекста GraphQL
  • Генерация документации
  • DataLoaders - возможность борьбы с N+1 проблемой при работе с базой данных

Моё скромное мнение.

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

Надеюсь вам понравилась статья, кому интересно приглашаю в мой телеграм канал про разработку на Java и смежные технологии. Спасибо за внимание.