如何快速构建下一代GraphQL应用

在本指南中,我们将深入探讨如何利用ServBay一站式环境和Docker,构建可扩展的GraphQL微服务。我们将从微服务架构和GraphQL的基础知识入手,逐步深入到如何利用现代工具和技术构建、容器化并部署我们的微服务。

理解微服务架构

微服务架构是一种将应用程序构建为一组小服务的方法,每个服务运行在其自己的进程中,并通过轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务能力构建,可以独立部署,由完全自治的团队维护。在我们深入构建微服务的过程之前,了解 GraphQL 在此架构中的作用非常重要。

什么是GraphQL?

GraphQL是由Facebook开发的一种数据查询和操作语言,用于API,并作为运行时用于执行这些查询的服务器端软件的一种方式。它提供了一种更高效、强大和灵活的替代REST的方法。

主要功能包括:

声明式数据获取: 使用 GraphQL,客户端可以在查询中精确指定所需的数据,包括字段和关系。这消除了传统 REST API 经常出现的数据过度获取和获取不足的问题。

高效的类型系统: GraphQL 拥有强大的类型系统,可以在 API 中定义数据的结构和关系。

高效的数据加载功能: GraphQL 使客户端能够在单个请求中检索多个资源。这减少了到服务器的往返次数,提高了效率并减少了延迟。

如何构建GraphQL微服务

在构建GraphQL微服务时,我们将遵循以下步骤:

第1步:使用ServBay设置环境

不同于传统的手动安装Node.js,ServBay提供了预配置的环境,包括各个版本的Node.js,使得开发者可以快速启动项目。

ServBay官网下载并创建账户。

创建一个新项目,选择Node.js环境。ServBay将自动为您的项目配置所需的Node.js环境。

Node.js安装部署指南

第2步:初始化Apollo服务器

Apollo Server是一个开源的、与GraphQL规范兼容的服务器,它简化了GraphQL API的构建。安装Apollo Server和所需依赖:

vbscript 复制代码
npm install apollo-server graphql

然后,创建一个简单的Apollo Server实例:

javascript 复制代码
const { ApolloServer, gql } = require('apollo-server');

// 定义schema
const typeDefs = gql`
  type Query {
    hello: String
  }
`;

// 定义resolver
const resolvers = {
  Query: {
    hello: () => 'Hello world!',
  },
};

// 创建Apollo服务器实例
const server = new ApolloServer({ typeDefs, resolvers });

// 启动服务器
server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});

第3步:配置Sequelize ORM

Sequelize是一个基于Promise的Node.js ORM,支持Postgres、MySQL、MariaDB、SQLite和Microsoft SQL Server。它具有强大的事务支持、关联关系、预加载和惰性加载、读取复制等功能。

javascript 复制代码
const { Sequelize } = require('sequelize');

// 连接数据库
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其中之一 */
});

// 测试连接
try {
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

第4步:创建数据模型

在Sequelize中定义模型,模型是代表数据库中表的抽象:

php 复制代码
const User = sequelize.define('User', {
  // 定义模型属性
  firstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  lastName: {
    type: DataTypes.STRING
    // allowNull 默认为 true
  }
}, {
  // 其他模型选项
});

第5步:定义GraphQL模式

GraphQL模式是你的数据和操作(查询和变更)的类型系统的描述。它是客户端和服务器之间通信的基础。

bash 复制代码
type Query {
  users: [User]
}

type User {
  id: ID!
  firstName: String!
  lastName: String
}

第6步:为GraphQL API创建解析器

解析器是一个函数,它负责为每个从客户端发来的GraphQL查询提供响应。

dart 复制代码
const resolvers = {
  Query: {
    users: async () => await User.findAll(),
  },
};

使用Docker容器化

Docker是一个开源开发平台,提供容器化技术,用于构建应用程序及其依赖项并将其打包到可移植映像中。

然后,无论底层基础设施如何,这些映像都可以作为独立的组件在隔离的容器环境中执行,并配备所需的计算资源。

使用 Docker(或任何其他容器化技术),您可以将每个微服务封装在其自己的容器中,从而提供高级别的隔离。

每个容器作为一个独立的单元运行,具有自己的依赖项和运行时环境。

此外,您可以轻松扩展微服务。您可以通过启动微服务的多个实例来水平扩展单个容器来处理增加的负载。

现在要开始使用 Docker,请在本地计算机上下载并安装Docker Desktop 。

Docker化您的应用程序意味着将其打包成一个容器,这个容器包含了应用程序运行所需的一切:代码、运行时、库、环境变量和配置文件。

Dockerizing GraphQL微服务

要使用 Docker 容器化您的 GraphQL API,您需要创建一个 Dockerfile。该文件包含 Docker 引擎构建 Docker 映像时所遵循的一系列指令,包括应用程序的源代码及其依赖项

创建一个Dockerfile

sql 复制代码
FROM node:14
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]

