只要是入门过 Golang 的同学应该都知道 Golang 原生的 net/http 包功能很强大,通过 http.HandleFunc() 和 http.ListenAndServe()两个函数就可以创建一个简单的 web 服务,示例代码如下:
package main import ( "fmt" "net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello!") } func main() { http.HandleFunc("/hello", sayHello) http.ListenAndServe(":80", nil) }
在网页中输入 http://localhost:80/hello,就可以得到 Hello!的字符串。
理解 HTTP 服务只需要关注两个端-客户端(client)和服务端(server),弄清楚如何接收处理来自 client 的 request,并向 client 返回 response。
接收request的过程中,最重要的是处理路由,即实现一个多路复用器(Multiplexer,作用是根据请求的 URL 找到对应的处理函数(handler)来处理 request 和构建 response )。DefaultServeMux 是 net/http 包提供的 Multiplexer,是 ServeMux 的一个实例。我们也可以根据自己的需求通过实现 ServeMux 来实现一个 Multiplexer。DefaultServeMux 源码如下:
var DefaultServeMux = &defaultServeMuxvar defaultServeMux ServeMux
HandleFunc()函数用于为指定的URL注册一个处理器。HandleFunc()处理器函数会在内部调用DefaultServeMux对象对应的方法,其内部实现源码如下:
// HandleFunc registers the handler function for the given pattern // in the DefaultServeMux. // The documentation for ServeMux explains how patterns are matched. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) }
由此看出,我们也可以使用默认多路复用器注册多个处理器,达到与处理器一样的作用。
那么问题来了,既然 net/http 包功能很强大了,那还需要第三方框架吗?
如果是很简单的一个项目,只需要提供几个接口并且业务逻辑也很简单,net/http 包就能满足需求。但平常开发中,大部分场景下,net/http 包的功能满足不了业务场景的需求,例如三方框架提供的如下功能: