Files
build-web-application-with-…/3.3.md
2012-09-04 23:51:37 +08:00

2.6 KiB
Raw Blame History

#3.3 Go如何使得web工作 前面小节介绍了如何通过Go搭建一个web服务我们可以看到简单的应用了一个net/http包就方便的搭建起来了。那么他底层到底是怎么做的呢但是万变不离其宗他离不开我们第一小节介绍的web工作方式。

##对应web工作方式的几个概念

Request用户请求的信息

Response服务器需要反馈给客户端的信息

Conn用户的每次请求链接

Handler处理请求和生成返回信息的处理逻辑

##分析http包运行机制

(1) 创建listen socket, 在指定的监听端口, 等待客户端请求的到来

(2) listen socket接受客户端的请求, 得到client socket, 接下来通过client socket与客户端通信

(3) 处理客户端的请求, 首先从client socket读取http请求的协议头, 如果是post协议, 还可能要 读取客户端上传的数据, 然后处理请求, 准备好客户端需要的数据, 通过client socket写给客户端

##web执行的过程分析

针对前一小节里面的代码我们来一行行的分析一下大概的http包里面执行流程应该是这样

  • 首先调用Http.HandleFunc

    按顺序做了几件事:

    1 调用了DefaultServerMux的HandleFunc

    2 调用了DefaultServerMux的Handle

    3 往DefaultServeMux的map[string]muxEntry中增加对应的handler和路由规则

  • 其次调用http.ListenAndServe(":12345", 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 判断header是否为空如果没有设置handler这个例子就没有设置handlerhandler就设置为DefaultServeMux

    8 调用handler的ServeHttp

    9 在这个例子中下面就进入到DefaultServerMux.ServeHttp

    10 根据request选择handler并且进入到这个handler的ServeHTTP

         mux.handler(r).ServeHTTP(w, r)
    

    11 选择handler

    A 判断是否有路由能满足这个request循环遍历ServerMux的muxEntry

    B 如果有路由满足调用这个路由handler的ServeHttp

    C 如果没有路由满足调用NotFoundHandler的ServeHttp

LastModified

  • Id