net/http实现原理阅读
原理图
net/http处理Http请求的基本流程
- 服务端创建
socket
,绑定并监听指定的IP地址和端口;ListenAndServer(...)
- 客户端与
Listen Socket
连接,确认请求后,客户端得的Client Socket
,客户端通过这个与Listen Socket
通信;srv.Server(...)
- 服务端创建一个go程来处理客户端请求,读取header和数据,交给相应的
handler
处理,结果通过Client Socket
交给客户端;c.server(...)
包中的关键接口或结构体
-
Server结构体
- 定义与http服务器相关的参数
-
Handler接口
-
所有请求的Handler、路由均需满足该接口
-
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
-
-
ServeMux结构体
-
ServeMux是一种HTTP请求多路复用器。它根据已注册的列表匹配每个请求的URL,并调用与URL最匹配的处理程序。
-
type ServeMux struct { mu sync.RWMutex m map[string]muxEntry es []muxEntry // slice of entries sorted from longest to shortest. hosts bool // whether any patterns contain hostnames }
-
muxEntry
类型,则是保存了Handler请求处理器和匹配的模式字符串 -
type muxEntry struct { h Handler // 这个路由表达式对应哪个handler pattern string //匹配字符串 }
-
-
http.HandlerFunc函数类型
Http服务器执行流程
开启监听
服务器中的http.ListenAndServer()
方法启动服务:
func ListenAndServe(addr string, handler Handler) error {
server := &Server{
Addr: addr, Handler: handler}
return server.ListenAndServe()
}
生成了Server
结构体,调用其方法ListenAndServe
。
func (srv *Server) ListenAndServe() error {
if srv.shuttingDown() {
return ErrServerClosed
}
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(ln)
}
net.Listen
来进行对地址的监听,返回一个listener,传递给server.Serve()
方法;
func (srv *Server) Serve(l net.Listener) error {
if fn := testHookServerServe; fn != nil