docs(proxy,resolver,variable): 增强公开 API 文档注释

- proxy: 添加 upstreamCache/protoHTTPS 常量说明
- proxy_dns: 添加文件级文档和所有公开方法的详细注释
- stats: 增强 StatsCollector 接口文档和方法注释
- pool: 增强 PoolStats 字段注释和公开函数文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-10 15:29:21 +08:00
parent aa05d6b965
commit edf192ff85
4 changed files with 161 additions and 17 deletions

View File

@ -52,7 +52,12 @@ import (
)
const (
// upstreamCache 上游缓存标识
// 用于标记请求可直接使用缓存响应,无需转发到上游
upstreamCache = "CACHE"
// protoHTTPS 使用 HTTPS 协议
// 标记与上游目标通信时使用 HTTPS 加密传输
protoHTTPS = "https"
)

View File

@ -1,3 +1,19 @@
// Package proxy 反向代理包,为 Lolly HTTP 服务器提供反向代理功能。
//
// 该文件实现 DNS 动态解析和刷新功能,支持后端目标的域名自动解析、
// IP 缓存、定时刷新和故障恢复。
//
// 主要功能:
// - DNS 解析器集成:支持自定义 resolver 实现域名解析
// - 定时刷新循环:根据 TTL 自动刷新已解析目标的 IP 地址
// - 连接池同步更新DNS 解析结果自动同步到 HostClient 连接池
// - 统计信息查询:暴露 DNS 解析器的运行统计数据
//
// 注意事项:
// - 所有公开方法均为并发安全
// - DNS 刷新在后台 goroutine 中运行,通过 stopCh 控制生命周期
//
// 作者xfy
package proxy
import (
@ -13,13 +29,26 @@ import (
)
// SetResolver 设置 DNS 解析器。
//
// 该方法为代理实例配置自定义的 DNS 解析器,用于动态解析后端目标的域名。
// 必须在调用 Start() 之前设置,否则 DNS 刷新循环不会启动。
//
// 参数:
// - r: DNS 解析器实例,需实现 resolver.Resolver 接口
func (p *Proxy) SetResolver(r resolver.Resolver) {
p.mu.Lock()
defer p.mu.Unlock()
p.resolver = r
}
// Start 启动代理,包括 DNS 刷新循环。
// Start 启动代理服务,包括 DNS 刷新循环。
//
// 该方法标记代理为已启动状态,如果配置了 resolver则启动解析器并
// 在后台 goroutine 中启动 DNS 定时刷新循环。该方法是幂等的,
// 重复调用不会重复启动。
//
// 返回值:
// - error: 启动 resolver 失败时返回非 nil 错误
func (p *Proxy) Start() error {
if p.started.Load() {
return nil
@ -38,7 +67,13 @@ func (p *Proxy) Start() error {
return nil
}
// Stop 停止代理,包括关闭 DNS 刷新循环。
// Stop 停止代理服务,包括关闭 DNS 刷新循环。
//
// 该方法标记代理为已停止状态,关闭 stopCh 通知所有后台协程退出,
// 并停止 resolver。该方法是幂等的重复调用不会产生副作用。
//
// 返回值:
// - error: 停止 resolver 失败时返回非 nil 错误
func (p *Proxy) Stop() error {
if !p.started.Load() {
return nil
@ -60,6 +95,10 @@ func (p *Proxy) Stop() error {
}
// startDNSRefreshLoop 启动 DNS 刷新后台循环。
//
// 根据 resolver 的 TTL 计算刷新间隔TTL / 2最小 1 秒),
// 定时调用 refreshDNS 刷新所有需要解析的目标。
// 该方法阻塞运行,直到收到 stopCh 信号。
func (p *Proxy) startDNSRefreshLoop() {
if p.resolver == nil {
return
@ -90,6 +129,9 @@ func (p *Proxy) startDNSRefreshLoop() {
}
// refreshDNS 刷新所有需要解析的目标。
//
// 遍历所有后端目标,对超过 TTL 的域名执行 DNS 查询,
// 更新目标的已解析 IP 列表,并同步更新对应 HostClient 的地址。
func (p *Proxy) refreshDNS() {
if p.resolver == nil {
return
@ -127,7 +169,14 @@ func (p *Proxy) refreshDNS() {
}
}
// updateHostClientAddr 更新 HostClient 的 Addr。
// updateHostClientAddr 更新 HostClient 的连接地址。
//
// 从目标 URL 中解析出端口,与新的 IP 地址组合后更新对应
// HostClient 的 Addr 字段。旧连接不受影响,新连接将使用新地址。
//
// 参数:
// - target: 负载均衡目标,包含原始 URL
// - ip: 新解析出的 IP 地址
func (p *Proxy) updateHostClientAddr(target *loadbalance.Target, ip string) {
p.mu.Lock()
defer p.mu.Unlock()
@ -158,7 +207,13 @@ func (p *Proxy) updateHostClientAddr(target *loadbalance.Target, ip string) {
}
}
// getResolverTTL 获取 resolver 的 TTL。
// getResolverTTL 获取 DNS 解析记录的过期时间。
//
// 返回 resolver 的 TTL 配置,默认值为 30 秒。
// 该方法当前返回固定值,未来可从 resolver stats 中动态推断。
//
// 返回值:
// - time.Duration: DNS 记录的有效期
func (p *Proxy) getResolverTTL() time.Duration {
if p.resolver == nil {
return 0
@ -170,6 +225,12 @@ func (p *Proxy) getResolverTTL() time.Duration {
}
// GetResolverStats 返回 DNS 解析器的统计信息。
//
// 获取当前 resolver 的运行统计数据,包括查询次数、
// 缓存命中率、错误次数等。如果未配置 resolver返回空的 Stats。
//
// 返回值:
// - resolver.Stats: DNS 解析器统计数据
func (p *Proxy) GetResolverStats() resolver.Stats {
p.mu.RLock()
r := p.resolver

View File

@ -1,6 +1,18 @@
// Package resolver 提供 DNS 解析功能,支持缓存和后台刷新。
//
// 该文件包含 DNS 解析器统计指标相关的实现。
// 该文件包含 DNS 解析器统计指标相关的实现,包括:
// - 缓存命中/未命中次数统计
// - 解析错误次数统计
// - 解析延迟统计
// - 统计数据查询接口
//
// 主要用途:
// 用于监控 DNS 解析器的性能指标,支持实时获取缓存命中率、
// 平均延迟等关键指标,便于系统性能分析和调优。
//
// 注意事项:
// - 所有统计方法均为原子操作,并发安全
// - 延迟统计使用纳秒级精度累加
//
// 作者xfy
package resolver
@ -9,7 +21,21 @@ import (
"time"
)
// StatsCollector 统计收集器接口。
// StatsCollector 定义 DNS 解析器统计收集器的接口。
//
// 该接口用于抽象统计数据的收集和查询操作,支持:
// - 记录缓存命中和未命中事件
// - 记录解析错误
// - 记录解析延迟
// - 获取汇总统计数据
//
// 实现要求:
// - 所有方法必须是并发安全的
// - 统计数据的更新应使用原子操作
// - GetStats 返回的数据应反映当前时刻的快照
//
// 使用场景:
// 通常由 DNSResolver 实现此接口,供监控系统或管理接口调用。
type StatsCollector interface {
// RecordHit 记录缓存命中
RecordHit()
@ -23,7 +49,14 @@ type StatsCollector interface {
GetStats() Stats
}
// ResetStats 重置所有统计信息。
// ResetStats 重置所有统计信息为初始值。
//
// 将缓存命中次数、缓存未命中次数、解析错误次数、
// 总延迟时间和查询次数全部清零。
//
// 注意事项:
// - 该操作会清除所有历史统计数据,请谨慎使用
// - 使用原子操作确保并发安全
func (r *DNSResolver) ResetStats() {
r.hits.Store(0)
r.misses.Store(0)
@ -33,26 +66,61 @@ func (r *DNSResolver) ResetStats() {
}
// GetCacheHits 返回缓存命中次数。
//
// 缓存命中表示请求的数据已存在于缓存中,无需进行实际的 DNS 查询。
// 该指标可用于评估缓存的有效性。
//
// 返回值:
// - 缓存命中次数的累计值int64 类型)
func (r *DNSResolver) GetCacheHits() int64 {
return r.hits.Load()
}
// GetCacheMisses 返回缓存未命中次数。
//
// 缓存未命中表示请求的数据不在缓存中,需要进行实际的 DNS 查询。
// 结合缓存命中次数可计算缓存命中率:命中率 = 命中次数 / (命中次数 + 未命中次数)。
//
// 返回值:
// - 缓存未命中次数的累计值int64 类型)
func (r *DNSResolver) GetCacheMisses() int64 {
return r.misses.Load()
}
// GetResolveErrors 返回解析错误次数。
//
// 解析错误表示 DNS 查询过程中发生的各种错误,包括网络错误、
// 超时、无效响应等。该指标可用于监控 DNS 服务的健康状态。
//
// 返回值:
// - 解析错误次数的累计值int64 类型)
func (r *DNSResolver) GetResolveErrors() int64 {
return r.errors.Load()
}
// GetTotalQueries 返回总查询次数。
//
// 总查询次数等于缓存命中次数与缓存未命中次数之和。
// 该指标反映 DNS 解析器处理的所有请求总数。
//
// 返回值:
// - 总查询次数int64 类型)
func (r *DNSResolver) GetTotalQueries() int64 {
return r.hits.Load() + r.misses.Load()
}
// GetAverageLatency 返回平均解析延迟。
//
// 平均延迟通过总延迟时间除以查询次数计算得出。
// 该指标反映 DNS 解析的平均响应时间,单位为 time.Duration。
// 当没有查询记录时返回 0。
//
// 返回值:
// - 平均解析延迟time.Duration 类型)
//
// 注意事项:
// - 首次调用或 ResetStats 后若未进行任何查询,返回 0
// - 延迟统计包括缓存命中和缓存未命中的请求
func (r *DNSResolver) GetAverageLatency() time.Duration {
count := r.count.Load()
if count == 0 {

View File

@ -11,22 +11,30 @@ import (
"github.com/valyala/fasthttp"
)
// PoolStats 池统计信息
// PoolStats 池统计信息。
//
// 记录 sync.Pool 的使用统计,用于监控和调试。
type PoolStats struct {
Gets int64 // Get 次数
Puts int64 // Put 次数
NewCount int64 // New 创建次数
Active int64 // 当前活跃数量 (Gets - Puts)
// Gets 从池中获取对象的次数
Gets int64
// Puts 放回池中对象的次数
Puts int64
// NewCount 调用 New 函数创建对象的次数
NewCount int64
// Active 当前活跃对象数量Gets - Puts
Active int64
}
var (
// stats 池统计
// stats 全局池统计信息
stats PoolStats
// statsMu 保护统计信息
// statsMu 保护统计信息的读写锁
statsMu sync.RWMutex
)
// GetStats 获取池统计信息
// GetStats 获取池统计信息的副本。
//
// 返回当前统计信息的快照,线程安全。
func GetStats() PoolStats {
statsMu.RLock()
s := stats
@ -34,7 +42,7 @@ func GetStats() PoolStats {
return s
}
// GetPool 获取底层的 sync.Pool用于测试和调试
// GetPool 获取底层的 sync.Pool用于测试和调试
func GetPool() *sync.Pool {
return &pool
}
@ -71,7 +79,9 @@ func PoolPut(vc *Context) {
statsMu.Unlock()
}
// ResetStats 重置统计信息
// ResetStats 重置统计信息。
//
// 将所有统计计数器清零,线程安全。
func ResetStats() {
statsMu.Lock()
stats = PoolStats{}