📖 Net/http 底层实现原理.
了解到能够使用net/http对外进行简单进行扩展,更深层次的理解以后进行分析。
📜 一、net/http库的简单使用.
1 | go复制代码func main() { |
结果:可以看到其比Java中开启一个Web应用是多么便捷,但这不是本文的重点.
📜 二、底层实现原理分析.
我们仍然从上图代码块分析,首先先分析http.HandlerFunc
注入Handler来具体分析.
先说下最终结果就是,其注入的Handler最后都会注入到下面的结构体中.
1 | go复制代码type ServeMux struct { |
虽然说最终会存入改结构体中,但是我们要知道其实如何存入的呢? 存入之后又是怎么进行调用的,所以,接着往下看.
当我们点进去我们写得代码之后,会发现,其会将我们自己的Handler转换为HandlerFunc
,而改结构体实现了net\http
下的Handler
接口,并重写了ServerHTTP
方法,在该方法内部直接调用我们自己的handler.
1 | go复制代码// HandleFunc registers the handler function for the given pattern. |
接下来就是分析ServerMux
是如何进行保存Handler
的.
可以看到会将Handler注册到ServeMux中的m和es中.
1 | go复制代码// Handle registers the handler for the given pattern. |
那么到了这里,我们就会发现,我们所有的的Handler最终都会转换成net/http
中的Handler
,并且保存在ServerMux
中的Map中.
**现在我们来看看其具体是如何进行分发请求的:**其最终会执行到如何下代码: 在这里我将一些基本简单的代码将会进行删除掉. 注释也是很重要的.
1 | go复制代码func (srv *Server) Serve(l net.Listener) error { |
其最终会执行到
1 | go复制代码// TODO 很重要的方法. |
下面代码就是根据Request
来从ServeMux
中到属于当前请求的Handler
.
如果我们要自己开发框架的话,我们可以复用net/http
解析请求的流程,直接使用期解析请求好之后的流程,就好比复用Java中的Servlet一样,我当初自己实现过自己解析HTTP请求,最终只实现了Get和POST请求,但是图片并没有实现,最终解析图片失败. 所以我要自己实现Web框架的话会复用net/http底层库.
1 | go复制代码func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string) { |
📜 三、总结.
net/http
其实就是将我们自己的HandleFunc
注册到默认的ServeMux
也就是DefaultServeMux
中,监听端口时会构建一个Server,而该Server内的Handler将会时为Nil, 当请求解析完毕之后会直接调用serverHandler{c.server}.ServeHTTP(w, w.req)
再该方法内部,如果Server的Handler为nil,那么就会使用默认的DefaultServerMux
作为当前Server的Handler,然后进行ServerHTTP,如果我们进行实现我们自己的框架,我们可以通过实现一个自己的Handler,并且在创建Server的时候通过给Server赋值Handler从而达到实现我们自己的目的.
欢迎关注公众号:小马正在写Bug.
本文转载自: 掘金