现在我们已经完成了容器化 GraphQL API 的第一步。下一步是配置数据源,即PostgreSQL数据库。

我们将利用现有的 PostgreSQL 数据库应用程序映像,而不是在本地安装和配置它,该映像将在单独的 Docker 容器上运行。

这种方法提供了多种好处,包括简化的依赖关系管理和确保跨各种开发环境的一致设置。

为了有效管理 GraphQL API 和 PostgreSQL 数据库容器,我们将使用Docker Compose。

yaml 复制代码
version: '3'
services:
  web:
    build: .
    ports:
      - "4000:4000"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

此 Docker compose 配置将管理两个服务:服务器(GraphQL API 映像容器)和 db(PostgreSQL 数据库映像容器)。

服务器服务将使用提供的 Dockerfile 构建其映像,而数据库服务将使用官方 PostgreSQL 映像。

此配置的一个重要方面是服务之间的依赖关系。

具体来说,API 服务依赖于数据库服务------这确保服务器在开始允许 API 无缝连接到 PostgreSQL 数据库之前等待数据库完全初始化。

要构建映像并启动容器,请运行以下命令:

docker compose up

最后,您现在可以继续测试用户 API 服务的功能。为此,只需导航到 即可在浏览器中访问 Apollo Server API 沙箱http://localhost``:<port>/graphql

进入沙箱后,您可以发送请求并观察响应。例如,您可以利用突变添加新用户的详细信息createUser

以下是用户 API 测试的示例:

通过执行这些步骤,您应该能够成功测试用户 API 服务的功能。

部署微服务

构建应用程序映像后,您可以将它们推送到 Docker Hub,它是一个类似于 GitHub 的集中存储库,但专门为 Docker 映像设计。

Docker Hub 为您的映像提供安全的存储解决方案,确保它们可以轻松地跨不同环境和平台进行部署。与 GitHub 类似,Docker Hub 与各种部署平台无缝集成,包括 AWS 等流行的云服务。

这种集成简化了部署过程,使您可以轻松地将 Docker 化应用程序部署到生产环境。

要将 Docker 映像推送到 Docker Hub,请按照以下步骤操作。

转至Docker Hub、注册并登录到您帐户的概述页面。

单击创建存储库 按钮。为您的存储库提供名称并选择其可见性(公共或私有)。然后,单击 "创建"

通过运行以下命令登录到您的 Docker 帐户:

docker login 出现提示时提供您的 Docker 用户名和密码。

更新 Docker 映像名称以匹配格式:<your docker username>/<repo name>通过运行以下命令。

docker tag <image-name> <your-docker-username>/<repo-name>

最后将Docker镜像推送到Docker Hub,

docker push <your-image-name>/<repo-name>

就是这样!您已成功将镜像推送到 Docker Hub。

容器编排平台

容器编排平台(例如 Kubernetes)可以简化容器化应用程序的管理。

它们提供了自动化容器部署、扩展和监控的工具。这简化了管理大规模微服务应用程序的复杂性。

它们的一些主要功能包括:

自动化部署: 编排平台自动部署容器,无需人工干预,确保部署一致可靠。

动态扩展: 根据需求动态调整容器数量,优化资源利用率,保证应用性能。

全面监控: 这些平台提供对容器运行状况、性能和资源消耗的实时监控,使管理员能够主动识别和解决问题。

要了解更多信息,您可以首先浏览Kubernetes官方文档。

相关推荐
桂月二二3 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
蟾宫曲3 小时前
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
前端·npm·vue3·vite·element-plus·计时器
秋雨凉人心3 小时前
简单发布一个npm包
前端·javascript·webpack·npm·node.js
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
qq13267029403 小时前
运行Zr.Admin项目(前端)
前端·vue2·zradmin前端·zradmin vue·运行zradmin·vue2版本zradmin
魏时烟4 小时前
css文字折行以及双端对齐实现方式
前端·css
Smile丶凉轩5 小时前
Docker核心技术和实现原理
运维·docker·容器
清风细雨_林木木5 小时前
Docker使用——国内Docker的安装办法
运维·docker·容器
2401_882726485 小时前
低代码配置式组态软件-BY组态
前端·物联网·低代码·前端框架·编辑器·web
web130933203985 小时前
ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含
前端·github