type Handler interface { ServeHTTP(ResponseWriter, *Request) }

这一行代码是最核心的初始化代码
这里是核心的请求处理代码

1. 启动调用listenAndServe, 创建一个Server结构体对象server, server.ListenAndServer()函数 func ListenAndServe(addr string, handler Handler) error { server := &Server{Addr: addr, Handler: handler} return server.ListenAndServe() }

Server结构体

Server结构体含有一个Handler参数,该参数的类型如下:(任何实现了ServeHTTP函数的都是Handler接口的实现)

Handler结构体

2。Server.ListenAndServer函数(其中主要调用net.Listen 和 Server.Serve函数)

3。Server.Serve函数说明: 在主goroutine里for循环阻塞,accept获取连接请求, 然后调用Server.newConn()创建客户端,

Server.Serve

这里,调用newConn函数,会创建一个conn结构体的示例客户端,其中的server参数是Server实例

Server.newConn

conn.serve函数主要调用serverHandler.ServeHTTP函数,这里先用Server实例对象去实现了一个serverHandler结构实例,然后执行它的ServeHTTP方法函数,从下面的图2可以看到, 就是调用了 Server.Handler.ServerHTTP函数,(注意,这里如果Server.Handler为nil, 会将handler赋值为DefaultServerMux,它是一个ServerMux的实例)

conn.serve
serverHandler结构体

ServeMux结构体截图如下:

ServeMux结构体
 ServeMux同样实现了ServeHTTP方法,所以是Handler接口的实例
ServeMux.Handler函数,主要调用ServeMux.handler,注意大小写
返回实际的handler函数

构建自定义的Handler:

1
2
3注意,这里HandlerFunc(handler)将一个handler入参转化为HandlerFunc类型,HandlerFunc实现了Handler接口,如下图3.2
3.1
3.2

go-restful的源码说明:

container:如果没有创建新的,则使用默认的container。 webservice: 一个容器中可以有多个webservice,一个webservice中可以加入多个route

一个container主要包含一个webService数组和一个ServeMux,isRegisteredOnRoot默认为false

将自定义的route处理函数注册到ServeMux,关键是看这个add()函数

使用默认的container
默认的container中加入webservice
关键看这个isRegisteredOnRoot处理这部分,调用Container.addHandler将webservice加入到container的ServeMux中
所以,从这里可以看到,实际http请求进来后,是进入dispatch函数做处理的。