Dubbo源碼分析(四)Handler & Filter

本文將主要介紹Server端處理一次請求的流程,同時講解一個比較巧妙的設計——Filter。

根據前面的分析我們可以推斷出Server端處理網絡通信的組件爲NettyServer,對應處理具體事件的handler爲NettyHandler,它的構造函數需要一個ChannelHandler的參數,這裏傳遞的就是NettyServer實例的引用。這樣一來,handler對messageReceived()的事件處理,又傳遞給了NettyServer的receive()方法

NettyServer本身沒有實現receive方法,這個調用由基類AbstractPeer處理,而它也是再調用自己維護的ChannelHandler,也就是構造NettyServer時傳入的handler。這是一個ChannelHandlerDispatcher實例,它允許同時觸發一組普通的handler。實際構建時的handler爲new DecodeHandler(new HeaderExchangeHandler(handler)),HeaderExchangeHandler中有一部分處理的邏輯,同時還會調用外部傳遞handler。

最後調用了handelr.reply()方法, 它的實現與具體的協議有關,比如默認配置下就是在DubboProtocol中構建的requestHandler,在createServer()方法中傳遞給Exchanger。

看到了invoker.invoke(),也就是真正執行調用的地方。這個Invoker實例來自於根據serviceKey查找的Exporter,它是通過ExtensionLoader創建的,是一個ProtocolFilterWrapper實例。

這裏會將原來的Invoker通過各種Filter包裝成一個InvokerChain,一次調用會依次經過這些FilterChain到達最終的Filter。在這些Filter中可以進行超時校驗、數據監控等工作,每個Filter相對獨立,使得代碼結構非常清晰,也便於爲新功能進行擴展。

這個鏈的結構是:除了初始傳入的Invoker外,對於每個Filter都新建一個Invoker,並返回最後一個創建的Invoker。當執行這些後來構建的Invoker.invoker()方法時,實際調用了filter.invoker(next, invocation),這樣會去執行filter中的邏輯,然後再由filter調用下一個Invoker的invoke方法。直至最後一個原始的Invoker,它的invoke方法不會調用filter,而是正常的invoke邏輯。

以TimeoutFilter爲例具體來看一下

在調用下一個Invoker的前後記錄時間,並將超時的信息打印出來。其中原始的Invoker來自JavassistProxyFactory創建的實例

基類的invoke方法調用子類的doInvoke,去執行真正的反射調用。Server端處理一次請求的流程就介紹到這裏。

文中提到的核心類包括

  1. NettyServer
  2. NettyHandler
  3. HeaderExchangeHandler
  4. DubboProtocol
  5. ProtocolFilterWrapper
  6. JavassistProxyFactory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章