github.com/darkit/gin 是一个以 gin-gonic/gin 为底座的增强版 Go Web 框架。
它保留 Gin 的高性能与生态兼容性,在其上增加了增强型 Context、可组合的 Engine 配置、认证子系统、丰富中间件、Chi 风格正则路由、自动注册路由,以及一组可直接复用的基础能力包。
这个模块适合希望继续使用 Gin 编程模型,但又希望获得更多“开箱即用”能力的项目:
Engine、Router、ContextContext 与 Router,减少样板代码来自 engine.go 与 options.go 的核心能力:
New(opts ...OptionFunc):创建增强引擎Default(opts ...OptionFunc):创建默认引擎,并自动挂载:
middleware.RequestID()middleware.Recovery()middleware.Logger()logger.NewNoop()cache.NewMemoryCache()lifecycle.NewManager()middleware.NewRegistry()Run() / Shutdown()sync.Pool 复用增强型 Context来自 context.go 及其同族文件:
Param()、ParamInt()、ParamBool()、ParamTime()、ParamSlice() 等ParamIntE()、ParamFloatE() 等BindAndValidate()、BindJSONOrAbort()、BindQueryOrAbort()Success() / Created() / Accepted() / NoContent()BadRequest() / Unauthorized() / Forbidden() / NotFound()ValidationError() / InternalError() / TooManyRequests() 等ParsePagination()、PaginationParams()、Paginated()GetIP()、GetUserAgent()、RequestID()、GetBearerToken()、IsSecure()Engine 绑定的能力透出:Logger()、Cache()、Auth()来自 router.go:
type HandlerFunc func(*Context)GET / POST / PUT / PATCH / DELETE / HEAD / OPTIONS / AnyMatch()Group()Resource() / CRUD()Version() / VersionedAPI()HealthCheck()Static()、StaticFS()、StaticFile()、EmbedFS()、EmbedFile()Use() 同时支持
HandlerFuncgin.HandlerFuncfunc(http.Handler) http.Handler 形式的标准/Chi 风格中间件来自 regex_router.go 与 engine.go:
Engine.RegexRouter() 启用正则路由/users/{id:[0-9]+}/posts/{slug}/files/*NoRoute 链路中regex:<name> 写入上下文来自 auto_register.go:
GetXxx、PostXxx、DeleteXxx 等Regex 结尾时自动注册到 RegexRouterWithPrefix()、WithMiddleware()、WithRegexPattern()RoutePrefix() 和 RegexPatterns() 定制行为来自 auth/ 子模块与 context_auth.go:
WithAuth(auth.AuthConfig) 将认证系统接入 Enginec.Auth() 获取请求级认证上下文Manager、AuthContext、StpLogic 等核心抽象来自 middleware/:
内置中间件覆盖常见 API 服务场景,包括:
RequestIDRecoveryLoggerCORSSecureTimeoutCacheETagCompressIdempotentRateLimit 及高级限流变体SignatureVerifyThrottleURLFormatRealIPMaybeNoCacheRouteHeadersValidateParamSunsetpkg/ 下提供与框架配套但可独立复用的能力包:
cache:缓存抽象与实现circuitbreaker:熔断控制concurrency:并发工具diagnostic:诊断辅助export:导出能力image:图片处理lifecycle:生命周期管理logger:日志接口mail:邮件发送mask:数据脱敏retry:重试工具routes:路由辅助sms:短信/验证码能力static:静态资源相关能力swagger:Swagger/OpenAPI 生成validator:校验辅助websocket:WebSocket 能力1.25+go get github.com/darkit/gin@latest
package main
import (
"log"
gin "github.com/darkit/gin"
)
func main() {
app := gin.Default()
r := app.Router()
r.GET("/ping", func(c *gin.Context) {
c.Success(gin.H{
"message": "pong",
"request_id": c.RequestID(),
})
})
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
默认行为:
:8080RequestID、Recovery、Logger*gin.Contextpackage main
import (
"log"
"time"
gin "github.com/darkit/gin"
"github.com/darkit/gin/middleware"
)
func main() {
app := gin.New(
gin.WithAddr(":9090"),
gin.WithReadTimeout(10*time.Second),
gin.WithWriteTimeout(10*time.Second),
gin.WithGracefulShutdown(15*time.Second),
gin.Production(),
)
r := app.Router()
r.Use(
middleware.CORS(),
middleware.Secure(),
)
v1 := r.Version("1")
v1.HealthCheck()
v1.GET("/users/:id", func(c *gin.Context) {
id, err := c.ParamIntE("id")
if err != nil {
c.BadRequest("invalid id")
return
}
c.Success(gin.H{
"id": id,
})
})
if err := app.Run(); err != nil {
log.Fatal(err)
}
}
从代码结构看,根模块大致分为 5 层:
┌──────────────────────────────────────────────┐ │ Application Handlers / Controllers │ ├──────────────────────────────────────────────┤ │ Router / RegexRouter / AutoRegister │ ├──────────────────────────────────────────────┤ │ Enhanced Context │ ├──────────────────────────────────────────────┤ │ Engine + OptionFunc + Middleware Registry │ ├──────────────────────────────────────────────┤ │ auth/* + middleware/* + pkg/* │ └──────────────────────────────────────────────┘
Engine 是整个框架的聚合根,负责:
*gin.EngineContext增强型 Context 在保留原生 gin.Context 的同时,提供:
Router 将增强型 Context 与路由注册串起来,负责:
func(*Context) 适配到底层 GinRegexRouter 是标准路由未命中时的增强匹配层:
NoRoute 融入 Gin 请求流auth/:认证授权与会话能力middleware/:请求链横切能力pkg/:通用基础设施与工具包. ├── engine.go # Engine 聚合与运行入口 ├── context.go # 核心增强 Context ├── context_*.go # Context 的分能力扩展(auth/upload/image/export/...) ├── router.go # Router 增强与 Swagger 路由元信息 ├── regex_router.go # Chi 风格正则路由 ├── auto_register.go # 控制器自动注册 ├── options.go # OptionFunc 配置模式 ├── auth/ # 认证子系统 ├── middleware/ # 中间件生态 ├── pkg/ # 基础能力工具包 ├── docs/ # 参考文档与扩展说明 └── examples/ # 可运行示例
| 路径 | 作用 |
|---|---|
auth/ | 认证、授权、会话、refresh token、OAuth2 |
middleware/ | 请求链横切关注点:恢复、限流、缓存、签名校验等 |
pkg/cache | 缓存接口与实现 |
pkg/lifecycle | 服务运行与优雅停机 |
pkg/logger | 日志抽象 |
pkg/swagger | Swagger/OpenAPI 文档生成 |
pkg/mail | 邮件能力 |
pkg/sms | 短信/验证码能力 |
pkg/websocket | WebSocket 连接能力 |
examples/ | 框架能力示例 |
options.go 使用 OptionFunc 模式组织配置,便于在 New() / Default() 中组合。
app := gin.New(
gin.WithAddr(":8080"),
gin.WithReadTimeout(10*time.Second),
gin.WithWriteTimeout(10*time.Second),
gin.WithGracefulShutdown(30*time.Second),
)
app := gin.New( gin.Development(), ) app = gin.New( gin.Production(), )
根据 options.go:
Development():设置较宽松的 ReadTimeoutProduction():设置 ReadTimeout、WriteTimeout 与优雅关闭超时app := gin.New(
gin.WithTrustedProxies([]string{"127.0.0.1", "10.0.0.0/8"}),
)
app := gin.New( gin.WithLogger(customLogger), gin.WithCache(customCache), )
app := gin.New(
gin.WithUploadDir("./uploads"),
gin.WithMaxFileSize(10<<20),
gin.WithMaxMultipartMemory(32<<20),
gin.WithAllowedExts("jpg", "png", "pdf"),
)
app := gin.New( gin.WithMail(mailCfg), gin.WithSMS(smsCfg), )
app := gin.New(
gin.WithAuth(auth.AuthConfig{
Secret: "replace-me",
Expiry: 24 * time.Hour,
TokenStyle: auth.TokenStyleJWT,
}),
)
启用后:
Engine 会初始化内部 auth.Managerc.Auth() 获取认证上下文app := gin.New(
gin.EnableSwagger(swagger.SwaggerConfig{
Title: "Example API",
Description: "Generated by github.com/darkit/gin",
Version: "v1.0.0",
}),
)
启用后默认注册:
/swagger/swagger/doc.json并可通过 Router.GET(...).Doc(...).Description(...).Param(...).Response(...).Tag(...) 追加路由文档元信息。
r.Resource("users", userController)
将注册:
GET /usersPOST /usersGET /users/:idPUT /users/:idPATCH /users/:idDELETE /users/:idtype UserController struct{}
func (u *UserController) GetProfile(c *gin.Context) {
c.Success(gin.H{"ok": true})
}
func (u *UserController) GetOrderIDRegex(c *gin.Context) {
c.Success(gin.H{"id": c.GetString("regex:id")})
}
func main() {
app := gin.Default()
r := app.Router()
r.AutoRegister(&UserController{}, gin.WithPrefix("/api/users"))
}
rx := app.RegexRouter()
rx.GET("/orders/{id:[0-9]+}", func(c *gin.Context) {
c.Success(gin.H{
"order_id": c.GetString("regex:id"),
})
})
该模块并不是替代 Gin 的“重写版”,而是基于 Gin 的增强层:
github.com/gin-gonic/gin如果你已经熟悉 Gin,这个模块的上手成本会很低。
推荐在以下场景使用:
gin.Default() + Router() 开始WithAuth(),并在生产环境切换到 Redis 存储WithLogger()、WithCache()、Production() 与中间件栈RegexRouter() 或 AutoRegister(..., WithRegexPattern(...))仓库现有文档声明为 MIT 许可。若用于公开分发,建议在仓库根目录补充标准 LICENSE 文件以便自动识别。