从 Axum / Actix 迁移
思维模型转变
| Axum/Actix 思维 | rust-webx 思维 | |----------------|-----------------| | 路由是中心 | Request 是中心 | | 手动组装一切 | 框架提供应用骨架 | | 函数即处理器 | Handler struct + trait | | 自由风格 | 约定分层 |
路由迁移
Axum
Router::new()
.route("/api/users/:id", get(get_user))
.route("/api/users", post(create_user))
rust-webx
// 无需中央路由表,每个端点自声明
#[get("/api/users/{id}")]
impl IRequest<UserDto> for GetUserRequest {}
#[post("/api/users")]
impl IRequest<UserDto> for CreateUserRequest {}
中间件迁移
Axum
let app = Router::new()
.layer(TraceLayer::new_for_http())
.layer(CorsLayer::permissive());
rust-webx
Host::builder()
.use_cors(CorsConfig::default())
// RequestTracing 自动启用
.build()
自定义 Axum middleware 需改写为 `impl IMiddleware`。
状态共享
Axum
#[derive(Clone)]
struct AppState {
db: Arc<DbPool>,
}
rust-webx
// 通过 DI 容器管理,无需 AppState
#[inject]
pub struct GetUserHandler {
db: Arc<DbPool>,
}
错误处理
Axum
async fn get_user(id: String) -> Result<Json<User>, AppError> {
...
}
rust-webx
async fn handle(&self, req: GetUserRequest) -> Result<UserDto> {
// Error 自动映射 HTTP 状态码
}
何时保留 Axum
- 已有大量 Axum 代码且运行良好 - 需要 Axum 生态特定功能(如 axum-extra) - 极简微服务,不需要 DI/Mediator
渐进式迁移策略
1. 新端点用 rust-webx 编写 2. 旧 Axum 路由通过反向代理共存 3. 逐步将旧端点改写为 Request + Handler 4. 最终统一为 rust-webx Host
小结
从 Axum 迁移的核心是接受「约定」换取「工程化」,减少自行拼装的工作量。
下一节:[概念对照表](concept-mapping.md)