Skip to content

Apollo Federation

Category

Build distributed GraphQL architectures with Apollo Federation support.

What is Federation?

Apollo Federation allows you to split your GraphQL API across multiple services (subgraphs) that are composed into a single supergraph.

Setup

1. Install Dependencies

bash
pnpm add @apollo/server @apollo/subgraph graphql graphql-config nitro-graphql@beta

2. Configure Subgraph

ts
// nitro.config.ts
import graphql from 'nitro-graphql'
import { defineNitroConfig } from 'nitro/config'

export default defineNitroConfig({
  modules: [
    graphql({
      framework: 'apollo-server',
      federation: {
        enabled: true,
        serviceName: 'users-service',
      },
    }),
  ],
})

3. Define Schema with Federation

graphql
# server/graphql/schema.graphql
type User @key(fields: "id") {
  id: ID!
  name: String!
  email: String!
}

extend type Post @key(fields: "id") {
  id: ID! @external
  author: User!
}

4. Implement Reference Resolvers

ts
// server/graphql/users.resolver.ts
import { defineResolver } from 'nitro-graphql/define'

export const userResolver = defineResolver({
  User: {
    __resolveReference: (reference) => {
      return findUser(reference.id)
    },
  },
  Post: {
    author: post => findUser(post.authorId),
  },
})

Example: Multi-Service Setup

Users Service

ts
// users-service/nitro.config.ts
import graphql from 'nitro-graphql'
import { defineNitroConfig } from 'nitro/config'

export default defineNitroConfig({
  modules: [
    graphql({
      framework: 'apollo-server',
      federation: {
        enabled: true,
        serviceName: 'users',
      },
    }),
  ],
})
graphql
type User @key(fields: "id") {
  id: ID!
  name: String!
  email: String!
}

Posts Service

ts
// posts-service/nitro.config.ts
import graphql from 'nitro-graphql'
import { defineNitroConfig } from 'nitro/config'

export default defineNitroConfig({
  modules: [
    graphql({
      framework: 'apollo-server',
      federation: {
        enabled: true,
        serviceName: 'posts',
      },
    }),
  ],
})
graphql
extend type User @key(fields: "id") {
  id: ID! @external
  posts: [Post!]!
}

type Post @key(fields: "id") {
  id: ID!
  title: String!
  content: String!
  authorId: ID!
}

Gateway Setup

Use Apollo Gateway or Apollo Router to compose subgraphs.

Next Steps


Source

Contributors

Changelog

26362refactor: rename defineType to defineField across documentation and examples
0.2.0 on

Released under the MIT License.