GraphQL Federation
Di microservices, setiap service punya schema sendiri. Federation menggabungkan multiple schema menjadi satu unified graph yang client akses via satu endpoint.
Architecture
Client → Gateway (Router)
├── User Service (User schema)
├── Post Service (Post schema)
└── Comment Service (Comment schema)
# Client melihat satu schema unified
# Gateway routes queries ke service yang tepat
Subgraph Schemas
# User Service
type User @key(fields: "id") {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
me: User
}
# Post Service
type Post @key(fields: "id") {
id: ID!
title: String!
content: String!
author: User! # Reference ke User dari service lain
}
# Extend User dari service lain
extend type User @key(fields: "id") {
id: ID! @external
posts: [Post!]! # Field baru yang di-resolve di Post Service
}
@key Directive
Menandakan entity yang bisa di-reference antar subgraph. Gateway menggunakan key untuk "stitch" data.
Reference Resolver
// Post Service harus bisa resolve User reference
const resolvers = {
User: {
__resolveReference: (reference) => {
// reference = { id: "123" }
// Return user posts
return { id: reference.id };
},
posts: (user) => {
return db.posts.findMany({ where: { authorId: user.id } });
},
},
};
Tools
- Apollo Router — Production-ready gateway (Rust, high performance)
- Apollo Studio — Schema registry, composition checks
- Hive — Open-source schema registry alternative