Dubbo 實現原理與原始碼解析系列 —— 精品合集

芋道原始碼_以德服人_不服就幹發表於2018-06-02

摘要: 原創出處 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道原始碼」歡迎轉載,保留摘要,謝謝!


Dubbo 實現原理與原始碼解析系列 —— 精品合集

???關注**微信公眾號:【芋道原始碼】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有原始碼分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文註釋原始碼 GitHub 地址
  3. 您對於原始碼的疑問每條留言將得到認真回覆。甚至不知道如何讀原始碼也可以請教噢
  4. 新的原始碼解析文章實時收到通知。每週更新一篇左右
  5. 認真的原始碼交流微信群。

1. 【芋艿】精盡 Dubbo 原理與原始碼專欄

  • 作者:芋艿
  • 只更新在筆者的知識星球,歡迎加入一起討論 Dubbo 原始碼與實現
    Dubbo 實現原理與原始碼解析系列 —— 精品合集
    • 目前已經有 600+ 位球友加入...
    • 進度:已經完成 69+ 篇,預計總共 75+ 篇,完成度 92%
  • 對應 Dubbo 版本號:2.6.X

1.1 目錄

ps:

  • 小圓點代表已完成;
  • 小方塊代表未來計劃完成
  • 鍾華賢代表不考慮寫

1.2 Dubbo 使用者指南

本小節,我們將 《精盡 Dubbo 原始碼解析》《Dubbo 使用者指南》 做一次對映,方便大家直接找到感興趣的功能的具體原始碼實現。當然,如果有整理不到位的地方,歡迎大家給我留言斧正。

【<2> 快速啟動】

Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 侵入,只需用 Spring 載入 Dubbo 的配置即可,Dubbo 基於 Spring 的 Schema 擴充套件進行載入。

如果不想使用 Spring 配置,可以通過 API 的方式 進行呼叫。

對應原始碼解析文章:

【<5.1> XML 配置】

有關 XML 的詳細配置項,請參見:配置參考手冊。如果不想使用 Spring 配置,而希望通過 API 的方式進行呼叫,請參見:API配置。想知道如何使用配置,請參見:快速啟動

對應原始碼解析文章:

【<5.2> 屬性配置】

如果公共配置很簡單,沒有多註冊中心,多協議等情況,或者想多個 Spring 容器想共享配置,可以使用 dubbo.properties 作為預設配置。

Dubbo 將自動載入 classpath 根目錄下的 dubbo.properties,可以通過JVM啟動引數 -Ddubbo.properties.file=xxx.properties 改變預設配置位置。1

對應原始碼解析文章:

【<5.3> API 配置】

API 屬性與配置項一對一,各屬性含義,請參見:配置參考手冊,比如:ApplicationConfig.setName("xxx") 對應 <dubbo:application name="xxx" /> 1

對應原始碼解析文章:

【<5.4> 註解配置】

需要 2.5.7 及以上版本支援

對應原始碼解析文章:

【<6.1> 啟動時檢查】

Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,預設 check="true"

可以通過 check="false" 關閉檢查,比如,測試時,有些服務不關心,或者出現了迴圈依賴,必須有一方先啟動。

另外,如果你的 Spring 容器是懶載入的,或者通過 API 程式設計延遲引用服務,請關閉 check,否則服務臨時不可用時,會丟擲異常,拿到 null 引用,如果 check="false",總是會返回引用,當服務恢復時,能自動連上。

  • 注意,服務提供者註冊失敗,是沒有啟動檢查功能的。這一點,筆者一直理解錯了。

對應原始碼解析文章:

【<6.2> 叢集容錯】

在叢集呼叫失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試。

cluster

對應原始碼解析文章:

【<6.3> 負載均衡】

在叢集負載均衡時,Dubbo 提供了多種均衡策略,預設為 random 隨機呼叫。

可以自行擴充套件負載均衡策略,參見:負載均衡擴充套件

對應原始碼解析文章:

【<6.4> 執行緒模型】

