golang,go,博客,开源,编程

golang每日一库之urfave/negroni

Updated on with 0 views and 0 comments

urfave/negroni 是一个轻量级的、可扩展的 Go 中间件库,专为构建 HTTP 服务而设计。

它的核心理念是中间件栈(Middleware Stack),可以像洋葱一样一层层包裹处理请求,非常适合构建具有清晰请求生命周期的 Web 应用或 API。

GitHub 地址:https://github.com/urfave/negroni


特点

  • 中间件机制清晰简洁:支持多个中间件,按顺序执行
  • 兼容 http.Handler 接口:能无缝接入标准库或其他框架(如 Gorilla Mux)
  • 支持中间件链式调用和终止
  • 自带常用中间件:Recovery、Logger、Static 等
  • 极易扩展:只需实现 negroni.Handler 接口

安装

go get github.com/urfave/negroni

快速🌰

package main

import (
    "fmt"
    "net/http"
    "github.com/urfave/negroni"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello from Negroni!")
    })

    n := negroni.New()
    n.Use(negroni.NewLogger())      // 日志中间件
    n.Use(negroni.NewRecovery())    // 恢复 panic 的中间件
    n.UseHandler(mux)               // 最终处理器

    http.ListenAndServe(":3000", n)
}

自定义中间件

Negroni 的中间件需要实现以下接口:

type Handler interface {
    ServeHTTP(http.ResponseWriter, *http.Request, http.HandlerFunc)
}

自定义一个简单的中间件:

type MyMiddleware struct{}

func (m *MyMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
    fmt.Println("Before request")
    next(w, r)
    fmt.Println("After request")
}

注册:

n := negroni.New()
n.Use(&MyMiddleware{})

常用内置中间件

中间件说明
negroni.NewLogger()打印每个请求的日志
negroni.NewRecovery()捕获 panic,防止服务器崩溃
negroni.NewStatic(http.Dir("public"))静态文件服务

与其他配合使用

配合 Gorilla Mux 使用:

r := mux.NewRouter()
r.HandleFunc("/api", handler)

n := negroni.Classic() // 包含 Logger, Recovery
n.UseHandler(r)
http.ListenAndServe(":3000", n)

举🌰:添加认证中间件

type AuthMiddleware struct{}

func (a *AuthMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
    token := r.Header.Get("Authorization")
    if token != "secret-token" {
        http.Error(w, "Unauthorized", http.StatusUnauthorized)
        return
    }
    next(w, r)
}

第三方兼容中间件

以下是兼容 Negroni 的中间件列表,如果你也有兼容 Negroni 的中间件,如果想提交自己的中间件,建议你附上 PR 链接。

中间件作者描述
authzYang Luo支持ACL, RBAC, ABAC的权限管理中间件,基于Casbin
bindingMatt HoltHTTP 请求数据注入到 structs 实体
cloudwatchColin SteeleAWS CloudWatch 矩阵的中间件
corsOlivier PoitreyCross Origin Resource Sharing (CORS) support
cspAwake Networks基于Content Security Policy(CSP)
delayJeff Martinez为endpoints增加延迟时间. 在测试严重网路延迟的效应时好用
New Relic Go AgentYadvendar Champawat官网New Relic Go Agent (目前正在测试阶段)
gorelicJingwen Owen OuNew Relic agent for Go runtime
GracefulTyler Bunnell优雅关闭 HTTP 的中间件
gzipphyber响应流 GZIP 压缩
JWT MiddlewareAuth0Middleware checks for a JWT on the Authorization header on incoming requests and decodes it
logrusDan Buch基于 Logrus-based logger 日志
oauth2David BochenskioAuth2 中间件
ontheflyAlexander Rødseth快速生成 TinySVG, HTML and CSS 中间件
permissions2Alexander RødsethCookies, 用户和权限
prometheusRene Zbinden简易建立矩阵端点给prometheus建构工具
renderCory Jacobsen渲染 JSON, XML and HTML 中间件
RestGatePrasanga SiripalaREST API 接口的安全认证
secureCory JacobsenMiddleware that implements a few quick security wins
sessionsDavid BochenskiSession 会话管理
statsFlorent Messa检测 web 应用当前运行状态信息 (响应时间等等。)
VanGoHTaylor WrobelConfigurableAWS-Style 基于 HMAC 鉴权认证的中间件
xrequestidAndrea Franz给每个请求指定一个随机 X-Request-Id 头的中间件
mgo sessionJoel James处理在每个请求建立与关闭 mgo sessions
digitsBilal Amarni处理Twitter Digits 的认证
statsChirag Guptaendpoints用的管理QPS与延迟状态的中间件非同步地将状态刷入InfluxDB
ChaosMarc Falzon以编程方式在应用程式中插入无序行为的中间件

总结

Negroni 是 Go 生态中最早也是最经典的中间件框架之一,它强调中间件链、简洁可插拔,非常适合用于理解中间件机制或构建简单项目。

性能上不及 Echo、Gin。

读完源码之后,开发中间件基本上就不是难题了。


标题:golang每日一库之urfave/negroni
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/06/12/1749712902825.html
联系:scotttu@163.com