From bbb7d4c22dc1a9eace60ee3fbba8b2f507ff18e4 Mon Sep 17 00:00:00 2001 From: Stephen Barlow Date: Thu, 21 Apr 2022 15:39:12 -0700 Subject: [PATCH 1/3] Miscellaneous docs cleanup --- .../federation-2/moving-to-federation-2.mdx | 11 ++++++++--- .../source/federation-2/new-in-federation-2.mdx | 3 ++- docs/source/gateway.mdx | 12 ++++++------ docs/source/images/variant-settings.jpg | Bin 0 -> 51532 bytes 4 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 docs/source/images/variant-settings.jpg diff --git a/docs/source/federation-2/moving-to-federation-2.mdx b/docs/source/federation-2/moving-to-federation-2.mdx index 1e003dc71..9f08ba926 100644 --- a/docs/source/federation-2/moving-to-federation-2.mdx +++ b/docs/source/federation-2/moving-to-federation-2.mdx @@ -51,11 +51,16 @@ Follow the instructions below to configure whichever composition method(s) you c If you're using [managed federation](../managed-federation/overview/), you move individual variants of your graph to Federation 2 in the Apollo Studio UI. -Go to your graph's Settings page and open the Variants section: +Open the Settings page for the variant you want to move to Federation 2, then select the **This Variant** tab: -Edit supported directives in Studio +Edit variant settings in Studio -Click **Edit Build Configuration** for the variant you want to move to Federation 2. The following dialog appears: +Click **Edit Configuration**. The following dialog appears: Edit supported directives in Studio diff --git a/docs/source/federation-2/new-in-federation-2.mdx b/docs/source/federation-2/new-in-federation-2.mdx index fdc071cb2..4f3ca4d0a 100644 --- a/docs/source/federation-2/new-in-federation-2.mdx +++ b/docs/source/federation-2/new-in-federation-2.mdx @@ -16,7 +16,8 @@ Before covering what's new, here's what _isn't_ changing in Federation 2: * Graphs that _do_ require changes are graphs that _should_ cause composition errors, but Federation 1 fails to detect them. [Learn more.](./backward-compatibility/#do-i-need-to-modify-my-subgraph-schemas-to-use-federation-2) * To take full advantage of Federation 2 features, you do need to make some changes to your subgraph schemas, but you can make these changes incrementally at your convenience. See [Moving to Apollo Federation 2](./moving-to-federation-2/). -* Subgraph servers have _no_ additional requirements. Any [subgraph-compatible library](../other-servers/) is automatically compatible with Federation 2. +* Subgraph servers have no additional requirements. Any [subgraph-compatible library](../other-servers/) is automatically compatible with Federation 2. + * Many subgraph-compatible libraries do not yet automatically define certain directives that are new in Federation 2, such as `@shareable`. You can [define these directives manually](./moving-to-federation-2/#add-schema-definitions-to-non-apollo-subgraphs) to use them in your subgraph schemas. ## More flexible composition diff --git a/docs/source/gateway.mdx b/docs/source/gateway.mdx index 7f4607732..b315636f5 100644 --- a/docs/source/gateway.mdx +++ b/docs/source/gateway.mdx @@ -2,7 +2,7 @@ title: Implementing the gateway --- -> 📣 **The Apollo Router** is a new high-performance graph router written in Rust that is currently in alpha. You can try out the Apollo Router in place of the Apollo Gateway documented here. [See the documentation.](https://www.apollographql.com/docs/router/) +> 📣 **The Apollo Router** is a new high-performance graph router written in Rust that is currently in preview. You can try out the Apollo Router in place of the Apollo Gateway documented here. [See the documentation.](https://www.apollographql.com/docs/router/) After you set up at least one federation-ready [subgraph](./subgraphs/), you can configure a **gateway** to sit in front of your subgraphs. The gateway executes incoming operations across those subgraphs. @@ -15,12 +15,12 @@ The [`@apollo/gateway`](https://www.npmjs.com/package/@apollo/gateway) package e First, let's install the necessary packages: ```shell -npm install @apollo/gateway@latest-2 apollo-server graphql +npm install @apollo/gateway apollo-server graphql ``` The `@apollo/gateway` package includes the [`ApolloGateway` class](./api/apollo-gateway/). To configure Apollo Server to act as a gateway, you pass an instance of `ApolloGateway` to the `ApolloServer` constructor, like so: -```js {8-12,14-17} title="index.js" +```js {7-11,13-16} title="index.js" const { ApolloServer, gql } = require('apollo-server'); const { ApolloGateway } = require('@apollo/gateway'); const { readFileSync } = require('fs'); @@ -65,7 +65,7 @@ const { readFile } = require('fs/promises'); let supergraphUpdate; const gateway = new ApolloGateway({ async supergraphSdl({ update }) { - // `update` is a function which we'll save for later use + // `update` is a function that we'll save for later use supergraphUpdate = update; return { supergraphSdl: await readFile('./supergraph.graphql', 'utf-8'), @@ -89,7 +89,7 @@ Note that `supergraphSdl` is now an `async` function. This function is called ex - It receives the `update` function, which we use to update the supergraph schema. - It returns the initial supergraph schema, which the gateway uses at startup. -With the `update` function, we can now programatically update the supergraph. Polling, webhooks, and file watchers are all good examples of ways we can go about updating the supergraph. +With the `update` function, we can now programatically update the supergraph schema. Polling, webhooks, and file watchers are all examples of ways we can go about doing this. The code below demonstrates a more complete example using a file watcher. In this example, assume that we're updating the `supergraphSdl.graphql` file with the Rover CLI. @@ -226,7 +226,7 @@ After adding the `userId` to the shared `context` object, the gateway can then a -```javascript {6-12,17-19,24-31} +```javascript {7-13,17-19,25-32} const { ApolloServer } = require('apollo-server'); const { ApolloGateway, RemoteGraphQLDataSource } = require('@apollo/gateway'); const { readFileSync } = require('fs'); diff --git a/docs/source/images/variant-settings.jpg b/docs/source/images/variant-settings.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcd80c4af0c52fe68755590f794b9fc9c9f0535c GIT binary patch literal 51532 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

jQUWz`56#j7oMeLUM4}2&txrYofMz=a@x?&% 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 G+x>3 Date: Fri, 29 Apr 2022 15:23:00 -0700 Subject: [PATCH 2/3] Some more cleanup and move to supergraph language --- docs/source/config.json | 2 +- .../source/federation-2/backward-compatibility.mdx | 11 ++++++----- docs/source/federation-2/new-in-federation-2.mdx | 4 ++-- docs/source/gateway.mdx | 6 +++--- docs/source/index.mdx | 14 +++++++------- docs/source/subgraphs.mdx | 8 +++++--- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/source/config.json b/docs/source/config.json index d9484dd6c..3d615f06f 100644 --- a/docs/source/config.json +++ b/docs/source/config.json @@ -25,7 +25,7 @@ "3️⃣ Local schema composition": "/quickstart/local-composition", "4️⃣ Working with subgraphs": "/quickstart/local-subgraphs" }, - "Implementing": { + "Implementing a Supergraph": { "Subgraphs": "/subgraphs", "The gateway": "/gateway" }, diff --git a/docs/source/federation-2/backward-compatibility.mdx b/docs/source/federation-2/backward-compatibility.mdx index 4e6476cf2..03e86589f 100644 --- a/docs/source/federation-2/backward-compatibility.mdx +++ b/docs/source/federation-2/backward-compatibility.mdx @@ -5,14 +5,15 @@ description: FAQ ## Do I need to modify my subgraph schemas to use Federation 2? -**Eventually.** The process of [moving to Federation 2](./moving-to-federation-2/) has two phases: +**Eventually.** The process of [moving to Federation 2](./moving-to-federation-2/) has three steps: -1. Use Federation 2 composition with your Federation 1 subgraph schemas. -2. Convert your Federation 1 subgraph schemas to true Federation 2 subgraph schemas. +1. Update your gateway to support Federation 2. +2. Begin composing your supergraph schema with Federation 2 composition logic. +3. Update your individual subgraphs to use Federation 2 features and directives. -Phase 1 usually requires _no_ changes to your subgraph schemas. Schemas that _do_ require changes are schemas that _should_ cause certain composition errors that Federation 1 fails to detect ([see below.](#breaking-changes)). +Steps 1 and 2 usually require _no_ changes to your subgraph schemas. Schemas that _do_ require changes are schemas that _should_ cause certain composition errors that Federation 1 fails to detect ([see below.](#breaking-changes)). -Phase 2 _does_ require some changes to your subgraph schemas, described [here](./moving-to-federation-2/#phase-2-modify-subgraph-schemas). +Step 3 _does_ require some changes to your subgraph schemas, described [here](./moving-to-federation-2/#step-3-update-individual-subgraphs). ### Breaking changes diff --git a/docs/source/federation-2/new-in-federation-2.mdx b/docs/source/federation-2/new-in-federation-2.mdx index 4f3ca4d0a..ed0a769eb 100644 --- a/docs/source/federation-2/new-in-federation-2.mdx +++ b/docs/source/federation-2/new-in-federation-2.mdx @@ -12,12 +12,12 @@ If you're just getting started with Federation, check out the [Quickstart](../qu Before covering what's new, here's what _isn't_ changing in Federation 2: -* Most importantly, **Federation 2 is backward compatible with most Federation 1 graphs.** You can probably move your existing graph to use Federation 2 composition without making any changes. +* Most importantly, **Federation 2 is backward compatible with most Federation 1 supergraphs.** You can probably move your existing supergraph to use Federation 2 composition without making any changes. * Graphs that _do_ require changes are graphs that _should_ cause composition errors, but Federation 1 fails to detect them. [Learn more.](./backward-compatibility/#do-i-need-to-modify-my-subgraph-schemas-to-use-federation-2) * To take full advantage of Federation 2 features, you do need to make some changes to your subgraph schemas, but you can make these changes incrementally at your convenience. See [Moving to Apollo Federation 2](./moving-to-federation-2/). * Subgraph servers have no additional requirements. Any [subgraph-compatible library](../other-servers/) is automatically compatible with Federation 2. - * Many subgraph-compatible libraries do not yet automatically define certain directives that are new in Federation 2, such as `@shareable`. You can [define these directives manually](./moving-to-federation-2/#add-schema-definitions-to-non-apollo-subgraphs) to use them in your subgraph schemas. + * Many subgraph-compatible libraries do not yet automatically define certain directives that are new in Federation 2, such as `@shareable`. You can [define these directives manually](./moving-to-federation-2/#add-directive-definitions-if-needed) to use them in your subgraph schemas. ## More flexible composition diff --git a/docs/source/gateway.mdx b/docs/source/gateway.mdx index b315636f5..7c39b66c9 100644 --- a/docs/source/gateway.mdx +++ b/docs/source/gateway.mdx @@ -4,9 +4,9 @@ title: Implementing the gateway > 📣 **The Apollo Router** is a new high-performance graph router written in Rust that is currently in preview. You can try out the Apollo Router in place of the Apollo Gateway documented here. [See the documentation.](https://www.apollographql.com/docs/router/) -After you set up at least one federation-ready [subgraph](./subgraphs/), you can configure a **gateway** to sit in front of your subgraphs. The gateway executes incoming operations across those subgraphs. +After you set up at least one federation-ready [subgraph](./subgraphs/), you can configure a **gateway** to sit in front of your subgraphs. The gateway serves as the entry point to your supergraph, and it executes incoming operations across one or more of your subgraphs. -The [`@apollo/gateway`](https://www.npmjs.com/package/@apollo/gateway) package extends Apollo Server's functionality, enabling it to act as a gateway for an Apollo Federation architecture. +The [`@apollo/gateway`](https://www.npmjs.com/package/@apollo/gateway) package extends Apollo Server's functionality, enabling it to act as the gateway for a supergraph. > We recommend against running your gateway in a serverless environment (such as AWS Lambda), because schema composition increases Apollo Server's startup time. If you _do_ run your gateway in a serverless environment, set your function's timeout to at least 10 seconds to prevent unexpected errors. @@ -28,7 +28,7 @@ const { readFileSync } = require('fs'); const supergraphSdl = readFileSync('./supergraph.graphql').toString(); // Initialize an ApolloGateway instance and pass it -// the supergraph schema +// the supergraph schema as a string const gateway = new ApolloGateway({ supergraphSdl, }); diff --git a/docs/source/index.mdx b/docs/source/index.mdx index 3daa702c1..86a982346 100644 --- a/docs/source/index.mdx +++ b/docs/source/index.mdx @@ -12,7 +12,7 @@ import FederationArchitecture from '../shared/diagrams/federation-architecture.m > > Docs for Federation 1 are [available here](/federation/v1/). -**Apollo Federation** is a powerful open-source architecture that helps you create a **unified graph** that combines multiple GraphQL APIs: +**Apollo Federation** is a powerful open-source architecture that helps you create a **unified supergraph** that combines multiple GraphQL APIs: ```mermaid graph BT; @@ -25,9 +25,9 @@ graph BT; end; ``` -With federation, you can responsibly share ownership of your graph across any number of teams. And even if you currently only have _one_ GraphQL API, Apollo Federation is essential for scaling that API as you grow your features, user base, and organization. +With federation, you can responsibly share ownership of your supergraph across any number of teams. And even if you currently only have _one_ GraphQL API, Apollo Federation is essential for scaling that API as you grow your features, user base, and organization. -Federation also supports a free managed mode with Apollo Studio, which helps you modify and grow your graph without any downtime. +Federation also supports a free managed mode with Apollo Studio, which helps you modify and grow your supergraph without any downtime.

@@ -177,7 +177,7 @@ graph BT; class clients secondary; ``` -By unifying your graph with Apollo Federation, teams can continue to own and develop their subgraphs independently, and clients can fetch data from _all_ of those subgraphs with a single query. +By unifying your supergraph with Apollo Federation, teams can continue to own and develop their subgraphs independently, and clients can fetch data from _all_ of those subgraphs with a single query. ### Break up monolithic code @@ -197,7 +197,7 @@ flowchart TB; class teamA,teamB,teamC,teamD,teamE tertiary; ``` -By federating your graph, you can reduce performance _and_ productivity bottlenecks simultaneously. Each team can maintain their own subgraph(s) independently, and your graph's gateway serves primarily to _route_ incoming operations, not to resolve each of them completely. +With a supergraph, you can reduce performance _and_ productivity bottlenecks simultaneously. Each team can maintain their own subgraph(s) independently, and your supergraph's gateway serves primarily to _route_ incoming operations, not to resolve each of them completely.

@@ -368,7 +368,7 @@ graph LR; class uplink secondary; ``` -This mode helps multiple teams working on a graph to coordinate when and how to change individual subgraphs. It's recommended for all federated graphs. For more information, read [Managed federation overview](./managed-federation/overview/). +This mode helps multiple teams working on a supergraph to coordinate when and how to change individual subgraphs. It's recommended for all supergraphs. For more information, read [Managed federation overview](./managed-federation/overview/). --- diff --git a/docs/source/subgraphs.mdx b/docs/source/subgraphs.mdx index 73f604268..aedd72b28 100644 --- a/docs/source/subgraphs.mdx +++ b/docs/source/subgraphs.mdx @@ -4,7 +4,9 @@ title: Implementing subgraphs import FederationArchitecture from '../shared/diagrams/federation-architecture.mdx'; -This article describes how to create a **subgraph** for a federated graph using Apollo Server. +This article demonstrates how to create a **subgraph** for a federated supergraph using Node.js and Apollo Server. + +> To create a subgraph using a different language and/or framework, see the list of [subgraph-compatible libraries](./other-servers/). Note that not all libraries provide full support for Federation features. ## Defining a subgraph @@ -83,13 +85,13 @@ extend schema `; ``` -This definition designates a schema as a "true" Federation 2 schema. Without it, Federation 2 composition assumes a subgraph is using Federation 1, and it sets certain defaults for backward compatibility. +This definition enables the schema to use Federation 2 features. Without it, Federation 2 composition assumes a subgraph is using Federation 1, and it sets certain defaults for backward compatibility. > As you begin using more [federation-specific directives](./federated-types/federated-directives) beyond `@key` and `@shareable`, you'll need to add those directives to the `import` array shown above. ### 3. Define an entity -> Entities aren't _required_ in a subgraph, but they're a core building block of a federated graph, so it's good to get some practice defining them. +> Entities aren't _required_ in a subgraph, but they're a core building block of a federated supergraph, so it's good to get some practice defining them. As part of our federated architecture, we want _other_ subgraphs to be able to contribute fields to the `User` type. To enable this, we add the `@key` directive to the `User` type's definition to designate it as an [entity](./entities/): From 1f663cf3e705726772e5088202abefcdc12c7433 Mon Sep 17 00:00:00 2001 From: Stephen Barlow Date: Fri, 29 Apr 2022 15:42:52 -0700 Subject: [PATCH 3/3] Fix a link and a word --- docs/source/federated-types/sharing-types.mdx | 2 +- docs/source/index.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/federated-types/sharing-types.mdx b/docs/source/federated-types/sharing-types.mdx index 18ebde38d..72823639a 100644 --- a/docs/source/federated-types/sharing-types.mdx +++ b/docs/source/federated-types/sharing-types.mdx @@ -22,7 +22,7 @@ Types like this are called **value types**. This article describes how to share ## Sharing object types -By default in [Federation 2 subgraphs](../federation-2/moving-to-federation-2/#phase-2-modify-subgraph-schemas), a single object field _can't_ be defined or resolved by more than one subgraph schema. +By default in [Federation 2 subgraphs](../federation-2/moving-to-federation-2/#step-3-update-individual-subgraphs), a single object field _can't_ be defined or resolved by more than one subgraph schema. Consider the following `Position` example: diff --git a/docs/source/index.mdx b/docs/source/index.mdx index 86a982346..90b5cc960 100644 --- a/docs/source/index.mdx +++ b/docs/source/index.mdx @@ -1,6 +1,6 @@ --- title: Introduction to Apollo Federation -description: Combine GraphQL APIs into a unified graph +description: Combine GraphQL APIs into a unified supergraph --- import FederationArchitecture from '../shared/diagrams/federation-architecture.mdx';