通过 Docker 部署 GraphQL 微服务的实践

GraphQL 是一种用于构建 API 的查询语言和运行时环境。它可以为前端应用提供更加灵活且高效的数据获取方式,从而提高应用的响应速度和用户体验。为了更加高效地开发和部署 GraphQL 微服务,我们可以通过 Docker 进行部署。

Docker 简介

Docker 是一种开源的容器化平台,可以轻松地创建、部署和运行应用程序。通过 Docker,我们可以在容器中运行一个或多个服务,并且可以在不同的环境中使用相同的容器映像,从而实现类似一次构建,随处部署的效果。

GraphQL 微服务架构

GraphQL 微服务的架构通常由以下三个组件组成:

  • GraphQL Server:处理 GraphQL 查询和变异,并与数据源进行交互。
  • 数据源:任何可能的数据源,如数据库、API 和其他服务。
  • 前端应用:用于发起请求和接收响应的应用程序。

为了更好地展示 GraphQL 微服务的结构和部署过程,我们这里将以一个简单的图书管理系统为例。

如上图所示,我们的图书管理系统由以下几个组件组成:

  • GraphQL Server:处理前端发出的 GraphQL 查询和变异,并且和数据源进行交互。
  • 数据源:我们使用 MySQL 数据库储存书籍信息。
  • 前端应用:用于向 GraphQL 服务器发出请求,获取并显示图书信息。

Docker 部署 GraphQL 微服务

1. 创建 Dockerfile 文件

在本项目的根目录下创建一个名为 Dockerfile 的文件,可以使用以下代码:

---- -------

------- ----

---- ------------- --

--- --- -------

---- - -

------ ----

--- - ------ ------- -

上述 Dockerfile 文件使用的是 Node.js 的镜像,指令解析如下:

  • FROM node:14:使用 Node.js 的版本 14 镜像。
  • WORKDIR /app:在容器中创建一个名为 /app 的目录,并把后续指令的工作目录设置为 /app。
  • COPY package*.json ./:将 package.json 和 package-lock.json 文件复制到 /app 目录下。
  • RUN npm install:在容器中安装依赖。
  • COPY . .:将当前目录的所有文件复制到容器的 /app 目录下。
  • EXPOSE 4000:容器运行时的开放端口。
  • CMD [ "npm", "start" ]:当容器启动时要运行的命令。

2. 构建 Docker 镜像

在项目根目录下打开命令终端,输入以下代码构建 Docker 镜像:

------ ----- -- --------------------- -

其中,. 表示要构建镜像的当前目录,graphql-microservices 是镜像的名称。

3. 运行 Docker 容器

在项目根目录下打开命令终端,输入以下代码启动 Docker 容器:

------ --- -- ------ --------------------- -- --------- ---------------------

其中,-d 表示容器以后台模式运行,--name 指定容器的名称,-p 表示将 Docker 容器的 4000 端口映射到本地的 4000 端口,graphql-microservices 表示要运行的镜像名称。

4. 访问 GraphQL Server

现在我们可以在浏览器中访问 http://localhost:4000/graphql 查看 GraphQL Server,此时应该会得到以下输出:

----------------------------- ------ ---------- -------------------------------------------

这是因为我们还没有定义 GraphQL 的查询语句和数据源,接下来我们将对其进行修改。

5. 实现 GraphQL 查询和数据源

首先,我们需要在服务器端代码中定义 GraphQL 的查询语句和数据源。

----- ------- - -------------------
----- - ----------- - - ---------------------------
----- - ----------- - - -------------------
----- ----- - -----------------

----- ------ - -------------
  ---- ---- -
    --- ---
    ----- ------
    ------- ------
  -

  ---- ----- -
    ------ ------
  -
---

----- ---------- - ------------------------
  ----- ------------------
  ----- ----------------------
  --------- ----------------------
  --------- ----------------------
---

----- --- - ----------

--------
  -----------
  -------------
    ------- -------
    ---------- -
      ------ -- -- -
        ------ --- ----------------- ------- -- -
          ------------------------ - ---- ------- ------- -------- -- -
            -- ------- -
              --------------
            - ---- -
              -----------------
            -
          ---
        ---
      --
    --
    --------- -----
  --
--

-----------------

