Изучение нескольких схем GraphQL: методы и примеры кода

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

Метод 1: Федерация
GraphQL Федерация — это подход, который позволяет объединить несколько схем GraphQL в единый связный API. Это позволяет вам определить объединенную схему, которая объединяет несколько подсхем из отдельных сервисов. Вот пример:

# Schema 1
type User {
  id: ID!
  name: String!
}
type Query {
  getUserById(id: ID!): User
}
# Schema 2
type Post {
  id: ID!
  title: String!
}
type Query {
  getPostById(id: ID!): Post
}
# Federated Schema
extend type Query {
  getUserById(id: ID!): User
  getPostById(id: ID!): Post
}

Метод 2: Сшивание схем
Сшивание схем — это еще один метод объединения нескольких схем GraphQL. Он предполагает объединение нескольких схем в одну путем расширения типов и добавления преобразователей. Вот пример:

const { mergeSchemas } = require('graphql-tools');
const { makeExecutableSchema } = require('graphql-tools');
const userSchema = require('./userSchema');
const postSchema = require('./postSchema');
const mergedSchema = mergeSchemas({
  schemas: [userSchema, postSchema],
});

Метод 3: делегирование схемы
Делегирование схемы — это метод, при котором вы делегируете части запроса различным сервисам GraphQL. Каждая служба обрабатывает свою собственную схему и разрешает делегированные поля. Такой подход позволяет распределить рабочую нагрузку между несколькими сервисами. Вот пример:

const { ApolloGateway } = require('@apollo/gateway');
const { ApolloServer } = require('apollo-server');
const gateway = new ApolloGateway({
  serviceList: [
    { name: 'users', url: 'http://users-service:4001/graphql' },
    { name: 'posts', url: 'http://posts-service:4002/graphql' },
  ],
});
const server = new ApolloServer({
  gateway,
  subscriptions: false,
});
server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

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