由本人空間轉過來,空間地址為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,路徑Regex
根據rootpath產生的路徑Regex
下面看一個簡單的例子
從上面可以看出來,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日
(著作權聲明:本文為作者原創,如需轉載請通知本人,並標明出處和作者。擅自轉載的,保留追究其侵權的權利。)