上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
server
基础服务器,负责客户端接入(HTTP/2, TLS)和请求。逻辑则由处理器(Handler)实现。
// http/server.go type Server struct { // Addr optionally specifies the TCP address for the server to listen on, // in the form "host:port". If empty, ":http" (port 80) is used. Addr string Handler Handler // handler to invoke, http.DefaultServeMux if nil }
源码剖析
标准库提供了简便函数,可用于测试。正式项目,应建议创建实例,并设置相关参数。
如果需要自行监听( REUSEPORT
),可改用 Serve
方法。
// http/server.go func ListenAndServe(addr string, handler Handler) error { server := &Server{Addr: addr, Handler: handler} return server.ListenAndServe() }
// http/server.go func (srv *Server) ListenAndServe() error { addr := srv.Addr if addr == "" { addr = ":http" } ln, err := net.Listen("tcp", addr) return srv.Serve(ln) }
先设置 HTTP/2,然后循环处理接入请求。
为每个客户端生成一个 goroutine,标准方式。
// http/server.go func (srv *Server) Serve(l net.Listener) error { defer l.Close() if err := srv.setupHTTP2_Serve(); err != nil { return err } for { rw, err := l.Accept() c := srv.newConn(rw) go c.serve(connCtx) } }
接下来,依次是 TLS、Request、Response,转入 Handler 处理。
// http/server.go func (c *conn) serve(ctx context.Context) { defer func() { // 拦截恐慌,隔离在单一接入内。 if err := recover(); err != nil && err != ErrAbortHandler { ... } // 关闭连接。(非劫持) if !c.hijacked() { c.close() } }() // TLS if tlsConn, ok := c.rwc.(*tls.Conn); ok { ... } // HTTP/1.x from here on. for { // 准备请求和返回对象。 w, err := c.readRequest(ctx) // 处理器。 serverHandler{c.server}.ServeHTTP(w, w.req) // 结束,清理相关资源。 w.finishRequest() } }
未提供自定义处理器时,使用默认路由。
// http/server.go type serverHandler struct { srv *Server } func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) { handler := sh.srv.Handler if handler == nil { handler = DefaultServeMux } handler.ServeHTTP(rw, req) }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论