Dubbo系列之 (七)鏈路層那些事(1)
阿新 • • 發佈:2020-09-14
# 輔助連結
## [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