天天看點

一文講明Dubbo Remoting子產品(上)

dubbo-remoting 子產品提供了多種用戶端和服務端通信功能。

  • 最底層部分即為 Remoting 層
  • 一文講明Dubbo Remoting子產品(上)
  • 包括 Exchange、Transport和Serialize 三層。本文主要描述 Exchange 和 Transport 兩層。

Dubbo 整體架構設計圖

  • Dubbo直接內建已有的第三方網絡庫,如Netty、Mina、Grizzly 等 NIO 架構。
  • 一文講明Dubbo Remoting子產品(上)
  • dubbo-remoting-zookeeper使用 Apache Curator 實作了與 Zookeeper 的互動。

dubbo-remoting-api 子產品

是其他 dubbo-remoting-* 子產品的頂層抽象,其他 dubbo-remoting 子子產品都是依賴第三方 NIO 庫實作 dubbo-remoting-api 子產品。

buffer 包

一文講明Dubbo Remoting子產品(上)

定義了緩沖區相關的接口、抽象類以及實作類。在各個 NIO 架構中都有自己的緩沖區實作。但這裡的 buffer 包在更高層面,抽象了各個 NIO 架構的緩沖區,同時也提供了一些基礎實作。

exchange 包

抽象了 Request 和 Response,并為其添加很多特性。這是整個遠端調用核心部分。

transport 包

抽象網絡傳輸層,但隻負責抽象單向消息傳輸,即請求消息由 Client 端發出,Server 端接收;響應消息由 Server 端發出,Client端接收。有很多網絡庫可以實作網絡傳輸,如Netty, transport 包是在網絡庫上層的一層抽象。

傳輸層核心接口

“端點(Endpoint)”,可通過一個 ip 和 port 唯一确定一個端點,兩端點間會建立 TCP 連接配接,雙向傳輸資料。Dubbo 将 Endpoint 之間的 TCP 連接配接抽象為(Channel)通道,将發起請求的 Endpoint 抽象為Client,接收請求的 Endpoint 抽象為Server。

Endpoint 接口

一文講明Dubbo Remoting子產品(上)

etXXX() 用于獲得 Endpoint 本身的一些屬性,如Endpoint 的本地位址、關聯的 URL 資訊以及底層 Channel 關聯的 ChannelHandler。

send() 負責資料發送

close() 及 startClose() 用于關閉底層 Channel

isClosed() 方法用于檢測底層 Channel 是否已關閉

Channel

對 Endpoint 雙方連接配接的抽象,就像傳輸管道。消息發送端往 Channel 寫入消息,接收端從 Channel 讀取消息。

  • 接口的定義

    繼承 Endpoint 接口,也具備開關狀态以及發送資料能力

    可在 Channel 上附加 KV 屬性

  • 一文講明Dubbo Remoting子產品(上)
  • ChannelHandler

注冊在 Channel 上的消息處理器,接口的定義

一文講明Dubbo Remoting子產品(上)

@SPI

注解表明該接口是一個擴充點。

有一類特殊的 ChannelHandler 專門負責實作編解碼功能,進而實作位元組資料與有意義的消息之間的轉換,或是消息之間的互相轉換

一文講明Dubbo Remoting子產品(上)

該接口也是一個擴充接口,encode()、decode() 被 @Adaptive 注解修飾,也就會生成擴充卡類,其中會根據 URL 中的 codec 值确定具體的擴充實作類。

DecodeResult 這個枚舉是在處理 TCP 傳輸時粘包和拆包使用的,例如,目前能讀取到的資料不足以構成一個消息時,就會使用 NEED_MORE_INPUT 枚舉。