Catch the highlights of GraphQLConf 2023!Click for recordings.Or check out our recap blog post.
v2
Features
Apollo Federation
⚠️
This is the documentation for the old GraphQL Yoga version 2. We recommend upgrading to the latest GraphQL Yoga version 5.

Migrate to GraphQL Yoga v5

Apollo Federation

Apollo Federation (opens in a new tab) is a specification that applies microservice architecture through GraphQL APIs.

Thanks to Envelop's Apollo Federation (opens in a new tab) plugin, we can use GraphQL Yoga to build our gateway server.

💡

As documented in the Apollo Federation docs (opens in a new tab), @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 (opens in a new tab).

Gateway

Installation for Gateway

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

Example Gateway

import { createServer } from '@graphql-yoga/node'
import { ApolloGateway, RemoteGraphQLDataSource } from '@apollo/gateway'
import { useApolloFederation } from '@envelop/apollo-federation'
 
/**
 * 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

Terminal
yarn add @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 (opens in a new tab) to try it out.