如果事件處理的邏輯能迅速完成,並且不會發起新的 IO 請求,比如只是在記憶體中記個標識,則直接在 IO 執行緒上處理更快,因為減少了執行緒池排程。

但如果事件處理邏輯較慢,或者需要發起新的 IO 請求,比如需要查詢資料庫,則必須派發到執行緒池,否則 IO 執行緒阻塞,將導致不能接收其它請求。

如果用 IO 執行緒處理事件,又在事件處理過程中發起新的 IO 請求,比如在連線事件中發起登入請求,會報“可能引發死鎖”異常,但不會真死鎖。

dubbo-protocol

對應原始碼解析文章:

【<6.5> 直連提供者】

在開發及測試環境下,經常需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直聯方式,將以服務介面為單位,忽略註冊中心的提供者列表,A 介面配置點對點,不影響 B 介面從註冊中心獲取列表。

/user-guide/images/dubbo-directly.jpg

對應原始碼解析文章:

【<6.6> 只訂閱】

為方便開發測試,經常會線上下共用一個所有服務可用的註冊中心,這時,如果一個正在開發中的服務提供者註冊,可能會影響消費者不能正常執行。

可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其它服務),而不註冊正在開發的服務,通過直連測試正在開發的服務。

/user-guide/images/subscribe-only.jpg

對應原始碼解析文章:

【<6.7> 只註冊】

如果有兩個映象環境,兩個註冊中心,有一個服務只在其中一個註冊中心有部署,另一個註冊中心還沒來得及部署,而兩個註冊中心的其它應用都需要依賴此服務。這個時候,可以讓服務提供者方只註冊服務到另一註冊中心,而不從另一註冊中心訂閱服務。

對應原始碼解析文章:

【<6.8> 靜態服務】

有時候希望人工管理服務提供者的上線和下線,此時需將註冊中心標識為非動態管理模式。

對應原始碼解析文章:

【<6.9> 多協議】

Dubbo 允許配置多協議,在不同服務上支援不同協議或者同一服務上同時支援多種協議。

對應原始碼解析文章:

【<6.10> 多註冊中心】

Dubbo 支援同一服務向多註冊中心同時註冊,或者不同服務分別註冊到不同的註冊中心上去,甚至可以同時引用註冊在不同註冊中心上的同名服務。另外,註冊中心是支援自定義擴充套件的。

對應原始碼解析文章:

【<6.11> 服務分組】

當一個介面有多種實現時,可以用 group 區分。

【<6.12> 多版本】

當一個介面實現,出現不相容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。

可以按照以下的步驟進行版本遷移:

  1. 在低壓力時間段,先升級一半提供者為新版本
  2. 再將所有消費者升級為新版本
  3. 然後將剩下的一半提供者升級為新版本

對應原始碼解析文章:

【<6.13> 分組聚合】

按組合並返回結果 1,比如選單服務,介面一樣,但有多種實現,用group區分,現在消費方需從每種group中呼叫一次返回結果,合併結果返回,這樣就可以實現聚合選單項。

對應原始碼解析文章:

【<6.14> 引數驗證】

引數驗證功能 1 是基於 JSR303 實現的,使用者只需標識 JSR303 標準的驗證 annotation,並通過宣告 filter 來實現驗證 2

對應原始碼解析文章:

【<6.15> 結果快取】

結果快取 1,用於加速熱門資料的訪問速度,Dubbo 提供宣告式快取,以減少使用者加快取的工作量 2

對應原始碼解析文章:

【<6.16> 泛化引用】

泛化介面呼叫方式主要用於客戶端沒有 API 介面及模型類元的情況,引數及返回值中的所有 POJO 均用 Map 表示,通常用於框架整合,比如:實現一個通用的服務測試框架,可通過 GenericService 呼叫所有服務實現。

對應原始碼解析文章:

【<6.17> 泛化實現】

泛介面實現方式主要用於伺服器端沒有API介面及模型類元的情況,引數及返回值中的所有POJO均用Map表示,通常用於框架整合,比如:實現一個通用的遠端服務Mock框架,可通過實現GenericService介面處理所有服務請求。

對應原始碼解析文章:

