golang实现HTTP中间件的惯用方式插件库negroni的使用
Golang实现HTTP中间件的惯用方式插件库Negroni的使用
Negroni是Go语言中一种惯用的Web中间件方法。它小巧、非侵入式,并鼓励使用net/http
Handlers。
快速开始
安装好Go并设置好GOPATH后,创建第一个.go
文件,例如server.go
:
package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni/v3"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
})
n := negroni.Classic() // 包含一些默认中间件
n.UseHandler(mux)
http.ListenAndServe(":3000", n)
}
安装Negroni包(注意:需要Go 1.1或更高版本):
go get github.com/urfave/negroni/v3
然后运行服务器:
go run server.go
现在你将在localhost:3000
上运行一个Go net/http
Web服务器。
Negroni是一个框架吗?
Negroni不是一个框架。它是一个专注于中间件的库,设计为直接与net/http
一起工作。
路由
Negroni是"自带路由器"(BYOR)。Go社区已经有许多优秀的HTTP路由器可用,Negroni通过完全支持net/http
与它们良好配合。例如,与Gorilla Mux集成如下:
router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)
n := negroni.New(Middleware1, Middleware2)
// 或者使用Use()函数添加中间件
n.Use(Middleware3)
// 路由器最后添加
n.UseHandler(router)
http.ListenAndServe(":3001", n)
negroni.Classic()
negroni.Classic()
提供了一些对大多数应用有用的默认中间件:
negroni.Recovery
- 恐慌恢复中间件negroni.Logger
- 请求/响应日志中间件negroni.Static
- 在"public"目录下提供静态文件服务
这使得可以轻松地开始使用Negroni的一些有用功能。
处理器(Handlers)
Negroni提供了双向中间件流。这是通过negroni.Handler
接口实现的:
type Handler interface {
ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)
}
如果中间件尚未写入ResponseWriter
,它应该调用链中的下一个http.HandlerFunc
来让位给下一个中间件处理器。这可以用来做很多好事:
func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
// 之前做一些事情
next(rw, r)
// 之后做一些事情
}
你可以使用Use
函数将其映射到处理器链:
n := negroni.New()
n.Use(negroni.HandlerFunc(MyMiddleware))
你也可以映射普通的http.Handler
:
n := negroni.New()
mux := http.NewServeMux()
// 映射你的路由
n.UseHandler(mux)
http.ListenAndServe(":3000", n)
路由特定中间件
如果你有一组需要执行特定中间件的路由,你可以简单地创建一个新的Negroni实例并将其用作路由处理器。
router := mux.NewRouter()
adminRoutes := mux.NewRouter()
// 在这里添加管理路由
// 为管理中间件创建一个新的negroni
router.PathPrefix("/admin").Handler(negroni.New(
Middleware1,
Middleware2,
negroni.Wrap(adminRoutes),
))
捆绑的中间件
静态文件(Static)
这个中间件将提供文件系统上的文件。如果文件不存在,它将把请求代理给下一个中间件。
package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni/v3"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
})
n := negroni.New()
n.Use(negroni.NewStatic(http.Dir("/tmp")))
n.UseHandler(mux)
http.ListenAndServe(":3002", n)
}
恢复(Recovery)
这个中间件捕获panic
并以500
状态码响应。
package main
import (
"net/http"
"github.com/urfave/negroni/v3"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
panic("oh no")
})
n := negroni.New()
n.Use(negroni.NewRecovery())
n.UseHandler(mux)
http.ListenAndServe(":3003", n)
}
日志(Logger)
这个中间件记录每个传入的请求和响应。
package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni/v3"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
})
n := negroni.New()
n.Use(negroni.NewLogger())
n.UseHandler(mux)
http.ListenAndServe(":3004", n)
}
第三方中间件
有许多与Negroni兼容的第三方中间件可用,包括:
- 认证中间件 (authz, oauth2, JWT等)
- 监控中间件 (New Relic, Prometheus等)
- 安全中间件 (CORS, CSP等)
- 会话管理
- 数据绑定
- 和其他许多
示例项目
- mooseware - 编写Negroni中间件处理程序的骨架
- Go-Skeleton - 基于Go/Negroni的Web项目有效骨架结构
Negroni由Code Gangsta精心设计。
更多关于golang实现HTTP中间件的惯用方式插件库negroni的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html