什么是 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 请求多路复用器?的主要内容,如果未能解决你的问题,请参考以下文章
grpc-go源码剖析七十五之多路复用简单介绍以及测试用例说明?
IO多路复用/基于IO多路复用+socket实现并发请求/协程