96SEO 2026-06-20 08:06 3
先聊聊啥是 Axum,干嘛用的
说实话,Axum 就是 Rust 里那颗新星,专门干异步 Web 的。
它靠 Tokio 打底,靠 Tower-HTTP 搞中间件,听起来高大上。

但其实上手也不难,跟写普通函数差不多。
哈哈,你别怕,这玩意儿比 Actix 那套宏要清爽得多。
准备工作:依赖、环境、心态先装好 Rust,建议用 nightly。
然后在 Cargo.toml 加几行:
axum = { version = "0.7", features = }
tokio = { version = "1", features = }
tower-http = { version = "0.4", features = }
serde = { version = "1", features = }
serde_json = "1"
tracing-subscriber = { version = "0.3", features = }
别忘了运行 cargo build 把依赖拉下来。
下面这段代码就是Zui基础的例子,我把它塞进 src/main.rs。
use anyhow::Result;
use axum::{Router, routing::get};
use tokio::net::TcpListener;
// 根路由处理函数:异步函数,返回字符串
async fn root_handler -> &'static str {
"Hello, Axum!"
}
#
async fn main -> Result<> {
tracing_subscriber::fmt::init;
// 构建路由:将 GET 请求 / 映射到 root_handler
let app = Router::new.route);
// 启动服务器
let listener = TcpListener::bind.await?;
axum::serve.await?;
Ok)
}
保存后 cargo run,打开浏览器敲 http://127.0.0.1:3000/,kan到 “Hello, Axum!” 就算成功啦。
Axum Zui大的亮点之一,就是各种提取器。比如想拿 Query 参数:
use axum::{extract::Query, routing::get, Json, Router};
use serde::Deserialize;
#
struct Pagination {
page: u64,
limit: u64,
}
// 提取查询参数
async fn user_list: Query) -> String {
let offset = * pagination.limit;
format!
}
#
async fn main -> anyhow::Result<> {
tracing_subscriber::fmt::init;
let app = Router::new.route);
let listener = tokio::net::TcpListener::bind.await?;
axum::serve.await?;
Ok)
}
再说 JSON 请求体:
use axum::{extract::Json, routing::post, Router};
use serde::Deserialize;
#
struct CreateUserRequest {
username: String,
email: String,
age: Option,
}
// 自动把 JSON 反序列化成结构体
async fn create_user: Json) -> String {
format! 年龄{:?}", payload.username, payload.email, payload.age)
}
#
async fn main -> anyhow::Result<> {
tracing_subscriber::fmt.init;
let app = Router::<_>::new.route);
let listener = tokio::net::TcpListener::bind.await?;
axum::serve.await?;
Ok)
}
全局状态——共享数据库连接池之类的玩意儿
项目里常常要共享资源,这时候就用 State 提取器。
use std::{sync::{Arc, Mutex}, net::SocketAddr};
use axum::{Router, routing::get, extract::State};
#
struct AppState {
counter: Arc,
}
// 每次请求dou把计数器+1
async fn incr_counter: State) -> String {
let mut cnt = state.counter.lock.unwrap;
*cnt += 1;
format!
}
#
async fn main -> anyhow::Result<> {
tracing_subscriber::fmt.init;
let shared_state = AppState { counter: Arc:new) };
let app = Router::<_>::new
.route)
.with_state;
let listener= tokio::net::
TcpListener::
bind.
await?;
axum::
serve(listener,
app).
await?;
Ok)
}
中间件——统一拦截、日志、限流……随便搞
Axum 本身不写中间件,它直接借 Tower 的生态。
CORS、日志、压缩,douNeng一层层叠加。
CORS 中间件示例use tower_http::{
cors::{CorsLayer},
trace::{TraceLayer}
};
let cors_layer= CorsLayer::
permissive; // 开发阶段直接放行
let trace_layer= TraceLayer::
new_for_http;
let app= Router::<_>::new
.route)
.layer
.layer;
自定义日志中间件——记录请求耗时
use std::{
future::{Future},
pin::
Pin,
task::{
Context,Poll
},
time::
Instant
};
use tower::{Service, Layer};
#
struct TimingLayer;
impl Layer for TimingLayer{
type Service=S;
fn layer->Self::
Service{
TimingService{inner}
}}
#
struct TimingService{
inner:S,
}
implS:
Service<&Req>
for TimingServicewhe
re S:
Service,
S:
Future+Send+'static{
type Response=S::
Response;
type Error=S::
Error;
type Future=Pin+Send>;
fn poll_ready
->Poll{
self.inner.poll_ready
}
fn call(&mut self,
req:Req)->Self::
Future{
let start=
Instant::
now;
let fut=self.inner.
call;
Box:::pin(async move{
let res=fut.await;
println!);
res})
}
}
路由嵌套——让大型项目结构geng清晰
A、B 两套接口,各自独立,又要挂在同一个服务上,这时候就 nest。
let user_router=
Router::<_>::new
.route)
.route);
let article_router=
Router::<_>::new
.route);
let app=Router::<_>::new
.nest
.nest("/article",
article_router);
路径参数随手抓——顺手又安全
/books/:isbn 那种,用 Path 提取器就行了。
async fn book_detail(
Path:
Path)
-> String{
format!
}
"为什么百度不收录"?来聊聊 SEO 小坑儿吧
* 为什么百度不收录我的 Axum 项目? *
A:可Neng是因为没有 robots.txt 或者页面返回太快没给爬虫留时间。
B:还有一点,是服务器返回的 Header 没有设置 Content-Type,让搜索引擎摸不着头脑。
C:Zui关键的是没有Zuo好 Sitemap。别忘了生成 XML sitemap 并在站点根目录放一个 sitemap.xml.
Axe—小结 & 心得感悟说实话,我Zui喜欢 Axum 的地方就是「类型安全」和「零宏侵入」。写完路由编译报错,那叫一个直观!你不用等到运行时才发现 bug。
再加上 Tokio 的 async/await,让并发代码像同步一样易读。害,你想想那种每秒处理几万请求的场景,是不是hen爽?哈哈哈。
常见坑 & 小技巧
• #提取器顺序: 元数据提取器必须放前面请求体提取器只Neng放Zui后因为请求体只Neng读一次。否则会报 “body already extracted”。
• #错误处理: 不要直接 panic,用 或者自定义错误类型实现 .
• #调试技巧: #debug_handler Neng帮你快速定位提取器类型冲突。咱就是说用一次就够了不要滥用。
• #日志: Neng自动打印请求路径、状态码和耗时。配合 env_logger,就算在生产环境也Neng追踪异常。
• #连接池: Ru果你用了 SQLx 或 SeaORM,把连接池放进 State,然后在每个 handler 里 clone 一下即可,无需担心线程安全问题,因为内部Yi经用了 Arc + Mutex/Pool 实现。
• #热geng新: 开发阶段Ke以配合 cargo-watch 实现文件改动自动重启,提高效率。只要装好 watch,然后跑 cargo watch -x run .
•
•
•
•
Epilogue – 给自己一点鼓励吧!🤗Crap,你Yi经把 Axum 从 Hello World 带到完整的中间件链路、状态共享和路由嵌套了!别忘了多练多写才是真本事。
Ru果哪天你真的上线了一条超高速 API,记得回来kan这篇文章给自己点个赞,然后继续玩转 Rust 的生态系统吧!说实话,这条路走下来会hen爽,你懂的~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback