美文网首页
goweb协程

goweb协程

作者: 桃木剑降妖 | 来源:发表于2017-09-10 16:52 被阅读0次

    参考
    Go如何使得web工作
    go:net/http

    • ListenAndServe执行流程如下图,Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。这是Go高效的保证。

    一、ListenAndServe流程图

    3.3.illustrator.png

    二、GoWeb详细执行流程

    • 首先调用http.HandleFunc,按顺序做了几件事:
    1. 调用了DefaultServeMux的HandleFunc
    2. 调用了DefaultServeMux的Handle
    3. 往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则
    • 其次调用http.ListenAndServe(":9090", nil),按顺序做了几件事情:
    1. 实例化Server
    2. 调用Server的ListenAndServe()
    3. 调用net.Listen("tcp", addr)监听端口
    4. 启动一个for循环,在循环体中Accept请求
    5. 对每个请求实例化一个Conn,并且开启一个goroutine为这个请求进行服务go c.serve()
    6. 在中读取每个请求的内容w, err := c.readRequest()
    7. 判断handler是否为空,如果没有设置handler(这个例子就没有设置handler),handler就设置为DefaultServeMux
    8. 调用handler的ServeHttp
    9. 在这个例子中,下面就进入到DefaultServeMux.ServeHttp
    10. 根据request选择handler,并且进入到这个handler的ServeHTTP
      mux.handler(r).ServeHTTP(w, r)
    11. 选择handler:
      A 判断是否有路由能满足这个request(循环遍历ServerMux的muxEntry)
      B 如果有路由满足,调用这个路由handler的ServeHttp
      C 如果没有路由满足,调用NotFoundHandler的ServeHttp

    相关文章

      网友评论

          本文标题:goweb协程

          本文链接:https://www.haomeiwen.com/subject/zlqtsxtx.html