【<6.18> 回聲測試】

回聲測試用於檢測服務是否可用,回聲測試按照正常請求流程執行,能夠測試整個呼叫是否通暢,可用於監控。

所有服務自動實現 EchoService 介面,只需將任意服務引用強制轉型為 EchoService,即可使用。

對應原始碼解析文章:

【<6.19> 上下文資訊】

上下文中存放的是當前呼叫過程中所需的環境資訊。所有配置資訊都將轉換為 URL 的引數,參見 schema 配置參考手冊 中的對應URL引數一列。

RpcContext 是一個 ThreadLocal 的臨時狀態記錄器,當接收到 RPC 請求,或發起 RPC 請求時,RpcContext 的狀態都會變化。比如:A 調 B,B 再調 C,則 B 機器上,在 B 調 C 之前,RpcContext 記錄的是 A 調 B 的資訊,在 B 調 C 之後,RpcContext 記錄的是 B 調 C 的資訊。

對應原始碼解析文章:

【<6.20> 隱式引數】

可以通過 RpcContext 上的 setAttachmentgetAttachment 在服務消費方和提供方之間進行引數的隱式傳遞。 1

/user-guide/images/context.png

對應原始碼解析文章:

【<6.21> 非同步呼叫】

基於 NIO 的非阻塞實現並行呼叫,客戶端不需要啟動多執行緒即可完成並行呼叫多個遠端服務,相對多執行緒開銷較小。 1

/user-guide/images/future.jpg

對應原始碼解析文章:

【<6.22> 本地呼叫】

本地呼叫使用了 injvm 協議,是一個偽協議,它不開啟埠,不發起遠端呼叫,只在 JVM 內直接關聯,但執行 Dubbo 的 Filter 鏈。

對應原始碼解析文章:

【<6.23> 引數回撥】

引數回撥方式與呼叫本地 callback 或 listener 相同,只需要在 Spring 的配置檔案中宣告哪個引數是 callback 型別即可。Dubbo 將基於長連線生成反向代理,這樣就可以從伺服器端呼叫客戶端邏輯 1。可以參考 dubbo 專案中的示例程式碼

對應原始碼解析文章:

【<6.24> 事件通知】

在呼叫之前、呼叫之後、出現異常時,會觸發 oninvokeonreturnonthrow 三個事件,可以配置當事件發生時,通知哪個類的哪個方法 1

對應原始碼解析文章:

【<6.25> 本地存根】

遠端服務後,客戶端通常只剩下介面,而實現全在伺服器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做 ThreadLocal 快取,提前驗證引數,呼叫失敗後偽造容錯資料等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 例項,會把 Proxy 通過建構函式傳給 Stub 1,然後把 Stub 暴露給使用者,Stub 可以決定要不要去調 Proxy。

/user-guide/images/stub.jpg

對應原始碼解析文章:

【<6.26> 本地偽裝】

本地偽裝 1 通常用於服務降級,比如某驗權服務,當服務提供方全部掛掉後,客戶端不丟擲異常,而是通過 Mock 資料返回授權失敗。

對應原始碼解析文章:

【<6.27> 延遲暴露】

如果你的服務需要預熱時間,比如初始化快取,等待相關資源就位等,可以使用 delay 進行延遲暴露。

對應原始碼解析文章:

【<6.28> 併發控制】

限制 com.foo.BarService 的每個方法,伺服器端併發執行(或佔用執行緒池執行緒數)不能超過 10 個

限制 com.foo.BarServicesayHello 方法,伺服器端併發執行(或佔用執行緒池執行緒數)不能超過 10 個

限制 com.foo.BarService 的每個方法,每客戶端併發執行(或佔用連線的請求數)不能超過 10 個

限制 com.foo.BarServicesayHello 方法,每客戶端併發執行(或佔用連線的請求數)不能超過 10 個

對應原始碼解析文章:

【<6.29> 連線控制】

限制伺服器端接受的連線不能超過 10 個 1

限制客戶端服務使用連線不能超過 10 個 2

對應原始碼解析文章:

【<6.30> 延遲連線】

