• v3 (latest)
  • Features
  • Apollo Federation

Apollo Federation

Apollo Federation is a specification that applies microservice architecture through GraphQL APIs.

Thanks to Envelop's Apollo Federation plugin, we can use GraphQL Yoga to build our gateway server.

💡

As documented in the Apollo Federation docs, @apollo/gateway package doesn't support GraphQL v16 so you have to install graphql@15.

💡

Please note that Apollo Federation implementation doesn't support GraphQL Subscriptions. If you need to use Subscriptions with a Federated Gateway you can use Schema Stitching.

Gateway

Installation for Gateway

yarn add graphql-yoga
yarn add @apollo/gateway
yarn add @envelop/apollo-federation
yarn add graphql@15

Example Gateway

import { createYoga } from 'graphql-yoga'
import { createServer } from 'http'
import { ApolloGateway } from '@apollo/gateway'
import { useApolloFederation } from '@envelop/apollo-federation'
 
// Initialize the gateway
const gateway = new ApolloGateway({
  serviceList: [
    { name: 'accounts', url: 'http://localhost:4001' },
    { name: 'products', url: 'http://localhost:4002' }
    // ...additional subgraphs...
  ]
})
 
// Make sure all services are loaded
await gateway.load()
 
const yoga = createYoga({
  plugins: [
    useApolloFederation({
      gateway
    })
  ]
})
 
// Start the server and explore http://localhost:4000/graphql
const server = createServer(yoga)
server.listen(4000, () => {
  console.info('Server is running on http://localhost:4000/graphql')
})

Federation Service

You don't need any extra plugins for Yoga for Federation Service.

Installation

yarn add graphql-yoga
yarn add @apollo/subgraph
yarn add graphql

Example User Service

const { parse } = require('graphql')
const { buildSubgraphSchema } = require('@apollo/subgraph')
const { createYoga } = require('graphql-yoga')
const { createServer } = require('http')
 
const typeDefs = parse(/* GraphQL */ `
  type Query {
    me: User
  }
 
  type User @key(fields: "id") {
    id: ID!
    username: String
  }
`)
 
const resolvers = {
  Query: {
    me() {
      return { id: '1', username: '@ava' }
    }
  },
  User: {
    __resolveReference(user, { fetchUserById }) {
      return fetchUserById(user.id)
    }
  }
}
const yoga = createYoga({
  schema: buildSubgraphSchema([{ typeDefs, resolvers }])
})
 
const server = createServer(yoga)
 
server.listen(4001, () => {
  console.log(`🚀 Server ready at http://localhost:4001`)
})

Federated tracing

Inject additional metrics for Apollo's federated tracing.

You'll need the @graphql-yoga/plugin-apollo-inline-trace Yoga plugin for this.

Installation

yarn add graphql-yoga
yarn add @graphql-yoga/plugin-apollo-inline-trace
yarn add graphql

Example Federated tracing

import { createYoga } from 'graphql-yoga'
import { createServer } from 'http'
import { useApolloInlineTrace } from '@graphql-yoga/plugin-apollo-inline-trace'
 
const yoga = createYoga({
  plugins: [
    useApolloInlineTrace()
    // ...rest of your Apollo federation plugins
  ]
})
 
// Start the server and explore http://localhost:4000/graphql
const server = createServer(yoga)
server.listen(4000, () => {
  console.info('Server is running on http://localhost:4000/graphql')
})

Working Example

Check our working example to try it out.

Last updated on November 15, 2022