成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Dubbo的Remoting模塊解析

開發(fā) 前端
定義Buffer相關(guān)接口、抽象類及實(shí)現(xiàn)類。在各 NIO 框架中都有自己的緩沖區(qū)實(shí)現(xiàn)。但這里的 buffer 包在更高層面,抽象各個(gè) NIO 框架的緩沖區(qū),同時(shí)也提供一些基礎(chǔ)實(shí)現(xiàn)。

1 Dubbo 整體架構(gòu)設(shè)計(jì)

dubbo-remoting 模塊提供多種客戶端和服務(wù)端通信功能。最底層部分即為 Remoting 層:

圖片

包括 Exchange、Transport和Serialize 三層。本文主要描述 Exchange 和 Transport 兩層。

Dubbo直接集成已有的第三方網(wǎng)絡(luò)庫,如Netty、Mina、Grizzly 等 NIO 框架:

圖片

dubbo-remoting-zookeeper使用 Apache Curator 實(shí)現(xiàn)與 zk 的交互。

2 dubbo-remoting-api

是其他 dubbo-remoting-* 模塊的頂層抽象,其他 dubbo-remoting 子模塊都是依賴第三方 NIO 庫,來實(shí)現(xiàn) dubbo-remoting-api 模塊。

2.1 buffer 包

圖片

圖片

定義Buffer相關(guān)接口、抽象類及實(shí)現(xiàn)類。在各 NIO 框架中都有自己的緩沖區(qū)實(shí)現(xiàn)。但這里的 buffer 包在更高層面,抽象各個(gè) NIO 框架的緩沖區(qū),同時(shí)也提供一些基礎(chǔ)實(shí)現(xiàn)。

2.2 exchange包

抽象 Request、Response,并為其添加很多特性。整個(gè)遠(yuǎn)程調(diào)用的核心部分。

2.3 transport包

抽象網(wǎng)絡(luò)傳輸層,但只負(fù)責(zé)抽象單向消息傳輸,即:

  • ? 請求消息由 Client 端發(fā)出,Server 端接收
  • ? 響應(yīng)消息由 Server 端發(fā)出,Client端接收

很多網(wǎng)絡(luò)庫可實(shí)現(xiàn)網(wǎng)絡(luò)傳輸,如Netty,transport包是在網(wǎng)絡(luò)庫上層的一層抽象。

2 傳輸層核心接口

“端點(diǎn)(Endpoint)”:一個(gè) ip? 和 port? 唯一確定,兩端點(diǎn)間會(huì)創(chuàng)建 TCP 連接,雙向傳輸數(shù)據(jù)。

Dubbo 將 Endpoint 之間的 TCP 連接抽象為(Channel)通道:

  • ? 發(fā)起請求的 Endpoint 抽象為Client
  • ? 接收請求的 Endpoint 抽象為Server

2.1 Endpoint 接口

圖片

  • getXXX() 用于獲得 Endpoint 本身的一些屬性,如Endpoint 的本地地址、關(guān)聯(lián)的 URL 信息及底層 Channel 關(guān)聯(lián)的 ChannelHandler
  •  send() 負(fù)責(zé)數(shù)據(jù)發(fā)送
  •  close() 及 startClose() 用于關(guān)閉底層 Channel
  •  isClosed() 方法用于檢測底層 Channel 是否已關(guān)閉

3 Channel

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

3.1 接口定義

繼承 Endpoint 接口,也具備開關(guān)狀態(tài)以及發(fā)送數(shù)據(jù)能力。可在 Channel 上附加 KV 屬性:

圖片

4 ChannelHandler

注冊在 Channel 上的消息處理器

4.1 定義

圖片

@SPI 注解表明該接口是一個(gè)擴(kuò)展點(diǎn)。

有一類特殊的 ChannelHandler 專門負(fù)責(zé)實(shí)現(xiàn)編解碼功能,實(shí)現(xiàn):

  • 字節(jié)數(shù)據(jù)與有意義的消息之間的轉(zhuǎn)換
  • 或消息之間的相互轉(zhuǎn)換

圖片

該接口也是個(gè)擴(kuò)展接口,encode()、decode() 被 @Adaptive 注解修飾,也就會(huì)生成適配器類,其中會(huì)根據(jù) URL 中的 codec 值確定具體的擴(kuò)展實(shí)現(xiàn)類。

DecodeResult 枚舉是在處理 TCP 傳輸時(shí)粘包和拆包使用的,如當(dāng)前能讀取到的數(shù)據(jù)不足以構(gòu)成一個(gè)消息時(shí),就使用 NEED_MORE_INPUT 。

5 Client、RemotingServer

分別抽象客戶端、服務(wù)端,都繼承 Channel、Resetable 等接口,即都具備讀寫數(shù)據(jù)的能力。

都繼承了 Endpoint,只是在語義上區(qū)分請求和響應(yīng)職責(zé),都具備發(fā)送數(shù)據(jù)能力。

圖片

Client V.S Server

  •  Client 只能關(guān)聯(lián)一個(gè) Channel
  • Server 可接收多個(gè) Client 發(fā)起的 Channel 連接,所以在 RemotingServer 接口中定義查詢 Channel 的相關(guān)方法

6 Transporter

Dubbo 在 Client、Server 之上又封裝一層Transporter 接口:

圖片

@SPI 注解擴(kuò)展接口,默認(rèn)使用“netty”擴(kuò)展名。

@Adaptive 注解表示動(dòng)態(tài)生成適配器類:

  • 先后根據(jù)“server”“transporter”的值,確定 RemotingServer 的擴(kuò)展實(shí)現(xiàn)類
  • 先后根據(jù)“client”“transporter”的值,確定 Client 接口的擴(kuò)展實(shí)現(xiàn)

幾乎對每個(gè)支持的 NIO 庫,都有接口實(shí)現(xiàn):

圖片

7.1 為何單獨(dú)抽象Transporter層,不直接讓上層使用 Netty?

利用依賴倒置原則,Netty、Mina、Grizzly 等 NIO 庫對外接口和使用方式不同,若在上層直接依賴 Netty 或Grizzly,就依賴具體 NIO 庫,而非依賴一個(gè)有傳輸能力的抽象,后續(xù)要切換實(shí)現(xiàn),就需修改依賴和接入的相關(guān)代碼。

而有了 Transporter 層,就可通過 Dubbo SPI,修改使用的具體 Transporter 擴(kuò)展實(shí)現(xiàn),切換到不同 Client 和 RemotingServer 實(shí)現(xiàn),切換底層 NIO 庫,而無須修改代碼。當(dāng)有更先進(jìn)的 NIO 庫出現(xiàn),也只需開發(fā)相應(yīng)的 dubbo-remoting-* 實(shí)現(xiàn)模塊提供 Transporter、Client、RemotingServer 等核心接口的實(shí)現(xiàn),即可接入,完全符合開放封閉原則。

7 Transporters

不是一個(gè)接口,而是門面類,封裝:

  •  Transporter 對象的創(chuàng)建(通過 Dubbo SPI)
  • 及 ChannelHandler 的處理
public class Transporters {
private Transporters() {
...


public static RemotingServer bind(URL url,
ChannelHandler... handlers) throws RemotingException {
ChannelHandler handler;
if (handlers.length == 1) {
handler = handlers[0];
} else {
handler = new ChannelHandlerDispatcher(handlers);
}
return getTransporter().bind(url, handler);
}



public static Client connect(URL url, ChannelHandler... handlers)
throws RemotingException {
ChannelHandler handler;
if (handlers == null || handlers.length == 0) {
handler = new ChannelHandlerAdapter();
} else if (handlers.length == 1) {
handler = handlers[0];
} else { // ChannelHandlerDispatcher
handler = new ChannelHandlerDispatcher(handlers);
}
return getTransporter().connect(url, handler);
}



public static Transporter getTransporter() {
// 自動(dòng)生成Transporter適配器并加載
return ExtensionLoader.getExtensionLoader(Transporter.class)
.getAdaptiveExtension();
}
}

在創(chuàng)建 Client、RemotingServer 時(shí),可指定多個(gè) ChannelHandler 綁定到 Channel,來處理其中傳輸?shù)臄?shù)據(jù)。Transporters.connect()、bind() 方法都會(huì)將多個(gè) ChannelHandler 封裝成一個(gè) ChannelHandlerDispatcher 對象。