延遲連線用於減少長連線數。當有呼叫發起時,再建立長連線。1

對應原始碼解析文章:

【<6.31> 粘滯連線】

粘滯連線用於有狀態服務,儘可能讓客戶端總是向同一提供者發起呼叫,除非該提供者掛了,再連另一臺。

粘滯連線將自動開啟延遲連線,以減少長連線數。

對應原始碼解析文章:

【<6.32> 令牌驗證】

通過令牌驗證在註冊中心控制許可權,以決定要不要下發令牌給消費者,可以防止消費者繞過註冊中心訪問提供者,另外通過註冊中心可靈活改變授權方式,而不需修改或升級提供者

/user-guide/images/dubbo-token.jpg

對應原始碼解析文章:

【<6.33> 路由規則】

路由規則 1 決定一次 dubbo 服務呼叫的目標伺服器,分為條件路由規則和指令碼路由規則,並且支援可擴充套件 2

對應原始碼解析文章:

【<6.34> 配置規則】

向註冊中心寫入動態配置覆蓋規則 1。該功能通常由監控中心或治理中心的頁面完成。

對應原始碼解析文章:

【<6.35> 服務降級】

可以通過服務降級功能 1 臨時遮蔽某個出錯的非關鍵服務,並定義降級後的返回策略。

對應原始碼解析文章:

【<6.36> 優雅停機】

Dubbo 是通過 JDK 的 ShutdownHook 來完成優雅停機的,所以如果使用者使用 kill -9 PID 等強制關閉指令,是不會執行優雅停機的,只有通過 kill PID 時,才會執行。

對應原始碼解析文章:

【<6.37> 主機繫結】

預設主機 IP 查詢順序:

  • 通過 LocalHost.getLocalHost() 獲取本機地址。
  • 如果是 127.* 等 loopback 地址,則掃描各網路卡,獲取網路卡 IP。

對應原始碼解析文章:

【<6.38> 日誌適配】

2.2.1 開始,dubbo 開始內建 log4j、slf4j、jcl、jdk 這些日誌框架的適配 1,也可以通過以下方式顯示配置日誌輸出策略:

  1. 命令列
  2. dubbo.properties 中指定
  3. dubbo.xml 中配置

對應原始碼解析文章:

【<6.39> 訪問日誌】

如果你想記錄每一次請求資訊,可開啟訪問日誌,類似於apache的訪問日誌。注意:此日誌量比較大,請注意磁碟容量。

對應原始碼解析文章:

【<6.40> 服務容器】

服務容器是一個 standalone 的啟動程式,因為後臺服務不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去載入服務提供方,增加複雜性,也浪費資源。

服務容器只是一個簡單的 Main 方法,並載入一個簡單的 Spring 容器,用於暴露服務。

服務容器的載入內容可以擴充套件,內建了 spring, jetty, log4j 等載入,可通過容器擴充套件點進行擴充套件。配置配在 java 命令的 -D 引數或者 dubbo.properties 中。

對應原始碼解析文章:

【<6.41> ReferenceConfig 快取】

ReferenceConfig 例項很重,封裝了與註冊中心的連線以及與提供者的連線,需要快取。否則重複生成 ReferenceConfig 可能造成效能問題並且會有記憶體和連線洩漏。在 API 方式程式設計時,容易忽略此問題。

因此,自 2.4.0 版本開始, dubbo 提供了簡單的工具類 ReferenceConfigCache用於快取 ReferenceConfig 例項。

對應原始碼解析文章:

【<6.42> 分散式事務】

分散式事務基於 JTA/XA 規範實現 1

兩階段提交:

/user-guide/images/jta-xa.jpg

目前該功能暫未實現,如下是推薦閱讀的內容:

【<6.43> 執行緒棧自動dump】

當業務執行緒池滿時,我們需要知道執行緒都在等待哪些資源、條件,以找到系統的瓶頸點或異常點。dubbo通過Jstack自動匯出執行緒堆疊來保留現場,方便排查問題

預設策略:

  • 匯出路徑,user.home標識的使用者主目錄
  • 匯出間隔,最短間隔允許每隔10分鐘匯出一次

