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再逐步增加边界处理
有了可以运行的小接口,再补充输入校验、业务错误和状态码会更容易理解。可以让请求解析、业务处理、数据访问分别承担明确职责。
健康接口返回成功,只说明当前检查覆盖的部分正常。如果希望验证数据库连接,就需要显式执行连接检查;不要把一个固定的成功响应理解为所有依赖都健康。
进一步阅读
下列文档用于延伸阅读,文中示例是围绕具体问题编写的简化示例。