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

news2025/2/5 21:56:47

在本指南中,我们将深入探讨如何利用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和所需依赖:

npm install apollo-server graphql

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

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。它具有强大的事务支持、关联关系、预加载和惰性加载、读取复制等功能。

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中定义模型,模型是代表数据库中表的抽象:

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

第5步:定义GraphQL模式

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

type Query {
  users: [User]
}

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

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

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

const resolvers = {
  Query: {
    users: async () => await User.findAll(),
  },
};

使用Docker容器化

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

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

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

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

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

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

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

Dockerizing GraphQL微服务

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

创建一个Dockerfile

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。

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官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1598839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】删除链表中重复元素

本题来源---《删除链表中重复元素》。 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入…

java-生产者消费者

目录 1.生产者消费者1.1生产者和消费者模式概述【应用】1.2生产者和消费者案例【应用】1.3生产者和消费者案例优化【应用】1.4阻塞队列基本使用【理解】1.5阻塞队列实现等待唤醒机制【理解】 1.生产者消费者 1.1生产者和消费者模式概述【应用】 概述 生产者消费者模式是一个十…

惯用Python的5个技巧(循环)

在这篇文章中&#xff0c;你将看到5种方法可以使你的python循环更习惯&#xff0c;运行得更快&#xff0c;内存效率更高。 在我看来&#xff0c;Python是计算机科学中最简单、最通用的语言之一。如果你正确地编写python代码&#xff0c;很难区分python代码和伪代码。但有时&…

零基础学Python爬虫,一文教你入门!

Python被认作是人工智能和机器学习的基础语言&#xff0c;而数据科学和人工智能又有着密切的交集。因此&#xff0c;Python被视为数据科学领域应用最广泛的语言并不会令人感到意外。 现在让我们一同来回顾一下数据科学处理问题过程中的各个步骤&#xff0c;以此来进一步了解Pyt…

告别百年激进笔记

系列文章目录 八次危机笔记 告别百年激进笔记 文章目录 系列文章目录前言导图第一部分 资本全球化的宏大叙事第一节 人类创造的两个异化物第二节 全球资本化与制度性致贫第三节 国家竞争的“微笑曲线”第四节 欧债危机实属政治危机第五节 日本研究中的另类思考第六节 从…

四足机器人应用篇之solidwork导出URDF

欢迎关注微信公众号 “四足机器人研习社”&#xff0c;本公众号的文章和资料和四足机器人相关&#xff0c;包括行业的经典教材、行业资料手册&#xff0c;同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 |1.URDF介绍 一个URDF pakage示例 urdf是ROS用于…

【Altium Designer 20 笔记】PCB线宽与过孔尺寸

电源线&#xff1a;40mil1A&#xff08;一般翻倍给&#xff09;,地线比电源线粗一点即可&#xff1b;信号线&#xff1a;10-15mil 一、线宽 市电的火线和零线&#xff1a;80-100mil12V /24V 20mil~60mil 5V 20-30mil 3V 20-30mil GND 越宽越好20-30mil普通信号线 10mil-15mil…

element-ui的按需引入报错解决:MoudleBuildFailed,完整引入和按需引入

官网&#xff1a; Element - The worlds most popular Vue UI framework 1.完整引入 &#xff08;1&#xff09;下载&#xff1a; npm i element-ui -S &#xff08;2&#xff09;引入&#xff1a; 在 main.js 中写入以下内容&#xff1a; import Vue from vue; impor…

如何连通私有子网中的 MSK / Kafka 集群?

MSK 集群通常都是建在私有子网中的&#xff0c;这给本地访问带来了很多麻烦&#xff0c;特别是需要在本地使用 Kafka GUI 客户端管理和读写 MSK 数据的时候。本文会给出一套解决方案。 我们这里讨论的问题有一点特殊性&#xff0c;那就是&#xff1a;由于 MSK 是托管服务&…

在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

JavaFX项目环境配置

Java版本 JDK15 JavaFX版本 JavaFX SDK 17 sdk下载地址https://gluonhq.com/products/javafx/ https://gluonhq.com/products/javafx/ Java FX sdk 版本不要选择22版本 与 jdk15版本不合 编辑器 配置Eclipse JDK15环境 点击Add 第二步新建一个javafx项目 点击next 勾选Ja…

基于SpringBoot+Vue的卓越导师双选系统设计与实现(源码+文档+包运行)

一.系统概述 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;因此传统管理方式就不适合。为了让导师选择信息的管理模式进行升级&#xff0c;也为了更好的维护导师选择信息&#xff0c;卓越导师双选系统的开发运用就显得很有必要。…

打破常规:AI如何帮助从业者规避营销活动风险

人工智能时代&#xff1a;如何利用AI提升营销效果 在当今商界&#xff0c;市场策划活动对于企业来说至关重要&#xff0c;它们不仅可以吸引消费者的注意&#xff0c;还可以扩大企业的市场份额。然而&#xff0c;这些活动本身带来的风险也不容忽视。为了帮助企业在策划活动时做出…

阿里云服务器带宽收费标准——2024年最新公网带宽价格

阿里云服务器的公网带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;…

06_定时器中断

72分频 72MHz 72000000 经过72分频 1000000

HarmonyOS开发实例:【事件的订阅和发布】

介绍 本示例主要展示了公共事件相关的功能&#xff0c;实现了一个检测用户部分行为的应用。具体而言实现了如下几点功能&#xff1a; 1.通过订阅系统公共事件&#xff0c;实现对用户操作行为&#xff08;亮灭屏、锁屏和解锁屏幕、断联网&#xff09;的监测&#xff1b; 2.通…

Navigator.share不生效,请检查是不是https,仅在https中可用

mdn 一定要检查mdn的兼容性&#xff0c;和是否是https&#xff0c;http中是不生效的&#xff0c;但是测试的时候ios Safari可以chrome就不行&#xff0c;但是https就能够稳定运行

英语新概念2-回译法-lesson8

乔桑德斯有着我们镇上最漂亮的花园。附近的每一个人每年都参加“最美花园比赛”&#xff0c;但是每年都是乔赢得比赛。比尔芙丽丝的花园比乔的花园大&#xff0c;但是乔的花园更有趣。他有整洁的小径以及一座木桥架在一个池塘上。我也喜欢花园&#xff0c;但是我不喜欢辛勤劳作…

LeetCode 热题100(python)——1

解题方案 解法一 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i, x in enumerate(nums): # xnums[i]for j in range(i 1, len(nums)): # 枚举 i 右边的 jif x nums[j] target: # 满足要求return [i, j] # 返回两个数的下标# 这…

HarmonyOS实战开发-如何实现文件管理相关的功能。

介绍 本示例主要展示了文件管理相关的功能&#xff0c;使用ohos.multimedia.medialibrary 、ohos.filemanagement.userFileManager 、ohos.fileio 、ohos.file.fs、ohos.app.ability.contextConstant 等接口&#xff0c;实现了增添文件、删除文件、查找指定类型文件文件、复制…