1.13 Go HTTP服务器性能优化:连接池、超时控制、优雅关闭实战技巧
引言
生产环境的HTTP服务器需要高性能和高可用性。本文将深入讲解连接池、超时控制、优雅关闭等性能优化技巧,帮助你构建高性能的HTTP服务器。
一、HTTP客户端连接池
1.1 默认HTTP客户端的问题
packagemainimport("net/http""time")// 问题:每次请求都创建新连接funcbadExample(){resp,err:=http.Get("https://www.example.com")// ...}1.2 配置连接池
packagemainimport("net/http""time")funccreateHTTPClient()*http.Client{transport:=&http.Transport{MaxIdleConns:100,// 最大空闲连接数MaxIdleConnsPerHost:10,// 每个主机的最大空闲连接数IdleConnTimeout:90*time.Second,// 空闲连接超时DisableKeepAlives:false,// 启用Keep-Alive}client:=&http.Client{Transport:transport,Timeout:10*time.Second,// 请求超时}returnclient}funcmain(){client:=createHTTPClient()// 复用连接fori:=0;i<100;i++{resp,err:=client.Get("https://www.example.com")iferr!=nil{continue}resp.Body.Close()}}二、HTTP服务器优化
2.1 配置服务器参数
packagemainimport("net/http""time")funccreateServer()*http.Server{return&http.Server{Addr:":8080",ReadTimeout:15*time.Second,// 读取超时WriteTimeout:15*time.Second,// 写入超时IdleTimeout:60*time.Second,// 空闲连接超时// 连接管理MaxHeaderBytes:1<<20,// 1MB// 启用HTTP/2// TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),}}funcmain(){server:=createServer()http.HandleFunc("/",func(w http.ResponseWriter,r*http.Request){w.Write([]byte("OK"))})server.ListenAndServe()}2.2 连接限制
packagemainimport("net/http""sync")typeLimitedServerstruct{maxConnsintcurrentintmu sync.Mutex cond*sync.Cond}funcNewLimitedServer(maxConnsint)*LimitedServer{ls:=&LimitedServer{maxConns:maxConns,}ls.cond=sync.NewCond(&ls.mu)returnls}func(ls*LimitedServer)ServeHTTP(w http.ResponseWriter,r*http.Request){// 获取连接ls.mu.Lock()forls.current>=ls.maxConns{ls.cond.Wait()}ls.current++ls.mu.Unlock()// 处理请求deferfunc(){ls.mu.Lock()ls.current--ls.cond.Signal()ls.mu.Unlock()}()// 实际处理逻辑w.Write([]byte("OK"))}funcmain(){server:=NewLimitedServer(100)http.ListenAndServe(":8080",server)}三、超时控制
3.1 请求超时
packagemainimport("context""net/http""time")funchandlerWithTimeout(w http.ResponseWriter,r*http.Request){// 创建带超时的contextctx,cancel:=context