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

Posted

技术标签:

【中文标题】什么是 http 请求多路复用器?【英文标题】:What is an http request multiplexer? 【发布时间】:2017-03-21 13:19:06 【问题描述】:

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

我读到了:

在 go ServeMux 中是一个 HTTP 请求多路复用器。它匹配的 URL 针对已注册模式和调用列表的每个传入请求 与 URL 最匹配的模式的处理程序。

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

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

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

【问题讨论】:

当你这样做时,你正在使用多路复用器——即http.DefaultServeMux 如果您将 nil 作为第二个参数传递,ListenAndServe 将使用 http.DefaultServeMux 请求多路复用器也称为请求路由器。它使用一组规则将传入请求路由到处理程序。 【参考方案1】:

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

我给你一个简单的例子

type CustomMultiplexer struct 

给定的多路复用器必须实现 ServeHTTP 方法才能注册 int 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 方法用作我给定的简单多路复用器。

【讨论】:

【参考方案2】:

来自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 函数侦听具有不同路由的不同端口时。

【讨论】:

以上是关于什么是 http 请求多路复用器?的主要内容,如果未能解决你的问题,请参考以下文章

SPDY 多路复用使请求比 HTTP 慢

HTTP2多路复用指什么

grpc-go源码剖析七十五之多路复用简单介绍以及测试用例说明?

IO多路复用/基于IO多路复用+socket实现并发请求/协程

HTTP/1.1 流水线和 HTTP/2 多路复用有啥区别?

python I/O多路复用 使用http完成http请求