示例:完全控制请求流程
Pingora 提供灵活的 过滤器机制 和 上下文管理,允许你在请求的每个阶段进行自定义操作,实现对请求流程的完全控制。
构建自定义代理
以下示例展示如何构建一个自定义代理服务:
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();
}
`
示例说明
-
前置过滤器
- 打印请求路径
- 在上下文中记录请求开始时间
- 验证身份令牌,未通过返回 401 错误
-
响应过滤器
- 从上下文获取开始时间
- 计算请求耗时并打印
-
完全控制
- 可在每个阶段读取或修改请求与响应
- 支持错误拦截和自定义处理逻辑
使用场景
- 自定义认证和权限控制
- 请求统计和监控
- 动态路由和负载均衡
- 错误处理和自定义响应
通过这种方式,你可以充分利用 Pingora 的 阶段化处理 与 CTX 上下文,实现对 HTTP 请求流程的完全掌控,满足复杂代理需求。
相关内容
- 高级主题 (WIP) 探索 Pingora 的高级特性,包括内部机制、异步运行时、线程模型和自定义扩展。
- 后台服务 学习如何在 Pingora 中配置和运行后台服务,包括定时任务、异步执行和守护进程管理。
- 异步上下文中的阻塞代码 学习如何在 Pingora 异步运行时中处理阻塞代码,确保高并发请求环境下的性能和稳定性。
- 构建 HTTP 代理 学习如何使用 Pingora 构建 HTTP 代理服务,包括基本请求转发、上游配置和自定义过滤器。
- 配置文件 了解 Pingora 的配置文件结构、主要参数及其作用,学习如何为不同场景编写高效、清晰的配置。
- 连接池与复用 学习如何在 Pingora 中使用连接池和连接复用,提高代理服务的性能和资源利用率。