上述代码定义了一个 Book 类型,它有三个字段:id、name 和 author。接着,我们定义了一个 Query 类型,它有一个名为 books 的查询方法,返回一个包含了所有书籍信息的数组。

GraphQL 服务器和 MySQL 数据库之间的连接使用 mysql.createConnection 方法建立。我们需要将其中的 your-mysql-hostyour-mysql-usernameyour-mysql-passwordyour-mysql-database 替换为与 MySQL 数据库相关联的正确值。

现在,我们可以在浏览器中访问 http://localhost:3000/graphql 了。通过点击页面右上角的 run 按钮,我们可以查询到 MySQL 数据库中的所有书籍信息。

6. 修改 Dockerfile 文件

为了使我们的代码不直接依赖于本地 MySQL 数据库,我们需要修改 Dockerfile 文件。我们将使用环境变量来传递 MySQL 数据库的链接信息。

---- -------

------- ----

---- ------------- --

--- --- -------

---- - -

------ ----

--- ---------- ---------
--- ---------- ----
--- -------------- --------
--- -------------- ------

--- - ------ ------- -

上述 Dockerfile 文件添加了四行环境变量,我们需要将其中的 localhostrootpasswordbookdb 替换为与 MySQL 数据库相关联的正确值。

我们还需要在服务器端代码中通过 process.env 来获取这些环境变量的值。

----- ------- - -------------------
----- - ----------- - - ---------------------------
----- - ----------- - - -------------------
----- ----- - -----------------

----- ------ - -------------
  ---- ---- -
    --- ---
    ----- ------
    ------- ------
  -

  ---- ----- -
    ------ ------
  -
---

----- ---------- - ------------------------
  ----- -----------------------
  ----- -----------------------
  --------- ---------------------------
  --------- ---------------------------
---

----- --- - ----------

--------
  -----------
  -------------
    ------- -------
    ---------- -
      ------ -- -- -
        ------ --- ----------------- ------- -- -
          ------------------------ - ---- ------- ------- -------- -- -
            -- ------- -
              --------------
            - ---- -
              -----------------
            -
          ---
        ---
      --
    --
    --------- -----
  --
--

-----------------

最后,我们可以通过相同的步骤重新构建 Docker 镜像并启动容器,然后在浏览器中访问 http://localhost:4000/graphql。现在可以查询包含了 MySQL 数据库中所有书籍信息的 GraphQL 微服务了。

总结

我们通过 Docker 部署了 GraphQL 微服务,并使用环境变量将代码解耦合。Docker 的出现极大地简化了开发和部署的工作,使开发人员能够快速打包和测试应用程序,而无需关注所在操作系统和运行环境的差异性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/648d2ea748841e9894b7b64c


