路由器里存储好了相应的路由规则(Response / Request)之后,那么具体的请求又是怎么分发的呢? 路由器接收到请求之后调用 mux.handler(r).ServeHTTP(w,r) 也就是调用对应路由的 handler 的 ServerHTTP 接口,让我们来看看 mux.handler(r)是怎么处理的↓ image
我们可以看到它是根据用户请求的 URL 和路由器里面存储的 map 去匹配的,当匹配到之后返回存储的 handler,调用这个 handler 的 ServeHTTP 接口就可以执行相应的函数了
通过上面的介绍,我们大致了解了整个构建路由的过程,Go其实支持外部实现的路由器 而 ListenAndServe 的第二个参数就是用来配置外部路由器的,它是一个 Handler 接口,所以我们的外部路由只要实现了 Handler 接口就可以发挥作用,因此我们可以在自己实现的路由器的 ServeHTTP 里面实现自定义的路由功能
贴个代码↓
点击查看代码 实现效果: image
Go 代码的执行流程 最后我们来梳理一下整个代码的执行过程
首先调用 Http.HandleFunc 按照顺序做了这几件事: 调用了 DefaultServeMux 的 HandleFunc 调用了 DefaultServeMux 的 Handler 往 DefaultServeMux 的 map[string]muxEntry 中增加对应的handler 和 路由规则 其次调用 http.ListenAndServe(":9090",nil) 按顺序做了这几件事: 实例化 Server
调用 Server 的 ListenAndServer()
调用 net.Listen("tcp", addr)监听端口
启动一个 for 循环,在循环题中 Accept 请求
对每一个请求实例化一个 Conn,并且开启一个 goroutine 为这个请求开一个 go.c.serve()
读取每个请求的内容 w, err := c.readRequest()
判断 handler 是否为空,如果没有就设置 handler(默认设置)
调用 handler 的ServeHTTP
进入到 DefaultServerMux.ServeHTTP
根据 request 选择 handler, 并且进去到这个 handler 的 ServerHTTP image
选择 handler A 判断是否有路由能满足这个 request (循环遍历 ServerMux 的 muxEntry) B 如果满足,则调用这个路由 handler 的 ServeHTTP C 如果不满足,则调用 NotFoundHandler 的 ServeHTTP
总结 到这里为止我们从第一章介绍了 HTTP 协议,DNS 解析过程,了解了 Web 的工作方式,第二章分别用 Go 搭建一个最简单的 Web 服务,并且了解 Golang 运行 web 的原理,在最后一章,我们还深入到 net/http 包中的源码里为大家揭开了更底层的原理
既然对 Go 开发 Web 有了初步的了解,接下来我们就可以有十足的信心去学习更多 Go For Web 的后续内容了!
关于 Golang 基础部分 以及 计算机网络部分读者可以参阅我的往期 blog👇 Goalng:基础复习一遍过
漫谈计算机网络:网络层 ------ 重点:IP协议与互联网路由选择协议
以上
看完记得留下一个👍