component/

directory
v0.0.13 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 26, 2026 License: BSD-2-Clause

README

Component 组件

提供开箱即用的内置组件,基于 5 层分层架构和依赖注入机制设计。

特性

  • 开箱即用 - 内置常用控制器、中间件和服务
  • 统一接口 - 遵循 IBaseController/IBaseMiddleware/IBaseService 标准
  • 依赖注入 - 支持通过 inject:"" 标签注入 Manager 和其他组件
  • 灵活配置 - 中间件支持可选配置和自定义执行顺序
  • 生命周期管理 - 实现 OnStart/OnStop 钩子方法
  • 易于扩展 - 可通过封装模式自定义组件行为

组件概述

Component 组件位于 component/ 目录下,提供三层内置组件:

component/
├── litecontroller/   # 控制器组件
├── litemiddleware/   # 中间件组件
└── liteservice/      # 服务组件
设计原则
  1. 统一命名规范

    • 包名统一使用 lite 前缀
    • 具体组件使用大驼峰命名
    • 接口使用 I 前缀
  2. 标准接口实现

    • 所有控制器实现 common.IBaseController
    • 所有中间件实现 common.IBaseMiddleware
    • 所有服务实现 common.IBaseService
  3. 配置灵活

    • 使用指针类型实现可选配置
    • 提供 DefaultXxxConfig() 设置默认值
    • 提供 NewXxxWithDefaults() 快速创建
  4. 生命周期管理

    • 实现 OnStart()OnStop() 钩子
    • 支持资源初始化和清理

可用组件列表

litecontroller(控制器组件)
组件 路由 功能 依赖
HealthController /health [GET] 健康检查,检测所有 Manager 状态 ManagerContainer, LoggerMgr
MetricsController /metrics [GET] 返回服务器运行指标和组件数量 ManagerContainer, ServiceContainer, LoggerMgr
PprofIndexController /debug/pprof [GET] 性能分析首页 LoggerMgr
PprofHeapController /debug/pprof/heap [GET] 堆内存分析 LoggerMgr
PprofGoroutineController /debug/pprof/goroutine [GET] 协程分析 LoggerMgr
PprofAllocsController /debug/pprof/allocs [GET] 内存分配分析 LoggerMgr
PprofBlockController /debug/pprof/block [GET] 阻塞分析 LoggerMgr
PprofMutexController /debug/pprof/mutex [GET] 锁竞争分析 LoggerMgr
PprofProfileController /debug/pprof/profile [GET] CPU 采样 LoggerMgr
PprofTraceController /debug/pprof/trace [GET] 协程追踪 LoggerMgr
ResourceStaticController 自定义 静态文件服务 LoggerMgr
ResourceHTMLController - HTML 模板渲染(已废弃,使用 liteservice) LoggerMgr
litemiddleware(中间件组件)
组件 默认 Order 功能 依赖
Recovery 0 Panic 恢复,打印堆栈 LoggerMgr
RequestLogger 50 请求日志,记录请求/响应信息 LoggerMgr
CORS 100 跨域处理,设置 CORS 头 -
SecurityHeaders 150 安全头,X-Frame-Options 等 -
RateLimiter 200 限流,基于时间窗口 LimiterMgr, LoggerMgr
Telemetry 250 遥测,OpenTelemetry 集成 TelemetryManager
liteservice(服务组件)
组件 功能 依赖
HTMLTemplateService HTML 模板渲染服务 LoggerMgr

统一接口规范

命名规范
组件包:lite<type>(litecontroller、litemiddleware、liteservice)
具体组件:<Name><Type>(HealthController、RecoveryMiddleware、HTMLTemplateService)
接口:I<Name><Type>(IHealthController、IRecoveryMiddleware、IHTMLTemplateService)
配置结构:<Name>Config(RecoveryConfig、CorsConfig)
工厂函数:New<Name><Type>(NewHealthController、NewRecoveryMiddleware)
默认配置:Default<Name>Config(DefaultRecoveryConfig)
默认创建:New<Name><Type>WithDefaults(NewRecoveryMiddlewareWithDefaults)
控制器接口
type IBaseController interface {
    ControllerName() string  // 控制器名称
    GetRouter() string      // 路由定义,如 "/health [GET]"
    Handle(ctx *gin.Context) // 请求处理
}
中间件接口
type IBaseMiddleware interface {
    MiddlewareName() string          // 中间件名称
    Order() int                      // 执行顺序
    Wrapper() gin.HandlerFunc        // Gin 中间件函数
    OnStart() error                  // 启动钩子
    OnStop() error                   // 停止钩子
}
服务接口
type IBaseService interface {
    ServiceName() string  // 服务名称
    OnStart() error       // 启动钩子
    OnStop() error        // 停止钩子
}