猜你喜欢

  • Mocha 取整错误导致测试失败的解决方案

    前言 作为前端开发人员,我们经常会使用到 Mocha 这个测试框架。Mocha 是一个 JavaScript 的测试框架,它可以在浏览器和 Node.js 上运行。

    1 年前
  • Redis 主从复制的原理与实现方法

    简介 Redis 是一款高性能的 in-memory 数据库,常用于缓存、消息队列等场景。而 Redis 的主从复制功能,可以将主节点的数据复制到从节点,实现数据的灾备备份、读写分离等功能。

    1 年前
  • 解决 React Redux 中单向数据流导致渲染效率低的问题

    在 React Redux 应用中,由于数据的单向流动,每一次修改 store 中的数据都会触发整个应用重新渲染。这样会导致渲染效率低下,尤其是在应用比较复杂、数据量较大的时候。

    1 年前
  • 最佳实践:如何使用 LESS 编写低代码量的响应式布局

    响应式布局是现代 web 开发的重要组成部分,它使得网站在不同终端上显示良好并提供优秀的用户体验。然而,使用传统的 CSS 对响应式布局进行编写往往需要大量的代码,因此我们需要一种更加高效的方式来实现...

    1 年前
  • Socket.io 传输大量数据卡顿解决方案

    简介 Socket.io 是一个用于实现实时、双向、事件驱动的数据传输的 JavaScript 库。它允许客户端和服务器之间进行实时通信,例如聊天、游戏、智能家居等领域。

    1 年前
  • 关于 Custom Elements 详情页的最佳实践

    前言 Custom Elements 是 Web Components 规范中的一部分,它允许开发者自定义 HTML 元素,这些自定义元素可以像原生 HTML 元素一样被使用和操作。

    1 年前
  • Web Components 如何避免代码重复?

    在前端开发中,我们经常会遇到代码重复的情况,特别是在构建复杂的应用程序时。Web Components 是一种用于构建可重用组件的新技术,它可以帮助我们减少代码重复并提高代码的可维护性。

    1 年前
  • RESTful API 架构中的负载均衡技术探讨

    在大流量 Web 应用的架构设计中,负载均衡是一个不可避免的问题。特别是在 RESTful API 架构中,优秀的负载均衡方案能够保证系统的高可用和高性能。本文将探讨 RESTful API 架构中的...

    1 年前
  • Next.js 中如何使用步骤条组件?

    随着 Web 应用程序越来越复杂,步骤条组件已经成为了 Web 开发中的重要组成部分之一。在 Next.js 中,我们可以使用许多步骤条组件来帮助我们更好地组织和管理我们的界面。

    1 年前
  • ES10 带来的全新功能,动态直接获取属性与方法的 API

    ES10 带来的全新功能,动态直接获取属性与方法的 API ES10(也称为 ECMAScript 2019)是 JavaScript 的最新版本,带来了许多新的功能和改善。

    1 年前
  • Docker 如何管理多个容器之间的通信?

    Docker 是现今流行的容器化技术,它可以帮助我们快速的构建、部署和管理应用程序。在构建一个完整的应用程序时,可能需要多个容器之间进行通信,但是容器之间是隔离的,如何管理容器之间的通信呢? 本文将介...

    1 年前
  • 用 JQuery 实现响应式图片轮播效果

    在现代网站的设计中,响应式图片轮播效果已经成为了一个不可或缺的组件。通过合理运用 JQuery,我们可以非常方便地实现这个特效。本文将介绍如何使用 JQuery 实现响应式图片轮播效果。

    1 年前
  • Angular 中的样式绑定及其应用

    在 Angular 中,样式绑定是一种非常常用的技术。它允许我们根据模型的数据,动态地修改 DOM 元素的样式。这种技术非常实用,可以用在很多场景中,比如实现表单验证、交互效果等。

    1 年前
  • 使用 Node.js 和 Gulp 实现自动化构建的方法

    在前端开发中,自动化构建是必不可少的。它能够自动完成诸如将 Sass 编译成 CSS、压缩 JavaScript 等繁琐的任务,大大提高了效率。本文将介绍如何使用 Node.js 和 Gulp 实现自...

    1 年前
  • AngularJS SPA 项目开发中遇到 401 错误的解决方案

    近年来,单页面应用(Single Page Application, SPA)在 Web 开发中已经逐渐成为主流。无论是大型企业应用还是小型网站,都需要通过前端技术完成 SPA 的实现。

    1 年前
  • Vue.js 2.0 中如何使用 filters 过滤器

    在 Vue.js 2.0 中,filters 过滤器是一个非常实用的功能,它可以对数据进行处理和格式化,使得数据的呈现更加直观、易读和美观。filters 过滤器的使用简单且流畅,可以通过自定义 fi...

    1 年前
  • ES6 的 Promise 对象直接使用 async/await

    在现代 Web 应用中,JavaScript 扮演了越来越重要的角色。而 ES6 所带来的重大变革,使得我们能够更加高效地编写 JavaScript 代码。其中,Promise 对象和 async/a...

    1 年前
  • 使用 Express.js 构建 RESTful API 的详细步骤

    在现代的 Web 应用开发中,构建 RESTful API 已经成为了开发的标配。RESTful API 的好处在于它的简单易用性,能够实现前后端分离,开发效率高并具有良好的可扩展性。

    1 年前
  • SASS 中的变量作用域及其用法

    在前端开发中,CSS 是不可或缺的一部分,而 SASS 是 CSS 的一种预处理语言。SASS 以其高度的灵活性和可重用性而受到广泛的欢迎,而变量是 SASS 中非常基础和核心的部分,也是用来定义和代...

    1 年前
  • MongoDB 在大规模数据处理方面的应用

    在现代 Web 应用中,数据是不可避免的。随着数据量的增长,传统的关系数据库不再能够胜任大规模数据处理的任务,如处理海量日志、大规模的用户数据或 IoT 数据等。MongoDB 作为一种 NoSQL ...

    1 年前

相关推荐

    暂无文章