Go语言中常用的中间件有哪些
更新时间:2023-07-10Go语言中常用的中间件
1. 中间件是什么
中间件指的是介于客户端和服务器端之间的一层处理器。它可以用来增强服务器的功能,比如添加日志、恢复机制、认证/授权等。
在Go语言中,中间件通常是一个函数或一个实现了http.Handler接口的结构体。它拥有传递http.Request和http.ResponseWriter参数的能力,并且可以调用后续的中间件或者处理器。
2. 日志中间件
日志中间件用于记录HTTP请求和响应的相关信息,以便于后续的分析和调试。下面是一个简单的日志中间件的例子:
func Logger(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 记录请求开始时间和请求地址 start :=time.Now() path :=r.URL.Path // 调用后续的中间件或者处理器 next.ServeHTTP(w, r) // 计算请求处理时间 latency :=time.Since(start) // 打印日志 log.Printf("%s %s %s", r.Method, path, latency) }) }
3. 恢复中间件
恢复中间件用于在程序发生Panic的时候进行恢复,以便于程序不会意外崩溃。下面是一个简单的恢复中间件的例子:
func Recovery(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err :=recover(); err !=nil { // 打印堆栈信息 debug.PrintStack() // 给客户端返回500错误 http.Error(w, "Internal Server Error", http.StatusInternalServerError) } }() // 调用后续的中间件或者处理器 next.ServeHTTP(w, r) }) }
4. 跨域中间件
跨域中间件用于解决跨域请求的问题。由于浏览器的安全策略,通过ajax等方式发出的跨域请求会被阻止,因此需要在服务器端添加一些特殊的HTTP头部。下面是一个简单的跨域中间件的例子:
func Cors(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 允许任何来源的跨域请求 w.Header().Set("Access-Control-Allow-Origin", "*") // 允许特定的HTTP方法 w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE") // 允许特定的HTTP头部字段 w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") // 如果是OPTIONS请求,直接返回200 if r.Method==http.MethodOptions { w.WriteHeader(http.StatusOK) return } // 调用后续的中间件或者处理器 next.ServeHTTP(w, r) }) }