Как мгновенно запустить и запустить Java-сервер GraphQL

1656632529 kak mgnovenno zapustit i zapustit java server graphql

от Prithviraj Pawar

GraphQL – это язык запросов для получения данных через Интернет. С момента публичного объявления Facebook в 2015 году он вызвал интерес у многих условий. GraphQL в основном использовался в JavaScript. Фактически Facebook выпустил эталонную реализацию для него в JavaScript (graphql-js).

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

1*49DDRZhUWvVnH-QNHuSUSw
GraphQL Java

Как создать GraphQL Java Server в springboot

Возьмем для примера магическую школу с Вселенная Гарри Поттера. Данные магической школы таковы:

1*hXbJSrgal1fqUEvTl--Zlw

Здесь DataStores могут являться внутренними серверами или даже базами данных. Получение RESTful будет выглядеть, как показано ниже.

GET: /student?{parameters}GET: /House?{parameters}

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

Введите GraphQL: GraphQL – это подход к получению данных, управляемый схемой. Он моделирует данные как графики, и вам нужно выполнить запрос для получения данных. Он работает как SQL, но для веб-объектов. Итак, запрос graphQL для Гарри выглядит как:

query{Magic School{Student{namewand{origin}}}}

Прежде чем перейти к GraphQL, нам нужно настроить spring MVC. Самый простой способ сделать это – SpringBootStarter. Вы можете выбрать инструмент автоматизации сборки. Это дает пакет Spring Embedded Tomcat, готовый к работе на порту 8080. Чтобы проверить Tomcat, запустите:

$gradle clean build$java -jar ./build/libs/graphql-demo-0.0.1-SNAPSHOT.jar

По умолчанию Gradle называет ваш JAR «имя_проекта-версия-SNAPSHOT.jar». Проверьте http:localhost:8080 чтобы увидеть работу Tomcat на порту 8080.

Давайте теперь добавим зависимость GraphQL-Java в наш build.gradle.

dependencies {compile('com.graphql-java:graphql-java:{version}')compile group: 'org.json', name: 'json', version: '20170516'}

Добавьте текущую версию, найденную в репозитории mavenCentral. На данный момент последняя версия 8.0. Также добавить org.json, которая является удобной библиотекой, поскольку GraphQL обрабатывает ответный запрос в JSON.

Как я уже упоминал ранее, GraphQL – это язык, управляемый схемами. Он просит пользователей выбрать объекты в запросе по схеме.

Давайте погрузимся прямо в:

Мы открыли а /graphql интерфейс для запросов GraphQL POST. Нам нужно создать схему для представления данных.

  • SchemaGenerator анализирует схему и создает абстрактное синтаксическое дерево с именами полей как дочерними узлами.
  • Затем полям назначаются типы TypeDefinitionRegistry, например Int, String и т.д. GraphQL имеет прекрасную систему типов, в которой мы можем иметь специальные типы в схеме, включая enum, интерфейсы, объединения, списки и т.д.
  • Посмотрите на RuntimeWiring() шаг, где поле MagicSchool сопоставляется с Hogwarts a StaticDataFetcher.
  • Каждое поле подкреплено a сборщик данных, и работа сбора данных состоит в том, чтобы распознать данные и возвратиться к GraphQL.
  • Затем GraphQL связывает его с определенными именами схем, будь то вложенная карта списков или общая карта. GraphQL делает это если вы определяете правильную схему.
  • После отправки этих данных в ExecutionInputмеханизм GraphQL анализирует->проверяет->выбирает->выполняет запрос и возвращает вам результат JSON ответаиспользовать .toSpecifiation()

Давайте создадим запрос с помощью GraphiQL. Добавьте это расширение в браузер и установите конечную точку.

1*CKJMKjvUEv4B4j-zjvc6XA

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

Давайте добавим еще несколько полей в схему. Мы создадим язык определения схемы. Создайте файл с названием magicSchool.graphql.

type Query{magicSchool:MagicSchool}type MagicSchool{name: StringHeadMaster:Stringstudent:Student}type Student{name:Stringwand:Wandhouse:House}type House{name:Stringcolor:Stringpoints:Int}type Wand{name:Stringorigin:String}

Измените источник схемы в коде и проверьте новую схему в GraphiQL

File schemaFile = loadSchema("magicSchool.graphql");TypeDefinitionRegistry typeRegistry=schemaParser.parse(schemaFile);

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

Вот мы имеем @Autowired все сборщики, чтобы получить нам данные. Каждый тип GraphQL поддерживается развязчиком типов (устройством сбора данных). Эти резольверы независимы друг от друга и могут иметь разные источники. Каждый DataFetcher здесь имеет a Среда получения данных, который является интерфейсом выполнения запроса GraphQL. Он содержит запрос-аргументы, контекст, executionId, параметры, специфические для поля, и так дальше.

Посмотрите на StudentFetcher и результат нашего запроса (не обращайте внимания на расширение):

public DataFetcher getData() {    return environment -> {        Map<String, Object> student = new HashMap<>();        if ("1".equalsIgnoreCase(environment.getArgument("id"))) {            student.put("name", "Harry Potter");        }        return student;    };}
1*IHNWKg07X-IssEV5Ixefbw
Вывод GraphiQL

Напоминает вам SQL, не правда ли? Также посмотрите, как Недоборка и Переборка быть ликвидированным, и контроль над данными весь в руках клиента. Теперь мы можем получить информацию о Гарри и Роне аккуратно и одним обращением к серверу!

Стратегия и инструментарий выполнения GraphQL

Каждое выполнение запроса асинхронно в graphql-java. Когда звонишь build.execute(executionInput), он возвращает объект CompletableFuture, который завершается, когда запрос завершает поток выполнения.

Кроме того, поскольку поля решаются отдельно, в приведенном выше примере Палочка и Дом информация получается и выполняется параллельно. По умолчанию ExecutionStrategy использует пул fork-join Java, но вы можете добавить свой пул потоков с помощью Executor Class.

ExecutorService executorService = new ThreadPoolExecutor(            128, /* core pool size 128 threads */            256, /* max pool size 256 threads */            10, TimeUnit.SECONDS,            new LinkedBlockingQueue<Runnable>(),            new ThreadPoolExecutor.CallerRunsPolicy());    return GraphQL.newGraphQL()            .instrumentation(new TracingInstrumentation ())             .queryExecutionStrategy(new ExecutorServiceExecutionStrategy(executorService))            .build();}

graphql-java позволяет инструментировать выполнение запроса в каждой точке: кВыполнение, перед разбором, и beforeFetching. Вы можете продолжить Инструментальное оборудование и обеспечьте свое действие на каждом шагу — например, регистрируйте запросы и возвращайте время каждого шага.

Выход инструментария предоставляет карту расширений в формате Apollo Tracing по умолчанию. Позже это может быть использовано определенным клиентом для визуализации данных исполнения (например, с помощью elastic-search и Grafana). Теперь вы знаете, что означает расширение на изображении выше!

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

Подведению

У graphql-java есть много других функций, например Загрузчик данных (что решает проблему получения N+1), директивы (что облегчает написание схем) и так далее. GraphQL — это новая технология, которая облегчает жизнь клиента и может изменить, как мы делаем вещи в Интернете. Вот почему многие компании, такие как Facebook, Twitter, GitHub и Coursera, уже приняли его.

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

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

Ваш адрес email не будет опубликован.