关于go:go中间件

54次阅读

共计 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。

正文完
 0