当下http1.1对于长连接是默认开启的,golang的内置httpServer也很好的支持了这一点。今天查阅资料时,发现自己写了这么多的接口,但是对于httpServer是如何实现长连接的,却一时说不上来。于是就去go的src源码里面翻了翻。
本文只讨论server端是如何确保长连接的,client端如何确保呢,这里先简要说一下,当调用client.Do()
函数后,通过transport去获取缓存的连接,详细的暂不讨论。
server端我们结合源码来看,httpServer启动之后,会为每一个到来的请求去创建一个goroutine,这点没问题,之前我也是这么想的,实则并不一定是这样。确切的说,应该是为每一个新的tcp连接去创建一个goroutine,为什么这样讲呢,看源码:
func (srv *Server) Serve(l net.Listener) error {
defer l.Close()
if fn := testHookServerServe; fn != nil {
fn(srv, l)
}
.
.
.
c := srv.newConn(rw)
c.setState(c.rwc, StateNew) // before Serve can return
go c.serve(ctx) //新建连接
}
}
这段代码的最后会依靠新建的连接去起一个goroutine,继续往下看:
// Serve a new connection.
func (c *conn) serve(ctx context.Context) {