一个基于 Pingora 的轻量 sidecar 骨架,支持 HTTP 与 gRPC(h2)转发,使用 TOML 作为配置。
- 入站:HTTP/1.1 与 HTTP/2(支持 gRPC-h2c)
- 出站:按路由前缀/ gRPC 前缀选择上游集群
- 负载均衡:简单轮询
- 拦截器骨架:请求阶段与上游阶段的回调占位(可扩展 ACL、限流、熔断、指标)
参考项目根目录的 sidecar.toml:
[inbound_http]
addr = "0.0.0.0:8080"
# 可选:独立 gRPC 端口(也可以不配,直接走 8080)
# [inbound_grpc]
# addr = "0.0.0.0:8081"
[[routes]]
name = "http_api"
prefix = "/api/"
cluster = "backend_http"
[[routes]]
name = "grpc_helloworld"
# gRPC 的 path 形如 /package.Service/Method
grpc_prefix = "/helloworld.Greeter/"
cluster = "backend_grpc"
[[clusters]]
name = "backend_http"
endpoints = ["127.0.0.1:9000"]
lb_policy = "round_robin"
tls = false
[[clusters]]
name = "backend_grpc"
endpoints = ["127.0.0.1:50051"]
lb_policy = "round_robin"
tls = false- 路由匹配顺序:先匹配
grpc_prefix,再匹配prefix。 - gRPC 识别:HTTP/2 且
content-type以application/grpc开头。
- 先确保本地有 Rust 工具链(1.74+),macOS 下无需 OpenSSL(当前未启用 TLS)。
- 可选:通过环境变量指定配置文件路径
SIDECAR_CONFIG。
# 构建
cargo build
# 运行(默认读取 ./sidecar.toml)
RUST_LOG=info cargo run
# 或自定义配置路径
SIDECAR_CONFIG=./my-sidecar.toml RUST_LOG=debug cargo runsrc/config.rs:TOML 配置结构与校验、端点解析src/proxy.rs:SidecarProxy实现ProxyHttp,包含路由、负载均衡与拦截回调src/main.rs:初始化日志、加载配置、创建 PingoraServer与监听服务
- 访问控制(ACL):在
request_filter中读取白名单/黑名单规则并拒绝请求 - 限流:在
request_filter或proxy_upstream_filter加入令牌桶/漏桶,实现 QPS/并发控制 - 熔断:对端点的错误率做滑窗统计,自动摘除异常实例(可扩展到
cluster_endpoints的动态更新) - 动态路由:结合配置热更新(通知/轮询),替换
SidecarConfig的Arc即可生效 - 指标:在
logging阶段记录成功/失败与时延,暴露 Prometheus 端点(可通过Service::prometheus_http_service()新增 admin 监听)
- gRPC 无 TLS(h2c)可直接透传;若需要 TLS/ALPN,请为
pingora启用openssl/boringssl/rustlsfeature,并配置监听与上游 TLS 参数。