ChannelHandlerDispatcher 也是 ChannelHandler 接口實(shí)現(xiàn)類之一,維護(hù)一個(gè) CopyOnWriteArraySet 集,它所有的 ChannelHandler 接口實(shí)現(xiàn)都會(huì)調(diào)用其中每個(gè) ChannelHandler 元素的相應(yīng)方法。ChannelHandlerDispatcher 還提供增刪該 ChannelHandler 集合的相關(guān)方法。

8 總結(jié)

  • ? Endpoint 接口抽象“端點(diǎn)”概念,這是所有抽象接口的基礎(chǔ)
  • ? 上層使用方會(huì)通過 Transporters 門面類,獲取到 Transporter 的具體擴(kuò)展實(shí)現(xiàn),然后通過 Transporter 拿到相應(yīng) Client、RemotingServer 實(shí)現(xiàn),就能建立(或接收)Channel 與遠(yuǎn)端進(jìn)行交互
  • ? 無論 Client、RemotingServer,都會(huì)使用 ChannelHandler 處理 Channel 中傳輸?shù)臄?shù)據(jù),其中負(fù)責(zé)編解碼的 ChannelHandler 被抽象出為 Codec2 接口。

Transporter 層整體結(jié)構(gòu)圖

圖片

參考: ??https://dubbo.apache.org/en-us/docs/dev/design.html??

本文轉(zhuǎn)載自微信公眾號(hào)「JavaEdge」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系JavaEdge公眾號(hào)。

責(zé)任編輯:武曉燕 來源: JavaEdge
相關(guān)推薦

2010-03-18 12:19:03

Pyhon DateT

2009-12-15 15:55:43

Ruby模塊

2010-11-15 15:51:55

Oracle ERP系

2009-08-19 10:13:22

Remoting序列化

2011-05-11 16:42:21

.NET Remoti

2013-06-08 17:09:35

Android開發(fā)移動(dòng)開發(fā)XML解析

2023-08-15 11:24:42

人工智能AI

2022-03-15 18:33:34

URL重構(gòu)Dubbo3.0

2010-07-15 14:17:15

2011-08-30 15:42:56

Qt 5模塊

2021-09-06 09:46:26

Dubbo 服務(wù)端開發(fā)

2024-01-15 00:07:08

JS生態(tài)系統(tǒng)

2010-02-03 09:19:31

Python模塊

2023-06-01 08:10:56

2023-10-18 07:16:41

2023-04-14 08:19:27

2009-06-26 11:24:15

Seam Remoti

2010-08-02 09:21:48

Flex模塊化

2010-07-20 16:00:09

Perl模塊

2021-07-14 08:00:12

DubboRSocket 協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久精品小短片 | 黄色片大全在线观看 | 亚州成人 | 在线成人av | 精品一区二区免费视频 | 人人射人人草 | 久久久久国产精品 | 伊人精品在线 | 欧美激情国产日韩精品一区18 | 久久夜视频 | 国产精品无码专区在线观看 | 精品视频一区二区三区四区 | 久久久久1 | 国产女人与拘做受免费视频 | 成年人在线视频 | 久久久久久高潮国产精品视 | 福利视频网站 | 毛片在线免费播放 | 日韩精品一区二区三区中文字幕 | 在线观看免费高清av | 天天影视亚洲综合网 | 中文字幕高清av | 久久久久久综合 | 欧美一区二区三区免费在线观看 | 日韩免费视频 | 中文字幕在线电影观看 | 爽爽免费视频 | 日韩视频在线一区 | 麻豆一区一区三区四区 | 毛片免费在线 | 成人一区二区在线 | 精品一区二区在线看 | 亚洲电影免费 | 国产精品久久久久久网站 | 青青草久久 | 精品一区二区三区免费毛片 | 国产成人精品免高潮在线观看 | 天天操天天干天天爽 | 亚洲国产成人av好男人在线观看 | 久久精品91久久久久久再现 | 欧美高清性xxxxhd |