golang,go,博客,开源,编程
urfave/negroni
是一个轻量级的、可扩展的 Go 中间件库,专为构建 HTTP 服务而设计。
它的核心理念是中间件栈(Middleware Stack),可以像洋葱一样一层层包裹处理请求,非常适合构建具有清晰请求生命周期的 Web 应用或 API。
GitHub 地址:https://github.com/urfave/negroni
http.Handler
接口:能无缝接入标准库或其他框架(如 Gorilla Mux)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 链接。
中间件 | 作者 | 描述 |
---|---|---|
authz | Yang Luo | 支持ACL, RBAC, ABAC的权限管理中间件,基于Casbin |
binding | Matt Holt | HTTP 请求数据注入到 structs 实体 |
cloudwatch | Colin Steele | AWS CloudWatch 矩阵的中间件 |
cors | Olivier Poitrey | Cross Origin Resource Sharing (CORS) support |
csp | Awake Networks | 基于Content Security Policy(CSP) |
delay | Jeff Martinez | 为endpoints增加延迟时间. 在测试严重网路延迟的效应时好用 |
New Relic Go Agent | Yadvendar Champawat | 官网New Relic Go Agent (目前正在测试阶段) |
gorelic | Jingwen Owen Ou | New Relic agent for Go runtime |
Graceful | Tyler Bunnell | 优雅关闭 HTTP 的中间件 |
gzip | phyber | 响应流 GZIP 压缩 |
JWT Middleware | Auth0 | Middleware checks for a JWT on the Authorization header on incoming requests and decodes it |
logrus | Dan Buch | 基于 Logrus-based logger 日志 |
oauth2 | David Bochenski | oAuth2 中间件 |
onthefly | Alexander Rødseth | 快速生成 TinySVG, HTML and CSS 中间件 |
permissions2 | Alexander Rødseth | Cookies, 用户和权限 |
prometheus | Rene Zbinden | 简易建立矩阵端点给prometheus建构工具 |
render | Cory Jacobsen | 渲染 JSON, XML and HTML 中间件 |
RestGate | Prasanga Siripala | REST API 接口的安全认证 |
secure | Cory Jacobsen | Middleware that implements a few quick security wins |
sessions | David Bochenski | Session 会话管理 |
stats | Florent Messa | 检测 web 应用当前运行状态信息 (响应时间等等。) |
VanGoH | Taylor Wrobel | ConfigurableAWS-Style 基于 HMAC 鉴权认证的中间件 |
xrequestid | Andrea Franz | 给每个请求指定一个随机 X-Request-Id 头的中间件 |
mgo session | Joel James | 处理在每个请求建立与关闭 mgo sessions |
digits | Bilal Amarni | 处理Twitter Digits 的认证 |
stats | Chirag Gupta | endpoints用的管理QPS与延迟状态的中间件非同步地将状态刷入InfluxDB |
Chaos | Marc Falzon | 以编程方式在应用程式中插入无序行为的中间件 |
Negroni
是 Go 生态中最早也是最经典的中间件框架之一,它强调中间件链、简洁可插拔,非常适合用于理解中间件机制或构建简单项目。
性能上不及 Echo、Gin。
读完源码之后,开发中间件基本上就不是难题了。