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 тижні.







