1. 程式人生 > >Dubbo系列之 (七)鏈路層那些事(1)

Dubbo系列之 (七)鏈路層那些事(1)

# 輔助連結 ## [Dubbo系列之 (一)SPI擴充套件 ](https://www.cnblogs.com/liferecord/p/13445631.html) ## [Dubbo系列之 (二)Registry註冊中心-註冊(1)](https://www.cnblogs.com/liferecord/p/13462175.html) ## [Dubbo系列之 (三)Registry註冊中心-註冊(2)](https://www.cnblogs.com/liferecord/p/13497411.html) ## [Dubbo系列之 (四)服務訂閱(1)](https://www.cnblogs.com/liferecord/p/13524747.html) ## [Dubbo系列之 (五)服務訂閱(2)](https://www.cnblogs.com/liferecord/p/13540399.html) ## [Dubbo系列之 (六)服務訂閱(3)](https://www.cnblogs.com/liferecord/p/13637885.html) ## [Dubbo系列之 (七)鏈路層那些事(1)](https://www.cnblogs.com/liferecord/p/13668728.html) 在講解dubboTCP端的設計時,先了解下一些類的關係圖。它們是如何組織在一起的,每個功能又是什麼,接著在進一步深入瞭解其內涵。 #類簡介 1、Exchangers(交換器工具類) 用來建立TCP服務(bind)和建立客戶端連線(connect)輔助類 2、Transporters(資料流傳輸工具類)用來建立TCP服務(bind)和建立客戶端連線(connect)輔助類,Exchangers的底層內容依賴於Transporters,並且Transporters會根據SPI擴充套件,來適配合適的tcp通訊框架,比如netty,mina等。 3、Exchanger(交換器) 用來建立TCP連結,通過工具類Exchangers完成,該介面是一個SPI擴充套件,目前唯一僅有就是HeaderExchanger。從名字的含義可以得到,該協議是具有自定義協議頭的交換器,所以取名HeaderExchanger。 4、Transporter(資料傳輸層) 用來建立TCP連線,通過工具類Transporters完成。它也是一個SPI擴充套件,比如NettyTransporter,MinaTransporter。 5、ExchangeClient (交換器客戶端),Exchanger的connect()方法返回,即建立了TCP連線後,返回的客戶端,接著就是通過該客戶端與服務端通訊,例項有HeaderExchangeClient、LazyConnectExchangeClient、ReferenceCountExchangeClient。之後分別講解這3個,Exchangers工具類建立的連線客戶端是HeaderExchangeClient。 6、ExchangeServer (交換器服務端端) Exchanger的bind()方法返回,即服務端監聽的服務端例項,它監聽這某個具體的tcp埠。預設實現是HeaderExchangeServer。 7、RemotingServer(遠端的TCP服務端),ExchangeServer類也實現了該介面,代表其也是一個遠端伺服器,具體的實現有NettyServer,由Transporter的bind()方法返回,具體的Transporter返回相應的遠端服務端。比如NettyTransporter#bind()返回NettyServer。 8、Client(TCP客戶端),ExchangeClient類也實現了該介面,代表其也是一個TCP客戶端,具體實現有NettyClient,由Transporter的connect()方法返回,具體的Transporter返回相應的TCP客戶端。比如NettyTransporter#connect()返回NettyClient。 9、Channel (通訊通道) ,每建立一個TCP連結就相應建立一個Channel。比如Netty建立連線後,就有一個Channel。這裡的Channel指的是dubbo自己定義的一個channel。它與netty的channel建立關聯,通過NettyChannel類,框架操作的是NettyChannel,而NettyChannel內部持有一個netty的channel物件。 10、HeaderExchangeChannel(交換器Channel,ExchangeChannel屬於交換器Channel),它被HeaderExchangeClient客戶端所持有,客戶端就是通過HeaderExchangeChannel進行通訊的,HeaderExchangeChannel內部持有一個具體的Channel。 11、ChannelHandler (通道處理器) 用來處理建立連線、傳送請求、結束請求等操作的具體抽象。 12、ChannelHandlers(通道處理器工具類) 主要用來包裹封裝具體的Channel,它的作用是通過訊息型別,根據Dispatcher返回不同的 13、Dispatcher(訊息派發器) | 型別 | Dispatcher | Channelhandler | 作用 | |------------|-----------------------------|---------------------------------|----------------------------------------| | All | AllDispatcher | AllChannelHandler | 所有的訊息型別全部通過業務執行緒池處理 | | Connection | ConnectionOrderedDispatcher | ConnectionOrderedChannelHandler | 連線、斷開訊息單獨通過一個執行緒池池來處理,其他的讀寫等訊息通過業務執行緒池處理 | | Direct | DirectDispatcher | DirectChannelHandler | 所有的訊息都通過IO執行緒池處理,不放到業務執行緒池中 | | Execution | ExecutionDispatcher | ExecutionChannelHandler | 請求訊息在業務執行緒池處理,其他訊息在IO執行緒池。 | | Message | MessageOnlyDispatcher | MessageOnlyChannelHandler | 請求和響應訊息在業務執行緒池處理,其他心跳,連線等訊息在IO執行緒池處理 | #類關係圖 ![](https://img2020.cnblogs.com/blog/672564/202009/672564-20200914193339741-1885114864.jpg) ![](https://img2020.cnblogs.com/blog/672564/202009/672564-20200914193346762-809330169.jpg) #試一把,Netty操作--客戶端多執行緒,單鏈路(TCP) ##1、定義傳輸訊息 ``` @Data @ToString public class SampleMessage { private String threadName; private String id; private String desc; } ``` ##2、編寫編碼器 ``` public class SampleEncoder extends MessageToByt