對應原始碼解析文章:

【<6.44> Netty4】

dubbo 2.5.6版本新增了對netty4通訊模組的支援

對應原始碼解析文章:

【<8> schema 配置參考手冊】

這裡以 XML Config 1 為準,列舉所有配置項 2。其它配置方式,請參見相應轉換關係:屬性配置註解配置API 配置

對應原始碼解析文章:

【<9.1> dubbo://】

Dubbo 預設協議採用單一長連線和 NIO 非同步通訊,適合於小資料量大併發的服務呼叫,以及服務消費者機器數遠大於服務提供者機器數的情況。

反之,Dubbo 預設協議不適合傳送大資料量的服務,比如傳檔案,傳視訊等,除非請求量很低。

dubbo-protocol.jpg

對應原始碼解析文章:

【<9.2> rmi://】

RMI 協議採用 JDK 標準的 java.rmi.* 實現,採用阻塞式短連線和 JDK 標準序列化方式。

注意:如果正在使用 RMI 提供服務給外部訪問 1,同時應用裡依賴了老的 common-collections 包 2 的情況下,存在反序列化安全風險 3

對應原始碼解析文章:

【<9.3> hessian://】

Hessian 1 協議用於整合 Hessian 的服務,Hessian 底層採用 Http 通訊,採用 Servlet 暴露服務,Dubbo 預設內嵌 Jetty 作為伺服器實現。

Dubbo 的 Hessian 協議可以和原生 Hessian 服務互操作,即:

  • 提供者用 Dubbo 的 Hessian 協議暴露服務,消費者直接用標準 Hessian 介面呼叫
  • 或者提供方用標準 Hessian 暴露服務,消費方用 Dubbo 的 Hessian 協議呼叫。

對應原始碼解析文章:

【<9.4> http://】

基於 HTTP 表單的遠端呼叫協議,採用 Spring 的 HttpInvoker 實現 1

對應原始碼解析文章:

【<9.5> webservice://】

基於 WebService 的遠端呼叫協議,基於 Apache CXF 1frontend-simpletransports-http 實現 2

可以和原生 WebService 服務互操作,即:

  • 提供者用 Dubbo 的 WebService 協議暴露服務,消費者直接用標準 WebService 介面呼叫,
  • 或者提供方用標準 WebService 暴露服務,消費方用 Dubbo 的 WebService 協議呼叫。

對應原始碼解析文章:

【<9.6> thrift://】

當前 dubbo 支援 1的 thrift 協議是對 thrift 原生協議 2 的擴充套件,在原生協議的基礎上新增了一些額外的頭資訊,比如 service name,magic number 等。

使用 dubbo thrift 協議同樣需要使用 thrift 的 idl compiler 編譯生成相應的 java 程式碼,後續版本中會在這方面做一些增強。

對應原始碼解析文章:

【<9.7> memcached://】

基於 memcached 1 實現的 RPC 協議 2

對應原始碼解析文章:

【<9.8> redis://】

基於 Redis 1 實現的 RPC 協議 2

對應原始碼解析文章:

【<9.9> rest://】

對應文件為

對應原始碼解析文章:

【<10.1> Multicast 註冊中心】

Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。

/user-guide/images/multicast.jpg

  1. 提供方啟動時廣播自己的地址
  2. 消費方啟動時廣播訂閱請求
  3. 提供方收到訂閱請求時,單播自己的地址給訂閱者,如果設定了 unicast=false,則廣播給訂閱者
  4. 消費方收到提供方地址時,連線該地址進行 RPC 呼叫。

組播受網路結構限制,只適合小規模應用或開發階段使用。組播地址段: 224.0.0.0 - 239.255.255.255

對應原始碼解析文章:

【<10.2> zookeeper 註冊中心】

Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 1

/user-guide/images/zookeeper.jpg

對應原始碼解析文章:

【<10.3> Redis 註冊中心】

基於 Redis 1 實現的註冊中心 2

/user-guide/images/dubbo-redis-registry.jpg

