框架 pkg 包 utils 工具

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)

任务类型

类型说明
TypeCronCron 表达式定时任务
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获取性能指标