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.