Dubbo Github地址 https://github.com/alibaba/dubbo.gitgit
Dubbo Remoting 模塊是dubbo底層通訊模塊的實現。實現對請求/應答的各類邏輯處理,包括同步,異步,心跳等邏輯,最底層的通訊藉助netty或者mina實現,還有經過jetty servlet暴漏http服務的實現方式。github
Endpoint 字面意思是端點,端點接口的基本操做有獲取端點對應的URL,LocalAddress,及發送關閉Channel的操做;json
Channel接口繼承Endpoint ,多了對Attribute的操做接口(get,set,remove)及獲取鏈接狀態接口,多了獲取遠端的操做getRemoteAddress方法;bootstrap
ChannelHandler 主要包含對Channel的一些處理:
connected(Channel channel);
disconnected(Channel channel);
sent(Channel channel, Object message);
received(Channel channel, Object message);app
Client繼承了Endpoint, Channel, Resetable,並添加reconnect接口框架
Server除了繼承Endpoint,還多了下面兩個接口:
Collection<Channel> getChannels() 獲取全部的Channel;
Channel getChannel(InetSocketAddress remoteAddress) 根據地址獲取特定Channel;異步
encode,decode 編碼解碼消息函數
Server bind(URL url, ChannelHandler handler) 監聽服務端
Client connect(URL url, ChannelHandler handler) 鏈接到服務端 Transporter 實現類根據採用的底層通訊框架的不一樣,具體封裝不一樣的實現好比netty如圖:
工具
總結一下這幾個基礎接口的關係,從Endpoint,Channel,Client,Server的繼承關係能夠看出,Endpoint做爲基礎接口包含一些獲取端點地址,獲取channelHandler,發送消息的接口;
Channel繼承Endpoint,Channel能夠理解成現實的生活中的水管,它有端點的屬性,同時它又有自己的屬性;
Client自己是個端點,同時它又能夠藉助Channel對Server進行鏈接,它只能對屬於它的那個Channel進行操做;
Server自己也是個端點,但它沒有繼承Channel,由於它是要對多個Channel進行有選擇的操做,因此它纔有上門列舉的那兩個操做; Transporter接口明顯功能是發起客戶端鏈接或者服務端監聽的做用,Transporters的做用主要是經過dubbo採用的SPI思想去根據配置加載Transporter具體實現類,去完成相應的動做;
這裏涉及的Client Server Channel都是上層通用對象的抽象,預約義通用屬性方法,底層能夠靈活的借用不一樣的框架去實現。你們不要把這些概念和netty mina裏的概念混淆。編碼
該包下的類主要是對字節碼的操做的封裝,ChannelBuffer定義了相應的操做接口,它的實現有Heap實現,和堆外直接內存兩張實現;ChannelBuffers實現了對ChannelBuffer操做工具;大概類圖以下:
這裏主要是對Client接口的部分實現,AbstractClient實現了Client大部分功能,僅把具體的通訊操做留給所依賴的底層通訊框架來實現。它實現了鏈接時鎖控制邏輯,重試機制,及加載所要採用的線程池等邏輯。 AbstractServer 裏面的邏輯想對簡單,僅僅是對一些屬性作了些準備,好比從url中解析所要監聽的地址,獲取線程池,還實現了一個對全部客戶端發送消息的send方法。
上面類圖主要展現ChannelHandler的相關實現,ChannelHandler主要是觸發Channel進行 CONNECTED,DISCONNECTED,SENT,RECEIVED,CAUGHT這個五個操做,其中WrappedChannelHandler對ChannelHandler作了包裝,採用了裝飾者模式,直接調用構造函數傳入的handler來觸發相關操做。這裏的Handler設計巧妙,handler裏嵌handler,每一個handler只需作本身的特殊處理而後交給下一個handler便可,造成了一個處理鏈,實現功能的分層實現。這裏會產生一個疑問,你們這些ChannelHandler都在作本身的業務邏輯處理而後調用handler.xxx(channel),好像誰也沒有去觸發channel上的動做,這個是在client去作的,其實client自己實現了ChannelHandler接口,好比NettyClient。 上圖中的AllChannelHandler ,ExecutionChannelHandler,MessageOnlyChannelHandler,ConnectionOrderedChannelHandler 都是起到分發執行handler動做的類,他們都放在dispatcher包下面,只不過有的是在線程池裏去異步執行的具體的handler對channel的操做,有的是直接在本線程中直接執行。
Exchange這個包下的類主要是提供了可發起遠程請求的ExchangeClient,和監聽服務端的ExchangeServer。其具體實現分別是HeaderExchangeClient和HeaderExchangeServer。 Exchangers 調用 HeaderExchanger去實現客戶端connect,服務端bind動做,分別生成HeaderExchangeClient與HeaderExchangeServer。
這裏Transporters會根據配置的具體Transporter實現類(NettyTransporter,MinaTransporter)來實例化具體的Client,或Server。
Exchange包層主要是ExchangeClient ExchangerServer ,他們在Transport層上加入了心跳檢測,也加入了異步處理邏輯的實現ResponseFuture。其中ResponseFuture 的實現類DefaultFuture,主要是藉助ReentrantLock和Condition實現,你們能夠看下源碼。
該包下的類主要是實現了一些handler,經過telnet命令行查詢狀態,log等信息。
上面的邏輯把remoting層的功能大概實現了,惟獨把依賴底層通訊框架的部分抽象給具體的框架實現。Dubbo底層實現有Mina,Netty,Grizzly,還有藉助jetty把服務暴漏成http的方式。這裏咱們只簡單的介紹下藉助Netty的實現。 這裏分別介紹下NettyChannel, NettyClient, NettyServer, NettyHandler, NettyTransporter。
NettyChannel除了繼承dubbo自己定義的Channel接口邏輯,這裏它把Netty中的Channel概念做爲構造參數傳入,由於全部的交互最終仍是依賴netty中的channel去作。
NettyHandler這裏是實現擴展了SimpleChannelHandler,同時把dubbo中定義的handler做爲構造參數傳入,當觸發了netty中的讀 寫 鏈接斷開等事件時,就會執行各類handler裏定義的邏輯。
NettyClient 這裏的邏輯比較簡單,就是實現AbstractClient中留下的各類doXXX抽象方法,發起遠程鏈接。
NettyServer 經過Netty bootstrap開啓服務端監聽。
這裏把dubbo remoting層涉及到的概念和邏輯基本介紹了。那這裏以Netty Remote爲例總結一些Client和Server的基本流程。
Client:經過HeaderExchanger調用connect方法 new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler)))); —》NettyTransporter 調用connect方法 new NettyClient(url, listener)。這樣一個鏈接就誕生了。
Server: 經過HeaderExchanger調用bind方法 new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler)))); —》NettyTransporter 調用bind方法 new NettyServer(url, listener)。這樣監聽誕生。
1 引入使用頻率較高第三方類庫時,若是類庫比較小如fastjson, asm類庫爲了防止jar衝突,能夠直接把源碼copy到項目中;
2 在設計抽象類時,好比dubbo的AbstractClient,好比方法的一些公共部分抽離出來,不肯定的部分包到抽象方法裏,留給子類實現;方法的命名頗有技巧 好比 方法open裏已知的邏輯咱們寫直接在抽象類裏寫,要留給子類的邏輯咱們起個抽象方法doOpen。
https://my.oschina.net/robinyao/blog/804182
下節介紹dubbo rpc層的邏輯。