什么是 http 请求多路复用器?

What is an http request multiplexer?

我一直在研究 golang,我注意到很多人使用 http.NewServeMux() 函数创建服务器,但我不太明白它的作用。

我读了这个:

In go ServeMux is an HTTP request multiplexer. It matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL.

这与仅仅做类似的事情有何不同:

http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)

使用多路复用的目的是什么?

来自 net/http GoDoc 和来源。

ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux

DefaultServeMux 只是预定义的 http.ServeMux

var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux

如您所见,http.Handle 在内部调用 DefaultServeMux

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

http.NewServeMux() 的目的是拥有您自己的 http.ServerMux 实例,例如当您需要两个 http.ListenAndServe 函数侦听具有不同路由的不同端口时。

Golang 中的多路复用器类似于硬件中的多路复用器,它将一些输入乘以一些输出

我给了你一个简单的例子

type CustomMultiplexer struct {
}

给定的多路复用器必须实现 ServeHTTP 方法才能通过 http 注册到服务器输入

func (mux CustomMultiplexer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        SimpleRequestHandler(w, r)
        return
    }
    http.NotFound(w, r)
    return
}

我的SimpleRequestHandler方法如下

func SimpleRequestHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        mySimpleGetRequestHandler(w, r)
        break
    default:
        http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
        break
    }
}

现在我可以使用我的 CustomMultiplxere 在传入请求之间进行多路复用

func main() {
    customServer := CustomServer{}
    err := http.ListenAndServe(":9001", &customServer)
    if err != nil {
        panic(err)
    }
}

http.HandleFunc 方法作为我给定的简单多路复用器工作。