上下文工具
从 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.SnowflakeIDGenerateGeneSnowflakeID
生成带业务基因的雪花 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) stringGetErrorMessage
获取上下文中的错误消息:
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()
}
}