我們在前面的文章分析了vertx核心單機部分的原始碼。今天輪到vert.x-web,由於web的內容比較多,因此分為上下兩部分。
乙個基本的vertxweb**片段如下:
)}上面建立了乙個http服務,暴露8080埠,並註冊了乙個path為hello,方法為get的介面。上面涉及到vert.x-web的類有:router、route、routingcontext、httpserver。我們介紹前三個。
首先是router介面,它主要有以下幾個方面組成。
首先說,router只是handler的子類,因此本質上還只是乙個處理器,是被動呼叫的。
@vertxgen
public
inte***ce
router
extends
handler
另外乙個重點是handle,既然router是handler的子類,因此本類最初被呼叫的一定是handle方法(在請求進來時呼叫)
啥也沒乾,就建立了乙個routingcontextimpl,並呼叫了next(),開啟處理邏輯。
乙個routerimpl包含乙個routerstate,在初始化時建立,用於管理router的狀態
public
routerimpl
(vertx vertx)
共有如下幾種狀態
private
final set routes;
private
final map
> errorhandlers;
private
final handler modifiedhandler;
乙個介面,對路由資訊的描述,包含如下幾種資訊,見名思義。
同時包含了對匹配到的請求的處理方式
就是對上面各個方法的實現,這裡不贅述。
對乙個路由狀態的持有,相對routerstate而言,它持有的狀態複雜得多。
// 路徑
private
final string path;
// 順序
private
final int order;
// 是否開啟
private
final boolean enabled;
// 方法
private
final set methods;
// 消費的多**型別
private
final set consumes;
// 是否允許body為空
private
final boolean emptybodypermittedwithconsumes;
// 產生的多**型別
private
final set produces;
// 常規處理器集合
private
final list
> contexthandlers;
// 失敗處理器集合
private
final list
> failurehandlers;
// 不知道幹嘛的
private
final boolean added;
// 用於匹配的正則
private
final pattern pattern;
// 也屬於正規表示式的一部分
private
final list groups;
// 是否使用歸一化路徑
private
final boolean usenormalisedpath;
// 還是正規表示式
private
final set namedgroupsinregex;
// 主機匹配
private
final pattern virtualhostpattern;
// 路徑是否以斜槓結尾
private
final boolean pathendswithslash;
// 是否被排除
private
final boolean exclusive;
// 是否精確匹配
private
final boolean exactpath;
對route最重要的方法當然是判斷是否匹配,該方法也是在routestate中給出
io.vertx.ext.web.impl.routestate#matches,邏輯比較複雜,有興趣可以去看看
// routingcontext的實現類routingcontextimpl的構造方法
}// routingcontextimpl的父類routingcontextimplbase的構造方法
// next方法
public void next()
}
仔細看iteratenext()
boolean iteratenext()
if(failed &&
this
.currentroute.
hasnextfailurehandler
(this))
}catch
(throwable var5)
}// 死迴圈迭代所有route
while
(true)}
else
if(matchresult !=
404)
continue;}
// 匹配成功的情況
this
.resetmatchfailure()
;try
else
this
.currentroutenexthandlerindex.
incrementandget()
; routestate.
handlecontext
(this);
}}catch
(throwable var6)
return
true;}
catch
(throwable var7)if(
!this
.response()
.ended()
)return
true;}
}return
false;}
}
再來仔細看
private void checkhandlenomatch()
else
else
}else
}}
到現在,拋開router是被誰呼叫這問題。我們知道整個routingcontext的執行起始是router的handle方法:它建立routingcontextimpl物件,並呼叫next()啟動route的匹配操作,並在匹配後呼叫對應route的正常handler鏈或失敗handler鏈。
這裡掌握三個關鍵點
對於web的整個處理鏈,我們弄得差不多了。現在還存在如下問題,我們留待下篇再來看。
vertx原始碼 vert x web的原始碼解析
本來應該要寫的是eventbus的原始碼分析的,但是vert.x中國使用者組 群號 515203212 的小夥伴們好像對vert.x web深入了解的需求更大一些。所以就先分析vert.x web的實現原理吧。分析完之後發現篇幅較長,請耐心看完。vert.x web主要的功能是路由,還有常用的htt...
AQS原始碼解析 上
clh佇列 三個人發明的,三個人各取乙個字母命名。aqs abstractqueuedsynchronizer 裡面有基本的模板方法,包括操作同步佇列和條件佇列等。繼承aqs子類可以自己選擇實現的方法有 原始碼解析中術語說明 獲取獨佔鎖 public final void acquire int a...
Fabric 原始碼解析 原始碼目錄解析
這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...