增加3.3小节
This commit is contained in:
85
3.3.md
Normal file
85
3.3.md
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#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(这个例子就没有设置handler),handler就设置为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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## links
|
||||||
|
* [目录](<preface.md>)
|
||||||
|
* 上一节: [GO搭建一个简单的web服务](<3.2.md>)
|
||||||
|
* 下一节: [Go的http包执行原理](<3.4.md>)
|
||||||
|
|
||||||
|
## LastModified
|
||||||
|
* $Id$
|
||||||
BIN
images/3.3.http.png
Normal file
BIN
images/3.3.http.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
Reference in New Issue
Block a user