Tavern
面向现代边缘的缓存代理
Tavern 由 Go 实现,基于 Kratos 框架,提供灵活可插拔的缓存代理能力。它内置存储抽象、插件系统、观测与平滑升级,帮助你快速构建稳定的边缘加速或网关缓存服务。
一分钟快速认知
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 上平滑重启受限)。
- 克隆并初始化配置
git clone https://github.com/omalloc/tavern.git
cd tavern
cp config.example.yaml config.yaml
- 开发模式运行(默认加载当前目录 config.yaml)
go run main.go
- 构建与运行
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 等关键字段,便于排障与调优。
常见配置提示
- 严格模式(strict)开启后,配置缺失会直接报错,适合生产环境。
- 中间件顺序会影响行为:recovery 应置顶,rewrite 在 caching 之前以保证缓存键一致。
- upstream.resolve_addresses 适合动态解析上游域名;insecure_skip_verify 仅限受信测试环境。
- 大文件分片:根据磁盘 IO 能力调整 slice_size(默认 1MB),以平衡 Range 性能与碎片。