配置支持(Name/Order)

中间件配置结构

所有中间件配置结构体均包含 NameOrder 字段:

type <Component>Config struct {
    Name  *string  // 中间件名称
    Order *int     // 执行顺序
    // ... 其他配置字段
}
可选配置模式

使用指针类型实现可选配置:

// 自定义部分配置
order := 300
name := "CustomRecovery"
limiter := litemiddleware.NewRateLimiterMiddleware(&litemiddleware.RateLimiterConfig{
    Name:  &name,
    Order: &order,
    // 其他字段使用默认值
})

// 使用默认配置
recovery := litemiddleware.NewRecoveryMiddlewareWithDefaults()
// 或
recovery := litemiddleware.NewRecoveryMiddleware(nil)
中间件执行顺序

预定义的执行顺序(按 Order 值从小到大):

Order 中间件 说明
0 Recovery Panic 恢复(最先执行)
50 RequestLogger 请求日志
100 CORS 跨域处理
150 SecurityHeaders 安全头
200 RateLimiter 限流
250 Telemetry 遥测
300+ 自定义 业务中间件(建议从 350 开始)

依赖注入方式

注入 Manager

组件通过 inject:"" 标签自动注入 Manager:

type HealthController struct {
    ManagerContainer common.IBaseManager      `inject:""`
    LoggerMgr        loggermgr.ILoggerManager `inject:""`
}

type RecoveryMiddleware struct {
    LoggerMgr loggermgr.ILoggerManager `inject:""`
}

type RateLimiterMiddleware struct {
    LimiterMgr limitermgr.ILimiterManager `inject:""`
    LoggerMgr  loggermgr.ILoggerManager   `inject:""`
}
注入其他组件
type CustomController struct {
    LoggerMgr        loggermgr.ILoggerManager `inject:""`
    DBManager        databasemgr.IDatabaseManager `inject:""`
    CacheMgr         cachemgr.ICacheManager `inject:""`
    LimiterMgr       limitermgr.ILimiterManager `inject:""`
    TelemetryManager telemetrymgr.ITelemetryManager `inject:""`
}

快速开始

基本用法
import (
    "github.com/lite-lake/litecore-go/component/litecontroller"
    "github.com/lite-lake/litecore-go/component/litemiddleware"
    "github.com/lite-lake/litecore-go/component/liteservice"
)

// 创建控制器
health := litecontroller.NewHealthController()
metrics := litecontroller.NewMetricsController()
static := litecontroller.NewResourceStaticController("/static", "./static")

// 创建中间件(使用默认配置)
recovery := litemiddleware.NewRecoveryMiddlewareWithDefaults()
cors := litemiddleware.NewCorsMiddlewareWithDefaults()
reqLogger := litemiddleware.NewRequestLoggerMiddlewareWithDefaults()
security := litemiddleware.NewSecurityHeadersMiddlewareWithDefaults()
limiter := litemiddleware.NewRateLimiterMiddlewareWithDefaults()
telemetry := litemiddleware.NewTelemetryMiddlewareWithDefaults()

// 创建服务
htmlService := liteservice.NewHTMLTemplateService("templates/*")

// 注册到容器
controllerContainer.RegisterController(health)
controllerContainer.RegisterController(metrics)
controllerContainer.RegisterController(static)

middlewareContainer.RegisterMiddleware(recovery)
middlewareContainer.RegisterMiddleware(cors)
middlewareContainer.RegisterMiddleware(reqLogger)
middlewareContainer.RegisterMiddleware(security)
middlewareContainer.RegisterMiddleware(limiter)
middlewareContainer.RegisterMiddleware(telemetry)

serviceContainer.RegisterService(htmlService)
自定义配置
// 自定义限流规则
limit := 200
window := time.Minute
keyPrefix := "api"
limiter := litemiddleware.NewRateLimiterMiddleware(&litemiddleware.RateLimiterConfig{
    Limit:     &limit,
    Window:    &window,
    KeyPrefix: &keyPrefix,
    KeyFunc: func(c *gin.Context) string {
        return c.GetHeader("X-User-ID")
    },
})

// 自定义 CORS 配置
allowOrigins := []string{"https://example.com"}
allowCredentials := true
cors := litemiddleware.NewCorsMiddleware(&litemiddleware.CorsConfig{
    AllowOrigins:     &allowOrigins,
    AllowCredentials: &allowCredentials,
})

// 自定义安全头配置
frameOptions := "SAMEORIGIN"
security := litemiddleware.NewSecurityHeadersMiddleware(&litemiddleware.SecurityHeadersConfig{
    FrameOptions: &frameOptions,
})

