Dubbo——過濾器鏈

過濾器鏈


各類協議protocol類均是由ProtocolFilterWrapper類封裝的,ProtocolFilterWrapper在服務的暴露與引用的過程中根據KEYPROVIDER還是CONSUMER來構建服務提供者與消費者的調用過濾器鏈。ProtocolFilterWrapperexportrefer方法代碼如下:

構建過濾器鏈的方法是buildInvokerChain,代碼如下


在構建調用鏈時方法先獲取Filter列表,然後創建與Fitler數量一樣多Invoker結點,接着將這些結點串聯在一起,構成一個鏈表,最後將這個鏈的首結點返回,隨後的調用中,將從首結點開始,依次調用各個結點,完成調用後沿調用鏈返回。這裏各個Invoker結點的串聯是通過與其關聯的invoke方法來完成的。

在invoke方法內部,通過調用與該invoker關聯的filter中的invoke方法來實現結點的連接。調用時將next傳入invoke方法,在調用時首先會調用該結點對應的filter的invoke方法,接着調用傳入參數next的invoke方法。Next的invoke方法同樣會調用自己所關聯的filter的invoke方法,這樣就完成了結點的串聯。可以看到鏈表的最後一個結點就是buildInvokerChain 方法的入參invoker。最終buildInvokerChain方法通過鏈表頭插法完成調用鏈的創建。因此在真正的調用請求處理前會經過若干filter進行預處理。

過濾器鏈的創建可以看作是職責鏈模式(Chain of Responsibility Pattern)的一個實現。這樣系統中增加一個新的過濾器預處理請求時,無須修改原有系統的代碼,只需重新建調用鏈即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章