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

46

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

我读了这个:

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

那么这与仅进行如下操作有何不同:

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

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


12
当你这样做时,你正在使用多路复用器,也就是http.DefaultServeMux - hobbs
2
如果你将第二个参数传递为 nil,ListenAndServe 将使用 http.DefaultServeMux。 - Yandry Pozo
5
请求多路复用器又称为请求路由器。它使用一些规则将传入的请求路由到处理程序。 - Charlie Tumahai
2个回答

28

net/http 的 GoDoc 和源代码。

ListenAndServe 使用给定的地址和处理程序启动一个HTTP服务器。处理程序通常为nil,这意味着使用 DefaultServeMuxHandleHandleFunc 将处理程序添加到 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.ListenAndServe 函数的情况下使用。


7

在 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方法作为一个简单的多路复用器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接