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 镜像:
docker build -t graphql-microservices .
其中,.
表示要构建镜像的当前目录,graphql-microservices
是镜像的名称。
3. 运行 Docker 容器
在项目根目录下打开命令终端,输入以下代码启动 Docker 容器:
docker run -d --name graphql-microservices -p 4000:4000 graphql-microservices
其中,-d
表示容器以后台模式运行,--name
指定容器的名称,-p
表示将 Docker 容器的 4000 端口映射到本地的 4000 端口,graphql-microservices
表示要运行的镜像名称。
4. 访问 GraphQL Server
现在我们可以在浏览器中访问 http://localhost:4000/graphql 查看 GraphQL Server,此时应该会得到以下输出:
{"errors":[{"message":"Syntax Error: Unexpected EOF","locations":[{"line":1,"column":1}]}]}
这是因为我们还没有定义 GraphQL 的查询语句和数据源,接下来我们将对其进行修改。
5. 实现 GraphQL 查询和数据源
首先,我们需要在服务器端代码中定义 GraphQL 的查询语句和数据源。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ----------- - - ------------------- ----- ----- - ----------------- ----- ------ - ------------- ---- ---- - --- --- ----- ------ ------- ------ - ---- ----- - ------ ------ - --- ----- ---------- - ------------------------ ----- ------------------ ----- ---------------------- --------- ---------------------- --------- ---------------------- --- ----- --- - ---------- -------- ----------- ------------- ------- ------- ---------- - ------ -- -- - ------ --- ----------------- ------- -- - ------------------------ - ---- ------- ------- -------- -- - -- ------- - -------------- - ---- - ----------------- - --- --- -- -- --------- ----- -- -- -----------------展开代码
上述代码定义了一个 Book 类型,它有三个字段:id、name 和 author。接着,我们定义了一个 Query 类型,它有一个名为 books 的查询方法,返回一个包含了所有书籍信息的数组。
GraphQL 服务器和 MySQL 数据库之间的连接使用 mysql.createConnection
方法建立。我们需要将其中的 your-mysql-host
、your-mysql-username
、your-mysql-password
和 your-mysql-database
替换为与 MySQL 数据库相关联的正确值。
现在,我们可以在浏览器中访问 http://localhost:3000/graphql 了。通过点击页面右上角的 run 按钮,我们可以查询到 MySQL 数据库中的所有书籍信息。
6. 修改 Dockerfile 文件
为了使我们的代码不直接依赖于本地 MySQL 数据库,我们需要修改 Dockerfile 文件。我们将使用环境变量来传递 MySQL 数据库的链接信息。
-- -------------------- ---- ------- ---- ------- ------- ---- ---- ------------- -- --- --- ------- ---- - - ------ ---- --- ---------- --------- --- ---------- ---- --- -------------- -------- --- -------------- ------ --- - ------ ------- -展开代码
上述 Dockerfile 文件添加了四行环境变量,我们需要将其中的 localhost
、root
、password
和 bookdb
替换为与 MySQL 数据库相关联的正确值。
我们还需要在服务器端代码中通过 process.env
来获取这些环境变量的值。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - ----------- - - ------------------- ----- ----- - ----------------- ----- ------ - ------------- ---- ---- - --- --- ----- ------ ------- ------ - ---- ----- - ------ ------ - --- ----- ---------- - ------------------------ ----- ----------------------- ----- ----------------------- --------- --------------------------- --------- --------------------------- --- ----- --- - ---------- -------- ----------- ------------- ------- ------- ---------- - ------ -- -- - ------ --- ----------------- ------- -- - ------------------------ - ---- ------- ------- -------- -- - -- ------- - -------------- - ---- - ----------------- - --- --- -- -- --------- ----- -- -- -----------------展开代码
最后,我们可以通过相同的步骤重新构建 Docker 镜像并启动容器,然后在浏览器中访问 http://localhost:4000/graphql。现在可以查询包含了 MySQL 数据库中所有书籍信息的 GraphQL 微服务了。
总结
我们通过 Docker 部署了 GraphQL 微服务,并使用环境变量将代码解耦合。Docker 的出现极大地简化了开发和部署的工作,使开发人员能够快速打包和测试应用程序,而无需关注所在操作系统和运行环境的差异性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648d2ea748841e9894b7b64c