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

her*_*ain 8 http go multiplexing servemux

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

我看了这个:

在go ServeMux是一个HTTP请求多路复用器.它将每个传入请求的URL与已注册模式的列表进行匹配,并调用与URL最匹配的模式的处理程序.

这与做以下事情有什么不同:

http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)
Run Code Online (Sandbox Code Playgroud)

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

Man*_*uli 7

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

我给了你一个简单的例子

type CustomMultiplexer struct {
}
Run Code Online (Sandbox Code Playgroud)

给定的多路复用器必须实现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
}
Run Code Online (Sandbox Code Playgroud)

我的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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

http.HandleFunc方法就像我给定的简单多路复用器一样工作。


Joh*_*yil 5

来自net/httpGoDoc和Source。

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
Run Code Online (Sandbox Code Playgroud)

如您所见,内部http.Handle通话DefaultServeMux

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

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