Go 标准库的 net/http 提供了完整的 HTTP 服务器和客户端实现。许多流行的 Go Web 框架都构建在它之上,理解其内部原理对编写高性能 Web 服务至关重要。

HTTP 服务器架构

net/http 的 Server 为每个连接创建一个 goroutine,这是 Go 处理高并发的基础。每个请求的处理都是独立的,不会相互阻塞。

srv := &http.Server{
    Addr:         ":8080",
    Handler:      mux,
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  120 * time.Second,
}
srv.ListenAndServe()

中间件模式

Go 的中间件本质上是函数装饰器,将 http.Handler 包装进另一个 http.Handler:

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
    })
}

主流框架对比

理解标准库的 HTTP 设计,才能在使用框架时知其所以然。