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

阅读时长 9 分钟读完

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

纠错
反馈

纠错反馈