對應原始碼解析文章:

【<10.4> Simple 註冊中心】

Simple 註冊中心本身就是一個普通的 Dubbo 服務,可以減少第三方依賴,使整體通訊方式一致。

對應原始碼解析文章:

【<11> Telnet 命令參考手冊】

2.0.5 版本開始,dubbo 開始支援通過 telnet 命令來映象服務治理。

對應原始碼解析文章:

【<12> 線上運維命令-QOS】

dubbo 2.5.8 新版本重構了 telnet 模組,提供了新的 telnet 命令支援。

對應原始碼解析文章:

TODO

dubbo-ops

1.3 Dubbo 開發指南

本小節,我們將 《精盡 Dubbo 原始碼解析》《Dubbo 開發指南》 做一次對映,方便大家直接找到感興趣的功能的具體原始碼實現。當然,如果有整理不到位的地方,歡迎大家給我留言斧正。

【<1> 原始碼構建】

程式碼簽出
分支
構建
構建原始碼 jar 包
IDE 支援

對應原始碼解析文章:

【<2> 框架設計】

/dev-guide/images/dubbo-framework.jpg

對應原始碼解析文章:

【<3> 擴充套件點載入】

Dubbo 的擴充套件點載入從 JDK 標準的 SPI (Service Provider Interface) 擴充套件點發現機制加強而來。

Dubbo 改進了 JDK 標準的 SPI 的以下問題:

  • JDK 標準的 SPI 會一次性例項化擴充套件點所有實現,如果有擴充套件實現初始化很耗時,但如果沒用上也載入,會很浪費資源。
  • 如果擴充套件點載入失敗,連擴充套件點的名稱都拿不到了。比如:JDK 標準的 ScriptEngine,通過 getName() 獲取指令碼型別的名稱,但如果 RubyScriptEngine 因為所依賴的 jruby.jar 不存在,導致 RubyScriptEngine 類載入失敗,這個失敗原因被吃掉了,和 ruby 對應不起來,當使用者執行 ruby 指令碼時,會報不支援 ruby,而不是真正失敗的原因。
  • 增加了對擴充套件點 IoC 和 AOP 的支援,一個擴充套件點可以直接 setter 注入其它擴充套件點。

對應原始碼解析文章:

【<5.1> 協議擴充套件】

RPC 協議擴充套件,封裝遠端呼叫細節。

契約:

  • 當使用者呼叫 refer() 所返回的 Invoker 物件的 invoke() 方法時,協議需相應執行同 URL 遠端 export() 傳入的 Invoker 物件的 invoke() 方法。
  • 其中,refer() 返回的 Invoker 由協議實現,協議通常需要在此 Invoker 中傳送遠端請求,export() 傳入的 Invoker 由框架實現並傳入,協議不需要關心。

注意:

  • 協議不關心業務介面的透明代理,以 Invoker 為中心,由外層將 Invoker 轉換為業務介面。
  • 協議不一定要是 TCP 網路通訊,比如通過共享檔案,IPC 程式間通訊等。

對應原始碼解析文章:

【<5.2> 呼叫攔截擴充套件】

服務提供方和服務消費方呼叫過程攔截,Dubbo 本身的大多功能均基於此擴充套件點實現,每次遠端方法執行,該攔截都會被執行,請注意對效能的影響。

約定:

  • 使用者自定義 filter 預設在內建 filter 之後。
  • 特殊值 default,表示預設擴充套件點插入的位置。比如:filter="xxx,default,yyy",表示 xxx 在預設 filter 之前,yyy 在預設 filter 之後。
  • 特殊符號 -,表示剔除。比如:filter="-foo1",剔除新增預設擴充套件點 foo1。比如:filter="-default",剔除新增所有預設擴充套件點。
  • provider 和 service 同時配置的 filter 時,累加所有 filter,而不是覆蓋。比如:<dubbo:provider filter="xxx,yyy"/><dubbo:service filter="aaa,bbb" />,則 xxx,yyy,aaa,bbb 均會生效。如果要覆蓋,需配置:<dubbo:service filter="-xxx,-yyy,aaa,bbb" />

