由本人空间转过来,空间地址为http://user.qzone.qq.com/29185807/blog/1458275362
我们先从go语言的http server来入手
先看net/http包中
server结构体中,有很多参数,其中handler则为入口处理函数。handler其实是一个interface
我们再看net/http包另外一个结构体
ServerMux,其实就是一个实现了Handler的类。并且其也封装了了路由添加的一些函数,方便使用者来进行路由的定制化。
说明:go-restful源码路径为github.com/emicklei/go-restful ,并且为k8s v1.1.1稳定版本中所包含的版本
下面我们进入到go-restful。首先大致说下其框架结构。
一个container其实就是httpserver的处理handler,而container里面可以add很多个webservice。
而webservice里面可以注册一些具体的处理route。
那下面我们进入源码,首先我们要进入的就是Container
这里面我们要注意的东西有
1、webservices,这个就是添加进来的ws
2、Servemux,这个便是httpserver的handler入口
3、router,其为路由选择器
下面看看add函数
从函数中,我们可以看出
1、servermux注册了一个"/"路径的处理函数 dispatch,说明container包装的入口函数就是dispatch
2、webservices将添加的ws全部保存下来
我们继续看入口
以上的都可以略过
在216行,路由选择器会选择出ws,route。
在函数最后,会执行注册在route中的function
我们看下container的初始化
可以看出来路由选择器被初始化为router jsr 311,这个是一个jsr 311标准的路由选择器
下面看下路由选择函数
下面我们看看webservice
有一个rootpath,有一个route数组,有一个pathexpr,路径正则表达式
根据rootpath生成的路径正则表达式
下面看一个简单的例子
从上面可以看出来,ws注册Route的方式
GET生成了一个routebuilder。
最后将routebuilder生成route,添加到webservice的route数组中
ok,我们现在来看看routebuilder
其实就是一些参数的设置
最后调用的Build生成了Route
我们看看route
我们看到Function,也就是上面routebuilder中的To函数注册的处理函数
但我们看定义RouteFunction,里面的参数则不是net/http库中的request和response
其实是做了一层简单的封装而已
如下
龚浩华
qq 月牙寂 29185807
2016年3月18日
有疑问加站长微信联系(非本文作者)