竹简文档
初始化

快速开始

xReg 包提供节点化初始化系统,支持灵活的组件注册

xReg 包

xReg 包是 Bamboo Base 的核心注册模块,采用节点化模式实现灵活的组件初始化和依赖注入。

import xReg "github.com/bamboo-services/bamboo-base-go/major/register"
import xRegNode "github.com/bamboo-services/bamboo-base-go/major/register/node"

Reg 结构体

应用程序的核心注册结构,包含所有初始化后的组件实例:

register.go
type Reg struct {
    Serve *gin.Engine       // Gin 引擎实例
    Init  *xRegNode.RegNode // 初始化节点管理器
}

字段

类型

Register

注册并初始化应用的所有核心组件,支持自定义初始化节点。

register.go
func Register(ctx context.Context, nodeList []xRegNode.RegNodeList) *Reg

参数说明:

字段

类型

初始化顺序:

Register(ctx, nodeList)
    ├── configInit()           // 1. 加载配置(私有)
    ├── loggerInit()           // 2. 初始化日志(私有)
    ├── SnowflakeInit          // 3. 内置雪花算法节点
    ├── [自定义节点...]         // 4. 用户自定义节点
    └── engineInit()           // 5. 初始化 Gin 引擎(私有)

启动阶段(推荐)
    └── xMain.Runner(...)      // 6. 启动 HTTP 服务并托管优雅关闭

示例:

main.go
package main

import (
    "context"

    xCtx "github.com/bamboo-services/bamboo-base-go/defined/context"
    xLog "github.com/bamboo-services/bamboo-base-go/common/log"
    xMain "github.com/bamboo-services/bamboo-base-go/major/main"
    xReg "github.com/bamboo-services/bamboo-base-go/major/register"
    xRegNode "github.com/bamboo-services/bamboo-base-go/major/register/node"
    "github.com/gin-gonic/gin"
)

func main() {
    // 初始化,传入自定义节点
    reg := xReg.Register(context.Background(), []xRegNode.RegNodeList{
        {
            Key:  xCtx.DatabaseKey,
            Node: initDatabase,  // 自定义数据库初始化
        },
    })

    log := xLog.WithName(xLog.NamedMAIN)
    xMain.Runner(reg, log, func(reg *xReg.Reg) {
        reg.Serve.GET("/ping", func(c *gin.Context) {
            c.String(200, "pong")
        })
    })
}

// 自定义初始化节点
func initDatabase(ctx context.Context) (any, error) {
    // 从上下文获取配置(前面节点的结果)
    // 初始化数据库连接
    db, err := gorm.Open(...)
    return db, err
}

节点化系统

RegNode 结构

register/node/node.go
// Node 定义初始化函数签名
type Node func(ctx context.Context) (any, error)

// RegNodeList 存储节点信息
type RegNodeList struct {
    Key  xCtx.ContextKey  // 上下文键
    Node Node                // 初始化函数
}

// RegNode 节点管理器
type RegNode struct {
    list []RegNodeList
    Ctx  context.Context
}

核心方法

register/node/node.go
// Use 注册初始化节点
func (rn *RegNode) Use(ctxKey xCtx.ContextKey, registerFunc Node)

// Exec 按顺序执行所有节点
func (rn *RegNode) Exec()

执行流程

register/node/node.go
func (rn *RegNode) Exec() {
    for i, node := range rn.list {
        // 执行节点初始化
        val, err := node.Node(rn.Ctx)
        if err != nil {
            panic(fmt.Sprintf("执行注册节点失败: index=%d Key=%v err=%v", i, node.Key, err))
        }
        // 将结果存入上下文,供后续节点使用
        rn.Ctx = context.WithValue(rn.Ctx, node.Key, val)
    }
    rn.list = nil // 释放内存
}

特点:

  • 🔄 依赖注入:每个节点可访问前面节点的初始化结果
  • 📊 顺序执行:按注册顺序依次初始化
  • 🛡️ 错误处理:任何节点失败都会 panic 并输出详细信息

内置初始化

配置初始化(私有)

.env 文件加载环境变量配置。

详见:配置初始化

日志初始化(私有)

初始化日志记录器,支持控制台彩色输出和文件 JSON 记录。

详见:日志初始化

雪花算法节点(内置)

作为内置节点自动注册,初始化雪花算法节点。

register.go
reg.Init.Use(xCtx.SnowflakeNodeKey, xInit.SnowflakeInit)

详见:雪花算法初始化

引擎初始化(私有)

初始化 Gin 引擎,注册内置中间件和验证器,并注入初始化上下文。

详见:引擎初始化

服务运行时(公共)

推荐使用 xMain.Runner 启动服务,统一处理:

  • 信号监听(SIGINT/SIGTERM
  • 优雅关闭
  • 后台协程托管

详见:服务运行时

gRPC 为可选能力,已拆分到独立板块:gRPC(可选)

上下文注入

引擎初始化时会自动将节点管理器的上下文注入到每个 HTTP 请求:

register_gin.go
// 注入初始化上下文到每个请求
func injectContext(ctx context.Context) func(c *gin.Context) {
    return func(c *gin.Context) {
        c.Request = c.Request.WithContext(ctx)
        c.Next()
    }
}

这意味着在业务代码中可以通过 c.Request.Context() 获取初始化时注入的所有资源。

调试模式

通过环境变量 XLF_DEBUG 控制调试模式:

环境变量效果
XLF_DEBUGtrue启用调试模式,日志级别为 Debug
XLF_DEBUGfalse 或未设置生产模式,日志级别为 Info

完整示例

main.go
package main

import (
    "context"

    xCtx "github.com/bamboo-services/bamboo-base-go/defined/context"
    xReg "github.com/bamboo-services/bamboo-base-go/major/register"
    xRegNode "github.com/bamboo-services/bamboo-base-go/major/register/node"
    xResult "github.com/bamboo-services/bamboo-base-go/major/result"
    "github.com/gin-gonic/gin"
)

func main() {
    // 初始化,注册自定义节点
    reg := xReg.Register(context.Background(), []xRegNode.RegNodeList{
        {Key: xCtx.DatabaseKey, Node: initDatabase},
        {Key: xCtx.RedisClientKey, Node: initRedis},
    })

    // 注册路由
    reg.Serve.GET("/api/status", func(c *gin.Context) {
        xResult.SuccessHasData(c, "服务正常", gin.H{
            "status": "running",
        })
    })

    // 启动服务
    reg.Serve.Run(":8080")
}

// 数据库初始化节点
func initDatabase(ctx context.Context) (any, error) {
    // 初始化数据库...
    return db, nil
}

// Redis 初始化节点
func initRedis(ctx context.Context) (any, error) {
    // 初始化 Redis...
    return rdb, nil
}

下一步

On this page