1. 程式人生 > >Dubbo原始碼梳理

Dubbo原始碼梳理

  • 協議層建立NIO Server,並快取Server
    a.DubboProtocol.createServer(url);
    b.Dubbo底層通訊是通過支援非同步、事件驅動的NIO網路程式設計框架,如:Netty、Mina、Grizzly,此框架是典型的Reactor模式使用,使得單個執行緒處理多個請求,且支援多請求並行執行,NIO接受請求處理流程是讀取請求資料解碼執行業務邏輯編碼傳送迴應訊息,Dubbo是對NIO框架的再次抽象封裝,加入一些Dubbo需要的邏輯,通過抽象擴充套件Handler完成,如HeaderExchangerHandler完成請求-響應模式、同步轉非同步模式訊息傳送,AllChannelHandler通過執行緒池完成請求、響應、連線等並行執行,下面會詳細介紹。
    c.Exchangers.bind(url,requestHanler);
    d.Exchangers是門面類,Exchanger的邏輯封裝在裡面,通過此FACADE呼叫Exchanger邏輯,Dubbo目前只有一個HeaderExanger實現。從協議層進入Exchanger標誌著程式進入了remote層,此層有訊息交換層、網路傳輸層。當協議層呼叫bind(url,requestHanler)方法並傳入最原始的處理Handler時,接下來就是remote層的Server和Hanlder及其他引數初始化的過程。
    e.HeaderExchanger.bind(url,requestHandler);
    這裡寫圖片描述

    此處是訊息交換層與網路傳輸層初始化的入口,且負責將初始化後的Server傳回給協議層。處理流程大致是Dubbo一系列Handler初始化、Server初始化。Handler包裝過程是 協議層傳入的原始requestHandlerHeaderExchangerHandlerDecodeHandlerAllChannelHandlerHeartbeatHandlerMultiMessageHandlerNettyServer[NettyHandler、NettyCodecAdapter]HeaderExchanerServer,HeaderExchanerServer封裝了最終的Server,返回給上層協議層,NettyHandler、NettyCodecAdapter是NIO框架的直接處理Handler,NIO框架接受到訊息後,先由NettyCodecAdapter解碼,再由NettyHandler處理具體業務邏輯,再由NettyCodecAdapter編碼後傳送,NettyServer是個很重要的類,它既是Server又是Handler,而HeaderExchangerServer只是Server,所有NettyServer參與的Handler的處理過程,MultiMessageHandler是多訊息處理Handler、HeartbeatHandler是處理心跳事件的Handler、AllChannelHandler是訊息派發器,負責將請求放入執行緒池,並行執行請求,且Dubbo有多種執行緒模型、DecodeHandler是編碼解碼Handler、HeaderExchangerHandler是資訊交換Handler,將請求轉化成請求-響應模式與同步轉非同步模式,地位非常重要、requestHandler最後執行的Handler,它會在協議層選擇Excporter後選擇Invoker,進而執行Filter與invoker,最終執行請求服務實現類方法。
    其中NIO框架的通訊管道Channel也被Dubbo封裝了,Channel直接觸發事件並執行Handler,有ChannelNettyChannelHeaderExchangerChannel,通訊管道Channel在有客戶端連線Server時觸發建立並封裝成NettyChannel,再由HeaderExchangerHandler建立HeaderExchangerChannel,負責請求-響應模式的處理,注意NettyChannel其實也是個Handler,而HeaderExchangerChannel只是個Channel,是Handler的類說明它也具體Handler特性。
    另外,還初始化一些引數,有AllChannelHandler的執行緒池模型、NettyServer的codesc解碼編碼方式,timeout超時時間,connectTimeout連線超時時時間,accepts提供者最大接受連線數設定,ildeTimeout時間設定,此處的引數得到都是為了後期可能重置準備。還有訊息的序列化與發序列化工作全在NettyCodecAdapter中發起完成。
    至此,分析了Dubbo初始化remote層所有初始化流程,還有,對於Transporters也是個門面類,內部呼叫網路傳輸層的邏輯,如:NettyTransporter、MinaTransporter。
    附上連線過程:(當有客戶端連線Server時)
    0.NettyHandler.connected()
    1.NettyServer.connected()
    2.MultiMessageHandler.connected()
    3.HeartbeatHandler.connected()
    4.AllChannelHandler.connected()
    5.DecodeHandler.connected()
    6.HaderExchangeHandler.connected()
    7.requestHandler.connected()
    8.執行服務的onconnect事件的監聽方法
    下面是Handler、Server、Channel的結構圖:
    這裡寫圖片描述