On this page

Apollo Federation

GraphQL Yoga v2 documentation (superseded by v5): Learn how to use GraphQL Yoga with Apollo Federation. GraphQL Yoga is a fully-featured GraphQL Server with focus on easy setup, performance & great developer experience.

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.

Gateway

Installation for Gateway

npm i @graphql-yoga/node @apollo/gateway @envelop/apollo-federation graphql@15

Example Gateway

import { ApolloGateway, RemoteGraphQLDataSource } from '@apollo/gateway'
import { useApolloFederation } from '@envelop/apollo-federation'
import { createServer } from '@graphql-yoga/node'

/**
 * Needed since federation remote data source fetcher
 * doesn't support `application/graphql-response+json` content type
 * https://github.com/apollographql/federation/issues/2161
 * And yoga defaults to `application/graphql-response+json` as per the spec.
 */
class DataSource extends RemoteGraphQLDataSource {
  willSendRequest({ request }) {
    request.http.headers.set('accept', 'application/json')
  }
}

// Initialize the gateway
const gateway = new ApolloGateway({
  serviceList: [
    { name: 'accounts', url: 'http://localhost:4001' },
    { name: 'products', url: 'http://localhost:4002' }
    // ...additional subgraphs...
  ],
  introspectionHeaders: {
    accept: 'application/json'
  },
  buildService({ url }) {
    return new DataSource({ url })
  }
})

// Make sure all services are loaded
await gateway.load()

const server = createServer({
  plugins: [useApolloFederation({ gateway })]
})

// Start the server and explore http://localhost:4000/graphql
server.start()

Federation Service

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

Installation

npm i @graphql-yoga/node @apollo/subgraph graphql

Example User Service

const { parse } = require('graphql')
const { buildSubgraphSchema } = require('@apollo/subgraph')
const { createServer } = require('@graphql-yoga/node')

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 server = createServer({
  schema: buildSubgraphSchema([{ typeDefs, resolvers }]),
  port: 4001
})

server.start().then(() => {
  console.log(`πŸš€ Server ready at http://localhost:4001`)
})

Working Example

Check our working example to try it out.