JavaScript 语言 如何使用GraphQL Apollo Federation 2

JavaScript阿木 发布于 2025-06-26 11 次阅读


使用GraphQL Apollo Federation 2在JavaScript中的应用

GraphQL 是一种用于API的查询语言,它允许客户端根据需要请求数据。Apollo Federation 是一个用于构建可扩展的、分布式GraphQL服务的框架。它允许开发者将多个GraphQL服务组合成一个单一的、统一的API。本文将围绕JavaScript语言,详细介绍如何使用Apollo Federation 2来构建和集成GraphQL服务。

环境准备

在开始之前,请确保您的开发环境已经安装了Node.js和npm。以下是创建Apollo Federation项目所需的步骤:

1. 初始化一个新的Node.js项目:

bash

npm init -y


2. 安装必要的依赖项:

bash

npm install apollo-server apollo-federation graphql


创建服务

在Apollo Federation中,每个服务都被称为一个“Federated Service”。以下是创建两个简单服务的步骤:

服务A

1. 创建一个名为 `service-a` 的新目录。

2. 在 `service-a` 目录中,创建一个名为 `index.js` 的文件,并添加以下内容:

javascript

const { ApolloServer, gql } = require('apollo-server');

// 定义类型定义


const typeDefs = gql`


type Query {


hello: String


}


`;

// 定义解析函数


const resolvers = {


Query: {


hello: () => 'Hello from Service A!',


},


};

// 创建Apollo Server实例


const server = new ApolloServer({ typeDefs, resolvers });

// 启动服务器


server.listen().then(({ url }) => {


console.log(`🚀 Server ready at ${url}`);


});


3. 在 `service-a` 目录下运行以下命令启动服务:

bash

node index.js


服务B

1. 创建一个名为 `service-b` 的新目录。

2. 在 `service-b` 目录中,创建一个名为 `index.js` 的文件,并添加以下内容:

javascript

const { ApolloServer, gql } = require('apollo-server');

// 定义类型定义


const typeDefs = gql`


type Query {


goodbye: String


}


`;

// 定义解析函数


const resolvers = {


Query: {


goodbye: () => 'Goodbye from Service B!',


},


};

// 创建Apollo Server实例


const server = new ApolloServer({ typeDefs, resolvers });

// 启动服务器


server.listen().then(({ url }) => {


console.log(`🚀 Server ready at ${url}`);


});


3. 在 `service-b` 目录下运行以下命令启动服务:

bash

node index.js


创建Federation层

Federation层负责将各个服务组合在一起,并提供一个统一的API。以下是创建Federation层的步骤:

1. 创建一个名为 `federation` 的新目录。

2. 在 `federation` 目录中,创建一个名为 `index.js` 的文件,并添加以下内容:

javascript

const { ApolloServer, gql } = require('apollo-server');

// 定义类型定义


const typeDefs = gql`


type Query {


_service: String


}


`;

// 定义解析函数


const resolvers = {


Query: {


_service: () => 'Federation Layer',


},


};

// 创建Apollo Server实例


const server = new ApolloServer({ typeDefs, resolvers });

// 启动服务器


server.listen().then(({ url }) => {


console.log(`🚀 Federation Layer ready at ${url}`);


});


3. 在 `federation` 目录下运行以下命令启动服务:

bash

node index.js


集成服务

现在,我们需要将服务A和服务B集成到Federation层中。以下是集成步骤:

1. 在 `federation` 目录中,创建一个名为 `federation-config.js` 的文件,并添加以下内容:

javascript

const { ApolloServer, gql } = require('apollo-server');


const { makeExecutableSchema } = require('@apollo/federation');


const { serviceA, serviceB } = require('./service-a');


const { serviceB } = require('./service-b');

// 合并类型定义


const schema = makeExecutableSchema({


typeDefs: [


gql`


extend type Query {


... on Query {


hello: String


goodbye: String


}


}


`,


serviceA.typeDefs,


serviceB.typeDefs,


],


resolvers: {


Query: {


hello: () => serviceA.resolvers.Query.hello(),


goodbye: () => serviceB.resolvers.Query.goodbye(),


},


},


});

// 创建Apollo Server实例


const server = new ApolloServer({ schema });

// 启动服务器


server.listen().then(({ url }) => {


console.log(`🚀 Federation Layer ready at ${url}`);


});


2. 在 `federation` 目录下运行以下命令启动服务:

bash

node index.js


测试

现在,您可以通过访问Federation层的URL来测试集成后的服务。例如,访问以下URL:


http://localhost:4000/


然后,您可以使用以下查询来测试服务:

graphql

query {


_service


hello


goodbye


}


这将返回以下结果:

json

{


"_service": "Federation Layer",


"hello": "Hello from Service A!",


"goodbye": "Goodbye from Service B!"


}


总结

本文介绍了如何使用JavaScript和Apollo Federation 2构建和集成GraphQL服务。通过将多个服务组合成一个统一的API,您可以轻松地扩展和扩展您的应用程序。希望这篇文章能帮助您更好地理解如何在您的项目中使用Apollo Federation。