阅读net/http源码
参考资料:golang web应用开发
Conn
golang http中使用goroutines来为每个请求都创建一个conn来实现高并发和高性能
c, err := srv.newConn(rw)
if err != nil {
continue
}
go c.serve()
因此每个请求不会互相堵塞,并且每个请求互相独立不会影响
ServeMux
ServeMux实质上是一个路由器,它的定义如下:
type ServeMux struct {
mu sync.RWMutex //锁,因为涉及并发
m map[string]muxEntry // 路由表
hosts bool // 是否在任意的规则中带有host信息
}
路由表项如下:
type muxEntry struct {
explicit bool // 是否完全匹配
h Handler // 处理函数
pattern string //匹配字符串
}
处理函数如下:
type Handler interface {
ServeHTTP(ResponseWriter, *Request) // 路由
}
路由:
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
if r.RequestURI == "*" {
w.Header().Set("Connection", "close")
w.WriteHeader(StatusBadRequest)
return
}
h, _ := mux.Handler(r)
h.ServeHTTP(w, r)
}
路由会判断是否已到头,若到头则返回,并关闭链接,不然就继续多路路由,继续传递。
总结
其实http源代码我并没有看的太懂。。。
这篇总结基本是跟着golang web应用开发写的,自己也算了解了一些基本流程和大概,但并没有太多新的见解,如果ta和老师觉得这篇阅读分享质量太低就无视吧。。 纯当写个乐子了~