基于 tide + async-graphql + mongodb 构建 Rust 异步 GraphQL 服务(1)- 起步及 crate 选择

本系列博客中,我们使用 Tide + async-grapqhl + mongodb + jsonwebtoken + handlebars-rust 构建基于 Rust 技术栈的 GraphQL 服务,我们需要做到前后端分离。

需要说明的是:本博客即采用前述 Rust 技术栈搭建,目前仍然处于开发阶段。

  1. 后端主要提供 GraphQL 服务,使用到的 crate 包括:tideasync-graphql、jsonwebtoken、mongodb/bson、serde、ring、base64,以及 pinyin 等。
  2. 前端主要 WEB 应用服务,使用到 crate 包括:tiderhai、surf、graphql_client、handlebars-rust、cookie 等。

Rust 环境的配置,cargo 工具的使用,以及 Rust 程序设计语言和 GraphQL 的介绍和优势,在此不在赘述。您可以参阅如下资料学习 Rust 程序设计语言,以及 Rust 生态中的 GraphQL 实现。

其它概念性、对比类的内容,请您自行搜索。

工程的创建

文章的开始提到,我们要做到前后端分离。因此,前、后端需要各自创建一个工程。同时,我们要使用 cargo 对工程进行管理和组织。

  • 首先,创新本次工程根目录和 cargo 清单文件
mkdir rust-graphql
cd ./rust-graphql

touch Cargo.toml 

Cargo.toml 文件中,填入以下内容:

[workspace]
members = [
  "./backend",
  "./frontend",
]

文件中,workspace 是 cargo 中的工作区。cargo 中,工作区共享公共依赖项解析(即具有共享 Cargo.lock),输出目录和各种设置,如配置文件等的一个或多个包的集合。

虚拟工作区是 Cargo.toml 清单中,根目录的工作空间,不需要定义包,只列出工作区成员即可。

上述配置中,包含 2 个成员 \backend\\ 和 \frontend\\,即我们需要创建 2 个工程(请注意您处于 rust-graphql 目录中):前端和后端 —— 均为二进制程序,所以传递 --bin 参数,或省略参数。

cargo new backend --bin
cargo new frontend --bin

创建后,工程结构如下图所示——

工程结构

现在,工程已经创建完成了。

工具类 crate 安装

工程创建完成后,我们即可以进入开发环节了。开发中,一些工具类 crate 可以起到“善其事”的作用,我们需要先进行安装。

  • cargo-edit,包含 cargo addcargo rm,以及 cargo upgrade,可以让我们方便地管理 crate。
  • cargo-watch,监视项目的源代码,以了解其更改,并在源代码发生更改时,运行 Cargo 命令。

好的,我们安装这 2 个 crate。

cargo install cargo-edit
cargo install cargo-watch

安装依赖较多,如果时间较长,请配置 Rust 工具链的国内源

添加依赖 crate

接着,我们需要添加开发所需依赖项。依赖项的添加,我们不用一次性全部添加,我们根据开发需要,一步步添加。首先,从后端工程开始。

后端工程中,我们提供 GraphQL 服务,需要依赖的基本 crate 有 tide、async-std、async-graphql、mongodb,以及 bson。我们使用 cargo add 命令来安装,其将安装最新版本。

cd backend
cargo add tide async-std async-graphql mongodb bson

安装依赖较多,如果时间较长,请配置 Cargo 国内镜像源

执行上述命令后,rust-graphql/backend/Cargo.toml 内容如下所示——

...
[dependencies]
async-graphql = "2.6.0"
async-std = "1.9.0"
bson = "1.2.0"
mongodb = "1.2.0"
tide = "0.16.0"
...

至此,我们构建基于 Rust 技术栈的 Graphql 服务的后端基础工程已经搭建完成。暂时休息一会,我们开始构建一个最基本的 GraphQL 服务器。

谢谢您的阅读。