Реалізація GraphQL Federation для об'єднання кількох сервісів

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація GraphQL Federation для об'єднання кількох сервісів
Складна
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

GraphQL Federation: об'єднання мікросервісів в один граф

GraphQL Federation (Apollo Federation 2) дозволяє різним командам володіти різними частинами GraphQL-схеми. Кожен сервіс публікує свій subgraph, Router об'єднує їх в один federated graph. Клієнти бачать одну точку входу, одну мову запитів—не знаючи про внутрішню структуру мікросервісів.

Архітектура

Клієнт → Router (Apollo Router) → Users Subgraph
                                → Products Subgraph
                                → Orders Subgraph
                                → Reviews Subgraph

Router отримує GraphQL запити, будує план виконання, викликає потрібні subgraph паралельно або послідовно, об'єднуючи результати.

Subgraph: Users Service

# users-service/schema.graphql
extend schema
  @link(url: "https://specs.apollo.dev/federation/v2.3",
        import: ["@key", "@shareable"])

type Query {
  me: User
  user(id: ID!): User
}

type User @key(fields: "id") {
  id: ID!
  name: String!
  email: String!
  createdAt: String!
}
// users-service/server.js
import { ApolloServer } from '@apollo/server'
import { buildSubgraphSchema } from '@apollo/subgraph'

const typeDefs = gql`...` // schema вище

const resolvers = {
  Query: {
    me: (parent, args, context) => context.db.users.findById(context.userId),
    user: (parent, { id }, context) => context.db.users.findById(id)
  },

  User: {
    // Reference resolver: Router запитує User за id з іншого сервісу
    __resolveReference: async ({ id }, context) => {
      return context.db.users.findById(id)
    }
  }
}

const server = new ApolloServer({
  schema: buildSubgraphSchema({ typeDefs, resolvers })
})

Subgraph: Products Service

# products-service/schema.graphql
extend schema
  @link(url: "https://specs.apollo.dev/federation/v2.3",
        import: ["@key", "@external", "@requires", "@provides"])

type Query {
  products(categoryId: ID, limit: Int): [Product!]!
  product(id: ID!): Product
}

type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Float!
  stock: Int!
  categoryId: ID!
}

# Розширення типу User з users-service
type User @key(fields: "id") {
  id: ID!
  # Додання поля wishlist до User, яким володіє users-service
  wishlist: [Product!]!
}

Композиція та розгортання

# supergraph.yaml
federation_version: =2.3

subgraphs:
  users:
    routing_url: http://users-service:4000
  products:
    routing_url: http://products-service:4000
  orders:
    routing_url: http://orders-service:4000
# Генерування композиційної схеми
rover supergraph compose --config supergraph.yaml > supergraph.graphql

# Запуск router
docker run -p 4000:4000 \
  -v ./supergraph.graphql:/etc/apollo/supergraph.graphql \
  ghcr.io/apollographql/router:latest

Переваги

  • Автономія команди: кожна команда володіє своїм subgraph
  • Поступова адаптація: міграція сервісів один за одним
  • Спільні типи: посилання на типи через subgraph
  • Один ендпоїнт: клієнти не знають про мікросервіси

Терміни

Базова федерація (3 subgraph, Router): 2–3 дні. Складна багатокомандна настройка зі спеціальними директивами, розширеною композицією: 1–2 тижні.