高性能 HTTP Cache Proxy · Go

Tavern
面向现代边缘的缓存代理

Tavern 由 Go 实现,基于 Kratos 框架,提供灵活可插拔的缓存代理能力。它内置存储抽象、插件系统、观测与平滑升级,帮助你快速构建稳定的边缘加速或网关缓存服务。

核心能力
Prefetch · Vary Cache · Range
运维
Graceful Reload · Metrics · PProf

一分钟快速认知

Tavern 适合以下场景:

  • 作为边缘或网关后的的 HTTP 缓存层,减少回源压力
  • 需要按 Header/Vary 做版本化缓存、多 Range 断点续传
  • 需要插件化的路由、鉴权、校验或重写逻辑
  • 希望运维友好:平滑升级、丰富监控、低成本调试

默认配置即可运行;通过 YAML 调整存储桶、上游、缓存策略和中间件。支持在 Linux/macOS 上零停机热重启。

缓存强化

Prefetch、Auto Refresh、Vary 分版本缓存、多 Range 读取、请求合并(collapsed request),减少回源并发与链路抖动。

  • URL/DIR 推送
  • 缓存校验 CRC
  • Headers Rewrite

可插拔架构

基于 Kratos,核心逻辑模块化。插件系统可扩展业务逻辑;存储层解耦,内存、磁盘或自定义后端自由切换。

  • Plugin Registry
  • Storage Driver
  • Selector 负载均衡

可靠与可观测

内置 panic 恢复、错误处理、访问日志;原生 Prometheus 指标与 PProf,支持调试模式与安全保护。

  • Graceful Upgrade
  • Metrics 前缀 tr_tavern_
  • PProf 认证

流量治理

请求头重写、上游负载均衡、Range 合并、环境隔离能力,满足边缘分发需求。

  • Rewrite Middleware
  • Multi-Range Merge
  • 自定义上游选择器

快速开始

依赖:Go 1.24+,Linux/macOS(Windows 上平滑重启受限)。

  1. 克隆并初始化配置
git clone https://github.com/omalloc/tavern.git
cd tavern
cp config.example.yaml config.yaml
  1. 开发模式运行(默认加载当前目录 config.yaml)
go run main.go
  1. 构建与运行
make build
./bin/tavern -c config.yaml

启动后可访问 /metrics(Prometheus 指标)和 /debug/pprof/(需开启 debug)。

配置速览

主配置为 YAML,覆盖日志、服务、存储、上游及插件等部分:

logger:
  level: info
  path: /var/log/tavern/tavern.log
server:
  addr: ":8080"
  middleware:
    - name: recovery
    - name: rewrite
    - name: multirange
    - name: caching
  access_log:
    enabled: true
plugin:
  - name: purge
    options:
      allow_hosts: ["127.0.0.1"]
storage:
  driver: native
  db_type: pebble
  db_path: .indexdb
  buckets:
    - path: /cache1
      max_object_limit: 10000000
upstream:
  balancing: wrr
  address: ["http://127.0.0.1:8000"]

完整示例见仓库根目录的 config.example.yaml,可按需调整缓存策略(fuzzy refresh、collapsed request 等)与存储策略(eviction、selection、切片大小)。

架构与组件

Proxy & Server

负责接收外部请求、挂载中间件并与上游通信。支持 Header 重写、Range 合并、缓存命中控制。

Storage 抽象

通过 driver/registry 连接磁盘、内存或自定义存储,支持 Pebble/NutsDB 索引,提供切片化存储与淘汰策略。

Plugin 系统

插件以名称注册,可在启动时加载自定义逻辑(如 purge、verifier、watch)。

Observability

内置 Prometheus 指标、访问日志与 PProf,支持自定义日志路径、TraceID 输出和加密访问日志。

Reliability

支持平滑升级和配置热加载,内置 panic recovery 中间件与错误封装,减少服务抖动。

Traffic Control

可配置上游地址、连接池、负载均衡(wrr 等),支持 Vary 缓存和请求折叠,减少热点回源。

插件与扩展

在配置文件中追加插件条目即可启用:

plugin:
  - name: purge
    options:
      threshold: 60
      allow_hosts: ["127.0.0.1", "localhost"]
  - name: verifier
    options:
      endpoint: https://crc-svc.example.com/receive
      api_key: your_api_key
      timeout: 5
      report_ratio: 100

实现自定义插件:实现 Plugin 接口并注册到 plugin/registry,编译后即可通过 name 载入。

存储层要点

  • 多桶(bucket)管理:为不同路径/冷热分层设置独立限额与 DB 配置。
  • Eviction/Selection:支持 fifo、lru、lfu 淘汰与 hashring/roundrobin 选择策略。
  • 索引与对象分离:indexdb 使用 Pebble/NutsDB;对象存储可切片(slice_size)以优化 Range。
  • 内存与空实现:在测试场景下可切换 memory 或 empty 驱动,减少外部依赖。

运维与观测

  • Metrics:访问 /metrics,默认前缀 tr_tavern_,可直接被 Prometheus 抓取。
  • PProf:开启 debug 后访问 /debug/pprof/,支持 Basic Auth(server.pprof)。
  • Access Log:按需开启加密输出;配合 CLI 工具 tq 进行实时解析。
  • Graceful:支持零停机配置重载与二进制升级(依赖 tableflip)。

工具与 CLI

tq:轻量日志解析工具,位于 cmd/tq。

mv ./bin/tq /usr/local/bin/tq
chmod +x /usr/local/bin/tq

# 实时查看访问日志
 tail -f -n 1 ./logs/access.log | tq
 # 或使用管道
 cat ./logs/access.log | tq

输出包含域名、状态码、耗时、Range、CacheStatus 等关键字段,便于排障与调优。

常见配置提示