golang httpServer对于keepAlive长连接的处理方式

本文探讨了Go语言内置HTTP服务器如何处理HTTP 1.1的KeepAlive长连接。通过分析源码,指出服务器并非为每个请求创建goroutine,而是针对每个新的TCP连接创建一个,该goroutine能接收客户端的多次请求,直到出现错误或超时才关闭连接。同时,说明了一个TCP连接在HTTP 2.0的多路复用下能同时处理多个请求的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当下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) {
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值