← 返回文章列表
后端开发

用 Rust 和 Axum 写一个清晰的小接口

从一个健康检查接口出发,理解路由、处理函数与响应之间的关系。

01从最小的职责开始

一个接口可以先只负责一件事情:接收请求,返回约定的结果。健康检查适合作为起点,因为它的输入少、响应简单,也容易通过浏览器或命令行检查。

在 Axum 中,路由用于把路径和请求方法关联到处理逻辑。响应则可以直接使用 Json 这样的类型表达,减少重复的序列化代码。

02把路由和响应连接起来

以下示例使用 Axum 0.8、Tokio 运行时和 serde_json。Cargo.toml 中需要添加这三个依赖,并为 Tokio 开启运行时相关特性,例如 full。

启动后访问本机 /health,可以得到一个 JSON 响应。这里监听回环地址,部署时应根据反向代理和容器网络的安排选择绑定地址。

RUST
use axum::{routing::get, Json, Router};
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let app = Router::new().route(
        "/health",
        get(|| async { Json(json!({ "status": "ok" })) }),
    );

    let listener = tokio::net::TcpListener::bind(
        "127.0.0.1:3000",
    ).await?;
    axum::serve(listener, app).await?;
    Ok(())
}

03再逐步增加边界处理

有了可以运行的小接口,再补充输入校验、业务错误和状态码会更容易理解。可以让请求解析、业务处理、数据访问分别承担明确职责。

健康接口返回成功,只说明当前检查覆盖的部分正常。如果希望验证数据库连接,就需要显式执行连接检查;不要把一个固定的成功响应理解为所有依赖都健康。

进一步阅读

下列文档用于延伸阅读,文中示例是围绕具体问题编写的简化示例。