竹简文档

上下文工具

从 Gin 上下文获取数据库、Redis、雪花节点等

上下文工具

ctxutil 包提供了一组工具函数,用于从 Gin 上下文中安全地获取注入的资源实例。

导入

import xCtxUtil "github.com/bamboo-services/bamboo-base-go/utility/ctxutil"

数据库工具

GetDB

从上下文获取 GORM 数据库连接:

func GetDB(c *gin.Context) *gorm.DB

特性

  • 自动调用 WithContext(c) 传递请求上下文
  • 未找到时触发 panic 并记录错误日志

使用示例

func GetUserHandler(c *gin.Context) {
    db := xCtxUtil.GetDB(c)

    var user User
    if err := db.First(&user, c.Param("id")).Error; err != nil {
        // 处理错误
    }
}

Redis 工具

GetRDB

从上下文获取 Redis 客户端:

func GetRDB(c *gin.Context) *redis.Client

使用示例

func GetCacheHandler(c *gin.Context) {
    rdb := xCtxUtil.GetRDB(c)

    val, err := rdb.Get(c.Request.Context(), "key").Result()
    if err != nil {
        // 处理错误
    }
}

雪花算法工具

GetSnowflakeNode

从上下文获取雪花算法节点:

func GetSnowflakeNode(c *gin.Context) *xSnowflake.Node

特性

  • 未找到时返回默认节点(不会 panic)

GenerateSnowflakeID

生成普通雪花 ID(Gene=0):

func GenerateSnowflakeID(c *gin.Context) xSnowflake.SnowflakeID

GenerateGeneSnowflakeID

生成带业务基因的雪花 ID:

func GenerateGeneSnowflakeID(c *gin.Context, gene xSnowflake.Gene) xSnowflake.SnowflakeID

使用示例

func CreateOrderHandler(c *gin.Context) {
    // 生成订单 ID
    orderID := xCtxUtil.GenerateGeneSnowflakeID(c, xSnowflake.GeneOrder)

    order := Order{
        ID: orderID,
        // ...
    }
}

通用工具

IsDebugMode

判断是否处于调试模式:

func IsDebugMode() bool

通过环境变量 XLF_DEBUG 控制。

CalcOverheadTime

计算请求耗时(微秒):

func CalcOverheadTime(c *gin.Context) int64

特性

  • 仅在调试模式下计算
  • 非调试模式返回 0

GetRequestKey

获取请求唯一标识:

func GetRequestKey(c *gin.Context) string

GetErrorMessage

获取上下文中的错误消息:

func GetErrorMessage(c *gin.Context) string

完整使用示例

package handler

import (
    xCtxUtil "github.com/bamboo-services/bamboo-base-go/utility/ctxutil"
    xSnowflake "github.com/bamboo-services/bamboo-base-go/snowflake"
    "github.com/gin-gonic/gin"
)

func CreateUserHandler(c *gin.Context) {
    // 获取数据库连接
    db := xCtxUtil.GetDB(c)

    // 获取 Redis 客户端
    rdb := xCtxUtil.GetRDB(c)

    // 生成用户 ID
    userID := xCtxUtil.GenerateGeneSnowflakeID(c, xSnowflake.GeneUser)

    // 创建用户
    user := User{
        ID:       userID,
        Username: "test",
    }

    if err := db.Create(&user).Error; err != nil {
        // 处理错误
        return
    }

    // 缓存用户信息
    rdb.Set(c.Request.Context(),
        fmt.Sprintf("user:%d", userID.Int64()),
        user,
        time.Hour,
    )

    // 调试模式下记录耗时
    if xCtxUtil.IsDebugMode() {
        overhead := xCtxUtil.CalcOverheadTime(c)
        slog.Debug("请求处理完成", "overhead_us", overhead)
    }
}

中间件注入示例

func InjectMiddleware(db *gorm.DB, rdb *redis.Client, node *xSnowflake.Node) gin.HandlerFunc {
    return func(c *gin.Context) {
        // 注入数据库
        c.Set(xCtx.DatabaseKey.String(), db)

        // 注入 Redis
        c.Set(xCtx.RedisClientKey.String(), rdb)

        // 注入雪花节点
        c.Set(xCtx.SnowflakeNodeKey.String(), node)

        // 记录开始时间
        c.Set(xCtx.UserStartTimeKey.String(), time.Now())

        c.Next()
    }
}

下一步

On this page