Skip to content

Apollo Federation

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 @apollo/utils.withrequired @as-integrations/h3 graphql

2. Configure Subgraph

ts
// nitro.config.ts
export default defineNitroConfig({
  modules: ['nitro-graphql'],
  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
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
export default defineNitroConfig({
  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
export default defineNitroConfig({
  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

Released under the MIT License.