pkg/config — 配置管理
基于 Viper 的配置管理包,支持多格式配置文件、环境变量、文件监控、保护模式和热重载。
安装
import "github.com/tokmz/qi/pkg/config"
快速使用
cfg := config.New(
config.WithConfigFile("./config.yaml"),
config.WithAutoWatch(true),
config.WithOnChange(func() {
log.Println("配置已变更")
}),
)
if err := cfg.Load(); err != nil {
log.Fatal(err)
}
// 读取配置
addr := cfg.GetString("server.addr")
port := cfg.GetInt("server.port")
debug := cfg.GetBool("app.debug")
// 泛型读取
timeout := config.Get[time.Duration](cfg, "server.timeout")
// 反序列化到结构体
var serverCfg ServerConfig
cfg.UnmarshalKey("server", &serverCfg)
Options
| Option | 说明 |
WithConfigFile(path) | 指定配置文件完整路径 |
WithConfigName(name) | 配置文件名(不含扩展名) |
WithConfigType(typ) | 配置文件类型(yaml/json/toml) |
WithConfigPaths(paths...) | 配置文件搜索路径 |
WithProtected(bool) | 保护模式(外部修改自动恢复) |
WithAutoWatch(bool) | 自动开启文件监控 |
WithOnChange(fn) | 配置变更回调 |
WithOnError(fn) | 错误回调 |
WithDefaults(map) | 默认配置值 |
WithEnvPrefix(prefix) | 环境变量前缀 |
API
| 方法 | 说明 |
Load() error | 加载配置文件 |
GetString/Int/Int64/Float64/Bool/Duration(key) | 类型化读取 |
GetStringSlice/StringMap/StringMapString(key) | 集合类型读取 |
Get[T](cfg, key) | 泛型读取 |
Set(key, value) | 设置配置值 |
IsSet(key) bool | 检查键是否存在 |
Sub(key) *Config | 获取子配置 |
Unmarshal(v) / UnmarshalKey(key, v) | 反序列化到结构体 |
StartWatch() / StopWatch() | 手动控制文件监控 |
SetProtected(bool) / IsProtected() | 保护模式控制 |
AllSettings() map[string]any | 获取所有配置 |
Viper() *viper.Viper | 获取底层 Viper 实例 |
Close() | 关闭并释放资源 |
pkg/cache — 缓存
统一缓存抽象层,支持 Memory 和 Redis 两种驱动,内置序列化、SingleFlight 防穿透和 OpenTelemetry 追踪。
安装
import "github.com/tokmz/qi/pkg/cache"
快速使用
// 内存缓存
c, err := cache.NewWithOptions(
cache.WithMemory(&cache.MemoryConfig{
MaxSize: 1000,
CleanupInterval: 5 * time.Minute,
}),
cache.WithKeyPrefix("app:"),
cache.WithDefaultTTL(10 * time.Minute),
)
// Redis 缓存
c, err := cache.NewWithOptions(
cache.WithRedis(&cache.RedisConfig{
Addr: "localhost:6379",
Password: "",
DB: 0,
}),
)
// 统一接口
c.Set(ctx, "key", value, 5*time.Minute)
val, err := c.Get(ctx, "key")
c.Delete(ctx, "key")
exists, _ := c.Exists(ctx, "key")
Cache 接口
| 方法 | 说明 |
Get(ctx, key) (any, error) | 获取缓存 |
Set(ctx, key, value, ttl) error | 设置缓存 |
Delete(ctx, key) error | 删除缓存 |
Exists(ctx, key) (bool, error) | 检查是否存在 |
Clear(ctx) error | 清空所有缓存 |
GetMulti(ctx, keys) (map, error) | 批量获取 |
SetMulti(ctx, items, ttl) error | 批量设置 |
DeleteMulti(ctx, keys) error | 批量删除 |
Close() error | 关闭连接 |
pkg/logger — 日志
基于 Zap 的高性能日志包,支持多输出、文件轮转、采样、Hook 和 Context 自动提取 TraceID/UID。
快速使用
import "github.com/tokmz/qi/pkg/logger"
// 开发环境
log := logger.Default()
// 生产环境
log, err := logger.NewWithOptions(
logger.WithLevel(logger.InfoLevel),
logger.WithFormat(logger.FormatJSON),
logger.WithFileOutput("./logs/app.log"),
logger.WithRotateOutput(&logger.RotateConfig{
MaxSize: 100, // MB
MaxBackups: 10,
MaxAge: 30, // 天
Compress: true,
}),
logger.WithCaller(true),
)
// 基础日志
log.Info("server started", zap.String("addr", ":8080"))
log.Error("request failed", zap.Error(err))
// 带 Context(自动提取 TraceID/UID)
log.InfoContext(ctx, "user login", zap.Int64("uid", uid))
// 子 Logger
reqLog := log.With(zap.String("module", "auth"))
reqLog.Info("token verified")
Logger 接口
| 方法 | 说明 |
Debug/Info/Warn/Error/DPanic/Panic/Fatal(msg, fields...) | 各级别日志 |
DebugContext/InfoContext/WarnContext/ErrorContext(ctx, msg, fields...) | 带 Context 日志 |
With(fields...) Logger | 创建子 Logger |
WithContext(ctx) Logger | 创建带 Context 的子 Logger |
SetLevel(level) | 动态调整级别 |
Level() Level | 获取当前级别 |
Sync() error | 刷新缓冲区 |
Options
| Option | 说明 |
WithLevel(level) | 日志级别 |
WithFormat(format) | 输出格式(JSON/Console) |
WithConsoleOutput() | 启用控制台输出 |
WithFileOutput(filename) | 文件输出 |
WithRotateOutput(config) | 文件轮转输出 |
WithSampling(config) | 采样配置 |
WithBufferSize(size) | 缓冲区大小 |
WithCaller(bool) | 记录调用位置 |
WithStacktrace(bool) | 记录堆栈 |
WithHook(hook) | 添加 Hook |
pkg/orm — 数据库 ORM
基于 GORM 的数据库封装,支持 MySQL/PostgreSQL/SQLite,内置连接池、读写分离和 OpenTelemetry 追踪。
快速使用
import "github.com/tokmz/qi/pkg/orm"
db, err := orm.New(&orm.Config{
Type: orm.MySQL,
DSN: "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4",
MaxOpenConns: 100,
MaxIdleConns: 10,
MaxLifetime: time.Hour,
EnableTrace: true,
LogLevel: "info",
})
// 读写分离
db, err := orm.New(&orm.Config{
Type: orm.MySQL,
DSN: "user:pass@tcp(master:3306)/db",
ReadWriteSplit: &orm.ReadWriteSplitConfig{
ReadDSNs: []string{
"user:pass@tcp(slave1:3306)/db",
"user:pass@tcp(slave2:3306)/db",
},
Policy: "random",
},
})
Config
| 字段 | 说明 | 默认值 |
Type | 数据库类型(mysql/postgres/sqlite) | mysql |
DSN | 数据源连接字符串 | — |
MaxOpenConns | 最大打开连接数 | 100 |
MaxIdleConns | 最大空闲连接数 | 10 |
MaxLifetime | 连接最大生命周期 | 1h |
EnableTrace | 启用 OpenTelemetry 追踪 | false |
LogLevel | 日志级别 | warn |
ReadWriteSplit | 读写分离配置 | nil |
pkg/tracing — 链路追踪
OpenTelemetry 链路追踪封装,支持 OTLP gRPC/HTTP、Jaeger、Zipkin 导出器,内置采样策略。
快速使用
import "github.com/tokmz/qi/pkg/tracing"
tp, err := tracing.NewTracerProvider(&tracing.Config{
ServiceName: "my-service",
ServiceVersion: "1.0.0",
Environment: "production",
ExporterType: "otlp-grpc",
Endpoint: "localhost:4317",
SampleRate: 0.1,
})
defer tracing.Shutdown(context.Background())
Config
| 字段 | 说明 |
ServiceName | 服务名称 |
ServiceVersion | 服务版本 |
Environment | 运行环境 |
ExporterType | 导出器类型(otlp-grpc/otlp-http/jaeger/zipkin/stdout) |
Endpoint | 导出器地址 |
SampleRate | 采样率(0.0-1.0) |
Insecure | 是否禁用 TLS |
Headers | 自定义请求头 |
pkg/job — 任务调度
功能完整的任务调度器,支持 Cron 表达式、一次性/间隔/延迟任务、重试、超时、并发控制、批量更新和缓存优化。
快速使用
import "github.com/tokmz/qi/pkg/job"
// 创建调度器
scheduler := job.NewScheduler(storage, job.DefaultConfig())
// 注册处理器
scheduler.RegisterHandlerFunc("send-email", func(ctx context.Context, payload string) (string, error) {
// 处理任务
return "sent", nil
})
// 添加 Cron 任务
scheduler.AddJob(ctx, &job.Job{
ID: "daily-report",
Name: "每日报告",
Type: job.TypeCron,
Handler: "send-email",
CronExpr: "0 9 * * *",
Payload: `{"type":"daily"}`,
})
// 添加一次性延迟任务
scheduler.AddJob(ctx, &job.Job{
ID: "welcome-email",
Name: "欢迎邮件",
Type: job.TypeOnce,
Handler: "send-email",
Delay: 5 * time.Minute,
})
// 启动调度器
scheduler.Start(ctx)
defer scheduler.Stop(ctx)
任务类型
| 类型 | 说明 |
TypeCron | Cron 表达式定时任务 |
TypeInterval | 固定间隔任务 |
TypeOnce | 一次性任务 |
TypeDelay | 延迟任务 |
Scheduler API
| 方法 | 说明 |
RegisterHandler(name, handler) | 注册任务处理器 |
RegisterHandlerFunc(name, fn) | 注册函数式处理器 |
AddJob(ctx, job) error | 添加任务 |
RemoveJob(ctx, id) error | 删除任务 |
PauseJob(ctx, id) error | 暂停任务 |
ResumeJob(ctx, id) error | 恢复任务 |
TriggerJob(ctx, id) error | 手动触发 |
GetJob(ctx, id) (*Job, error) | 获取任务 |
ListJobs(ctx) ([]*Job, error) | 列出所有任务 |
Start(ctx) / Stop(ctx) | 启动/停止调度器 |
GetMetrics() *Metrics | 获取性能指标 |