
从2024年三个API趋势中学习,塑造新的一年
在这篇文章中,我们将介绍如何使用 Turso 构建和部署一个基于 Rust 的 REST API 服务。Turso 是一种被称为“边缘的 SQLite”的服务,通过云端托管 SQLite 并提供副本,让您在需要的地方快速访问数据库的本地副本,从而节省读取数据的时间和成本。
这种特性非常适合频繁读取 SQL 数据库的 Web 应用,例如生成大量报告或处理以 GET 请求为主的 Web 服务。
我们将以一个基于 Turso 的 Cat Facts API 服务为例,展示如何实现以下功能:
完整示例代码库可在 GitHub 查看。
Turso 可以通过脚本或 Homebrew 安装:
brew install chiselstrike/tap/turso
安装完成后,验证安装:
turso --version
注册 Turso 服务:
turso auth signup
注册需通过 GitHub 登录并授予权限。完成后,Turso 会生成一个访问令牌,有效期为 7 天,请妥善保存。
创建数据库:
turso db create my-db
进入数据库 shell:
turso db shell my-db
Turso 会提供数据库 URL 和访问令牌,请记录安全。更多信息请参考 Turso 官方文档。
cargo install cargo-shuttle
cargo shuttle init
本教程假设使用 Axum 入门模板。完成后,需要在 Cargo.toml
添加依赖,并将 Turso 数据库 URL 与访问令牌写入项目根目录下的 Secrets.toml
:
[default]
DATABASE_URL = "your-turso-database-url"
API_TOKEN = "your-turso-api-token"
服务包含两部分:
在 main
函数中添加:
sqlx::query!(
"CREATE TABLE IF NOT EXISTS CatFacts (id INTEGER PRIMARY KEY, fact TEXT NOT NULL)"
).execute(&pool).await?;
这会在数据库中创建表格,如果已存在则不会重复创建。
使用 AppState
管理全局状态,包括数据库连接:
struct AppState {
db_client: Arc<Mutex<SqlitePool>>,
}
需要实现以下路由:
示例获取趣闻路由:
async fn get_fact(state: Arc<AppState>) -> impl IntoResponse {
// 从数据库中获取随机猫咪趣闻
}
将路由注册到 Axum,并在 main
启动服务。
后台任务功能:每天定时向订阅者发送猫咪趣闻。
任务逻辑:
示例代码:
async fn send_subscriber_mail(state: Arc<AppState>) {
// 获取订阅者和猫咪趣闻,并发送邮件
}
通过 tokio::select!
宏实现后台任务与 Web 服务并行运行。
完成开发后,使用 Shuttle 部署:
cargo shuttle deploy
部署成功后,可通过终端提供的 URL 访问 Web 服务。
本文展示了如何使用 Turso 与 Shuttle 构建 Rust REST API 服务。进一步扩展可考虑:
完整示例代码库:GitHub
原文链接: https://www.shuttle.dev/blog/2023/07/28/turso-shuttle-integration-cats-api