對應原始碼解析文章:

【<5.3> 引用監聽擴充套件】

當有服務引用時,觸發該事件。

對應原始碼解析文章:

【<5.4> 暴露監聽擴充套件】

當有服務暴露時,觸發該事件。

對應原始碼解析文章:

【<5.5> 叢集擴充套件】

當有多個服務提供方時,將多個服務提供方組織成一個叢集,並偽裝成一個提供方。

對應原始碼解析文章:

【<5.6> 路由擴充套件】

從多個服務提者方中選擇一個進行呼叫。

  • 官方文件寫的有問題,從多個服務提者方中篩選出所有匹配的結果集。

對應原始碼解析文章:

【<5.7> 負載均衡擴充套件】

從多個服務提者方中選擇一個進行呼叫

對應原始碼解析文章:

【<5.8> 合併結果擴充套件】

合併返回結果,用於分組聚合。

對應原始碼解析文章:

【<5.9> 註冊中心擴充套件】

負責服務的註冊與發現。

對應原始碼解析文章:

【<5.10> 監控中心擴充套件】

負責服務呼叫次和呼叫時間的監控。

對應原始碼解析文章:

TODO

【<5.11> 擴充套件點載入擴充套件】

擴充套件點本身的載入容器,可從不同容器載入擴充套件點。

對應原始碼解析文章:

【<5.12> 動態代理擴充套件】

Invoker 介面轉換成業務介面。

對應原始碼解析文章:

【<5.13> 編譯器擴充套件】

Java 程式碼編譯器,用於動態生成位元組碼,加速呼叫。

對應原始碼解析文章:

【<5.14> 訊息派發擴充套件】

通道資訊派發器,用於指定執行緒池模型。

對應原始碼解析文章:

【<5.15> 執行緒池擴充套件】

服務提供方執行緒程實現策略,當伺服器收到一個請求時,需要線上程池中建立一個執行緒去執行服務提供方業務邏輯。

對應原始碼解析文章:

【<5.16> 序列化擴充套件】

將物件轉成位元組流,用於網路傳輸,以及將位元組流轉為物件,用於在收到位元組流資料後還原成物件。

對應原始碼解析文章:

【<5.17> 網路傳輸擴充套件】

遠端通訊的伺服器及客戶端傳輸實現。

對應原始碼解析文章:

【<5.18> 資訊交換擴充套件】

基於傳輸層之上,實現 Request-Response 資訊交換語義。

對應原始碼解析文章:

【<5.19> 組網擴充套件】

對等網路節點組網器。

對應原始碼解析文章:

【<5.20> Telnet 命令擴充套件】

所有伺服器均支援 telnet 訪問,用於人工干預。

對應原始碼解析文章:

【<5.21> 狀態檢查擴充套件】

檢查服務依賴各種資源的狀態,此狀態檢查可同時用於 telnet 的 status 命令和 hosting 的 status 頁面。

對應原始碼解析文章:

TODO

【<5.22> 容器擴充套件】

服務容器擴充套件,用於自定義載入內容。

對應原始碼解析文章:

【<5.23> 頁面擴充套件】

對等網路節點組網器。

  • 官方文件寫的有問題,應該是請求處理器,有點類似 Servlet 。

對應原始碼解析文章:

TODO

【<5.24> 快取擴充套件】

用請求引數作為 key,快取返回結果。

對應原始碼解析文章:

【<5.25> 驗證擴充套件】

引數驗證擴充套件點。

對應原始碼解析文章:

【<5.26> 日誌適配擴充套件】

日誌輸出適配擴充套件點。

對應原始碼解析文章:

1.4 Dubbo 運維指南

《Dubbo 運維指南》 ,暫時無對映的需要。

2. 【老徐】RPC 專欄

3. 【肥朝】Dubbo 原始碼解析

4. 【MR_QI】Dubbo 原始碼解析

5. 【楊武兵】Dubbo 原始碼解析

666. 歡迎投稿

Dubbo 實現原理與原始碼解析系列 —— 精品合集

相關文章