教程 pingora tutorial

示例:完全控制请求流程

Pingora 提供灵活的 过滤器机制 和 上下文管理,允许你在请求的每个阶段进行自定义操作,实现对请求流程的完全控制。

构建自定义代理

以下示例展示如何构建一个自定义代理服务:

rust
use pingora::prelude::*;

fn pre_filter(req: &Request, ctx: &mut Context) -> Result<(), Error> {
    println!("请求路径: {}", req.path());
    ctx.insert("start_time", std::time::Instant::now());
    
    // 简单身份验证
    if !req.headers().contains_key("X-Auth-Token") {
        return Err(Error::new("未授权访问", 401));
    }

    Ok(())
}

fn response_filter(_req: &Request, ctx: &mut Context) -> Result<(), Error> {
    if let Some(start) = ctx.get::<std::time::Instant>("start_time") {
        let duration = start.elapsed();
        println!("请求耗时: {:?}", duration);
    }
    Ok(())
}

#[tokio::main]
async fn main() {
    let mut server = Server::new(None).unwrap();
    server.bootstrap();

    let mut app = http_proxy_service(None);
    app.add_filter(pre_filter);          // 前置过滤器
    app.add_filter_at_stage(FilterStage::Response, response_filter); // 响应过滤器

    server.run_forever(app).unwrap();
}

`

示例说明

  1. 前置过滤器

    • 打印请求路径
    • 在上下文中记录请求开始时间
    • 验证身份令牌,未通过返回 401 错误
  2. 响应过滤器

    • 从上下文获取开始时间
    • 计算请求耗时并打印
  3. 完全控制

    • 可在每个阶段读取或修改请求与响应
    • 支持错误拦截和自定义处理逻辑

使用场景

  • 自定义认证和权限控制
  • 请求统计和监控
  • 动态路由和负载均衡
  • 错误处理和自定义响应

通过这种方式,你可以充分利用 Pingora 的 阶段化处理 与 CTX 上下文,实现对 HTTP 请求流程的完全掌控,满足复杂代理需求。