在 messageboard 中的使用示例

messageboard 项目通过封装的方式使用组件,实现更好的隔离和扩展性。

封装中间件
// internal/middlewares/recovery_middleware.go
package middlewares

import (
    "github.com/lite-lake/litecore-go/common"
    "github.com/lite-lake/litecore-go/component/litemiddleware"
)

type IRecoveryMiddleware interface {
    common.IBaseMiddleware
}

func NewRecoveryMiddleware() IRecoveryMiddleware {
    return litemiddleware.NewRecoveryMiddlewareWithDefaults()
}
封装控制器
// internal/controllers/sys_health_controller.go
package controllers

import (
    "github.com/lite-lake/litecore-go/component/litecontroller"
    "github.com/lite-lake/litecore-go/manager/loggermgr"
)

type ISysHealthController interface {
    common.IBaseController
}

type sysHealthControllerImpl struct {
    componentController litecontroller.IHealthController
    LoggerMgr          loggermgr.ILoggerManager `inject:""`
}

func NewSysHealthController() ISysHealthController {
    return &sysHealthControllerImpl{
        componentController: litecontroller.NewHealthController(),
    }
}

// 实现接口方法,委托给组件控制器
func (c *sysHealthControllerImpl) ControllerName() string {
    return "SysHealthController"
}

func (c *sysHealthControllerImpl) GetRouter() string {
    return "/health [GET]"
}

func (c *sysHealthControllerImpl) Handle(ctx *gin.Context) {
    c.componentController.Handle(ctx)
}
注册到容器
// internal/application/middleware_container.go
middlewareContainer := container.NewMiddlewareContainer(serviceContainer)
container.RegisterMiddleware[middlewares.IRecoveryMiddleware](
    middlewareContainer,
    middlewares.NewRecoveryMiddleware(),
)

// internal/application/controller_container.go
controllerContainer := container.NewControllerContainer(serviceContainer)
container.RegisterController[controllers.ISysHealthController](
    controllerContainer,
    controllers.NewSysHealthController(),
)

各层组件特点

litecontroller
  • 职责:HTTP 请求处理和响应
  • 特点
    • 实现 Handle(ctx *gin.Context) 方法处理请求
    • 通过 GetRouter() 定义路由
    • 可注入 ManagerContainer 访问所有 Manager
    • 可注入 ServiceContainer 访问所有 Service
    • 支持静态文件服务和健康检查等常用功能
litemiddleware
  • 职责:请求预处理和后处理
  • 特点
    • 实现 Wrapper() 返回 gin.HandlerFunc
    • 通过 Order() 控制执行顺序
    • 支持可选配置(指针类型)
    • 实现生命周期钩子(OnStart/OnStop)
    • 统一的默认配置机制
liteservice
  • 职责:业务逻辑和数据处理支持
  • 特点
    • 实现生命周期钩子管理资源
    • OnStart() 中初始化资源
    • OnStop() 中清理资源
    • 可被 Controller 和 Middleware 注入使用

最佳实践

  1. 使用默认配置

    • 大多数场景下使用 NewXxxWithDefaults() 即可
    • 仅在需要自定义时才传入配置
  2. 遵循命名规范

    • 自定义组件遵循相同的命名规范
    • 接口使用 I 前缀
    • 配置使用 <Component>Config 格式
  3. 正确设置 Order

    • 业务中间件从 350 开始
    • 不要使用 0-250 之间的预定义 Order
    • 保持中间件执行的逻辑顺序
  4. 封装组件

    • 在项目中封装组件以隔离依赖
    • 定义本地接口方便扩展
    • 提供统一的创建函数
  5. 依赖注入

    • 使用 inject:"" 标签声明依赖
    • 依赖由 Engine 自动注入
    • 避免在组件内部创建 Manager 实例

测试

# 测试所有组件
go test ./component/... -v

# 测试控制器
go test ./component/litecontroller/... -v

# 测试中间件
go test ./component/litemiddleware/... -v

# 测试服务
go test ./component/liteservice/... -v

# 测试覆盖率
go test -cover ./component/...

相关文档

Directories

Path Synopsis
Package litecontroller 提供内置控制器组件,用于健康检查、性能分析、指标监控和资源管理。
Package litecontroller 提供内置控制器组件,用于健康检查、性能分析、指标监控和资源管理。
Package litemiddleware 提供 HTTP 中间件组件,实现开箱即用的通用中间件功能。
Package litemiddleware 提供 HTTP 中间件组件,实现开箱即用的通用中间件功能。
Package liteservice 提供内置服务组件,用于 HTML 模板渲染和模板管理。
Package liteservice 提供内置服务组件,用于 HTML 模板渲染和模板管理。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL