共计 1262 个字符,预计需要花费 4 分钟才能阅读完成。
中间件的原理:
中间件的基本原理是拦挡和解决申请,而后将申请传递给下一个处理程序(中间件或理论的申请处理函数)。它容许在申请解决流程中插入自定义逻辑。中间件能够在解决申请之前执行某些操作(预处理),也能够在解决申请之后执行某些操作(后处理)。
在 Go 语言中,中间件通常示意为一个函数,该函数承受一个处理程序作为参数并返回一个新的处理程序。新的处理程序能够在执行原始处理程序之前和之后执行其余操作。这样,中间件能够链接在一起,造成一个解决链,申请沿着这个链顺次传递,直到最初一个处理程序实现解决。
实现一个中间件:
以下是应用 Go 规范库 net/http 实现一个简略中间件的示例。在这个示例中,咱们创立了一个申请日志记录中间件,它会在解决申请之前记录申请信息,而后将申请传递给下一个处理程序。
go
package main
import (
"fmt"
"net/http"
"time"
)
// 日志记录中间件
func Logger(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 记录申请开始工夫
startTime := time.Now()
// 解决申请
next.ServeHTTP(w, r)
// 计算申请解决工夫并输入日志
duration := time.Since(startTime)
fmt.Printf("%s %s %v\n", r.Method, r.URL.Path, duration)
})
}
// 示例申请处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {w.Write([]byte("Hello, world!"))
}
func main() {
// 创立一个新的路由处理器
mux := http.NewServeMux()
// 注册申请处理函数,并将中间件利用于该处理函数
mux.Handle("/", Logger(http.HandlerFunc(helloHandler)))
// 启动 HTTP 服务器
http.ListenAndServe(":8080", mux)
}
在这个示例中,咱们定义了一个日志记录中间件 Logger。它承受一个 http.Handler 类型的参数(next),并返回一个新的 http.Handler 实例。新的处理程序首先记录申请的开始工夫,而后调用 next.ServeHTTP(w, r) 执行下一个处理程序(原始处理程序或其余中间件)。申请解决实现后,计算申请解决工夫并输入日志。
在 main() 函数中,咱们应用 http.NewServeMux() 创立一个新的路由处理器,并应用 mux.Handle(“/”, Logger(http.HandlerFunc(helloHandler))) 将日志记录中间件利用于 helloHandler 处理函数。这样,在解决来自客户端的申请时,申请首先通过日志记录中间件,而后才达到 helloHandler。
正文完