Go如何让Web工作的

先来一个例子吧:

程序运行起来,在Postman分别发送get(http://127.0.0.1:8888/sayHelloWorld?name=我是get请求)、post(http://127.0.0.1:8888/sayHelloWorld,name:我是post请求)请求:

一、Web工作方式的几个概念:

1.Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息。

2.Response:服务器需要反馈给客户端的信息。

3.Conn:用户的每次请求链接。

4Handler:处理请求和生产返回信息的处理逻辑。

5.ResponseWriter: 生成Response的接口。

6.ServeMux: 路由,ServeMux也是一种Handler

二、http包执行流程

1.创建Listen Socket 监听指定的端口,等待客户端请求到来。

2.Listen Socket接受客户端的请求,得到Client Socket,接下来通过Client Socket与客户端通信。

3.处理客户端的请求,首先从Client Socket 读取HTTP请求的协议头,如果是POST方法,还可以读取客户端提交的数          据,然后交给相应的handler处理请求,handle处理完毕准备好客户端需要的数据,通过Client Socket写给客户端。

三、Go代码执行流程(结合原码来看更容易理解)

1、首先调用http.HandleFunc("/",HandleRequest)

a. 调用了DefaultServerMux的HandleFunc

b.调用了DefaultServerMux的Handle

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

2、其次调用http.ListenAndServe(":8888",nil)

a. 实例化Serverserver := &Server{Addr: addr, Handler: handler}

b. 调用了Server.ListenAndServe()

c. 调用了net.Listen("tcp", addr) 监听端口,底层用TCP协议搭建了一个服务,然后监听我们设置的端口

d. 启动一个for循环,在循环体中接受请求

e.对每个请求实例化一个Conn  c := srv.newConn(rw)并且开启一个goroutine为这个请求进行服务

   go c.serve(ctx)

f. 读取每个请求的内容w, err := c.readRequest(ctx)

g. 判断handler是否为空,如果没有设置handler,handler就设置为DefaultServeMux

h.  根据request选择handler 并且进入到这个handler的ServeHttp mux.handler(r).ServeHTTP(w, r)

i. 选择路由:

1)判断有没有路由满足这个request(循环遍历ServerMux的muxEntry)

2)如果有路由满足,调用这个路由handler的serveHttp

3)如果没有路由满足,调用NotFoundHandler的ServeHttp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,528评论 0 11
  • 最近在学习Python看了一篇文章写得不错,是在脚本之家里的,原文如下,很有帮助: 一、网络知识的一些介绍 soc...
    qtruip阅读 2,765评论 0 6
  • 01 朋友云突然给我打来电话,我有些诧异,说:“你不是谈恋爱了吗?怎么突然想到给我打电话呀?” 她无奈地笑了笑,说...
    清荷沐阳阅读 471评论 18 15
  • 偷偷看里面动物园,今天就 读这个了,女儿把熊猫的手撕了,我粘好了,她又撕,陪着她看就不会撕!
    依荷妈妈绘本阅读大V店阅读 173评论 0 0