摘要: 原創出處 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道原始碼」歡迎轉載,保留摘要,謝謝!
- 1.【芋艿】精盡 Dubbo 原理與原始碼專欄
- 2.【老徐】RPC 專欄
- 3.【肥朝】Dubbo 原始碼解析
- 4.【MR_QI】Dubbo 原始碼解析
- 5.【楊武兵】Dubbo 原始碼解析
- 666. 彩蛋
???關注**微信公眾號:【芋道原始碼】**有福利:
- RocketMQ / MyCAT / Sharding-JDBC 所有原始碼分析文章列表
- RocketMQ / MyCAT / Sharding-JDBC 中文註釋原始碼 GitHub 地址
- 您對於原始碼的疑問每條留言都將得到認真回覆。甚至不知道如何讀原始碼也可以請教噢。
- 新的原始碼解析文章實時收到通知。每週更新一篇左右。
- 認真的原始碼交流微信群。
1. 【芋艿】精盡 Dubbo 原理與原始碼專欄
- 作者:芋艿
- 只更新在筆者的知識星球,歡迎加入一起討論 Dubbo 原始碼與實現。
- 目前已經有 600+ 位球友加入...
- 進度:已經完成 69+ 篇,預計總共 75+ 篇,完成度 92% 。
- 對應 Dubbo 版本號:2.6.X
1.1 目錄
- 除錯環境搭建
- 專案結構一覽
- 配置 Configuration
- 核心流程一覽
- 擴充機制 SPI
- 執行緒池
- 服務暴露 Export
- 服務引用 Refer
- 註冊中心 Registry
- 動態編譯 Compile
- 動態代理 Proxy
- 服務呼叫 Invoke
- 《精盡 Dubbo 原始碼分析 —— 服務呼叫(一)之本地呼叫(Injvm)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【1】通訊實現》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【2】同步呼叫》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【3】非同步呼叫》
《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【4】引數回撥》- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(三)之遠端呼叫(HTTP)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(四)之遠端呼叫(Hessian)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(五)之遠端呼叫(Webservice)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(六)之遠端呼叫(REST)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(七)之遠端呼叫(RMI)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(八)之遠端呼叫(Redis)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(九)之遠端呼叫(Memcached)》
《精盡 Dubbo 原始碼解析 —— 服務呼叫(十)之遠端呼叫(Thrift)》
- 呼叫特性
- 過濾器 Filter
- 《精盡 Dubbo 原始碼解析 —— 過濾器(一)之 ClassLoaderFilter》
- 《精盡 Dubbo 原始碼解析 —— 過濾器(二)之 ContextFilter》
- 《精盡 Dubbo 原始碼解析 —— 過濾器(三)之 AccessLogFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(五)之 TimeoutFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(六)之 DeprecatedFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(七)之 ExceptionFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(八)之 TokenFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(九)之 TpsLimitFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(十)之 CacheFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(十一)之 ValidationFilter》
- NIO 伺服器
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(一)之抽象 API》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(二)之 Transport 層》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(三)之 Telnet 層》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(四)之 Exchange 層》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(五)之 Buffer 層》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(六)之 Netty4 實現》
- 《精盡 Dubbo 原始碼分析 —— NIO 伺服器(七)之 Netty3 實現》
《精盡 Dubbo 原始碼分析 —— NIO 伺服器(八)之 Mina1 實現》《精盡 Dubbo 原始碼分析 —— NIO 伺服器(九)之 Grizzly 實現》
- P2P 伺服器
- HTTP 伺服器
- 序列化 Serialization
- 服務容器 Container
- 叢集容錯 Cluster
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(一)之抽象 API》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(二)之 Cluster 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(三)之 Directory 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(四)之 Loadbalance 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(五)之 Merger 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(六)之 Configurator 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(七)之 Router 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(八)之 Mock 實現》
- 優雅停機
- 日誌適配
- 狀態檢查
- 監控中心 Monitor
- TODO 等待新版本
- 管理中心 Admin
- TODO 等待新版本
- 運維命令 QOS
- TODO 比較簡單,未來寫一下
- 鏈路追蹤 Tracing
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
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼解析 —— API 配置(一)之應用》
- 《精盡 Dubbo 原始碼解析 —— API 配置(二)之服務提供者》
- 《精盡 Dubbo 原始碼解析 —— API 配置(三)之服務消費者》
【<5.4> 註解配置】
需要
2.5.7
及以上版本支援
對應原始碼解析文章:
【<6.1> 啟動時檢查】
Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,預設
check="true"
。可以通過
check="false"
關閉檢查,比如,測試時,有些服務不關心,或者出現了迴圈依賴,必須有一方先啟動。另外,如果你的 Spring 容器是懶載入的,或者通過 API 程式設計延遲引用服務,請關閉 check,否則服務臨時不可用時,會丟擲異常,拿到 null 引用,如果
check="false"
,總是會返回引用,當服務恢復時,能自動連上。
- 注意,服務提供者註冊失敗,是沒有啟動檢查功能的。這一點,筆者一直理解錯了。
對應原始碼解析文章:
【<6.2> 叢集容錯】
在叢集呼叫失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(一)之抽象 API》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(二)之 Cluster 實現》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(三)之 Directory 實現》
【<6.3> 負載均衡】
在叢集負載均衡時,Dubbo 提供了多種均衡策略,預設為
random
隨機呼叫。可以自行擴充套件負載均衡策略,參見:負載均衡擴充套件
對應原始碼解析文章:
【<6.4> 執行緒模型】
如果事件處理的邏輯能迅速完成,並且不會發起新的 IO 請求,比如只是在記憶體中記個標識,則直接在 IO 執行緒上處理更快,因為減少了執行緒池排程。
但如果事件處理邏輯較慢,或者需要發起新的 IO 請求,比如需要查詢資料庫,則必須派發到執行緒池,否則 IO 執行緒阻塞,將導致不能接收其它請求。
如果用 IO 執行緒處理事件,又在事件處理過程中發起新的 IO 請求,比如在連線事件中發起登入請求,會報“可能引發死鎖”異常,但不會真死鎖。
對應原始碼解析文章:
【<6.5> 直連提供者】
在開發及測試環境下,經常需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直聯方式,將以服務介面為單位,忽略註冊中心的提供者列表,A 介面配置點對點,不影響 B 介面從註冊中心獲取列表。
對應原始碼解析文章:
【<6.6> 只訂閱】
為方便開發測試,經常會線上下共用一個所有服務可用的註冊中心,這時,如果一個正在開發中的服務提供者註冊,可能會影響消費者不能正常執行。
可以讓服務提供者開發方,只訂閱服務(開發的服務可能依賴其它服務),而不註冊正在開發的服務,通過直連測試正在開發的服務。
對應原始碼解析文章:
【<6.7> 只註冊】
如果有兩個映象環境,兩個註冊中心,有一個服務只在其中一個註冊中心有部署,另一個註冊中心還沒來得及部署,而兩個註冊中心的其它應用都需要依賴此服務。這個時候,可以讓服務提供者方只註冊服務到另一註冊中心,而不從另一註冊中心訂閱服務。
對應原始碼解析文章:
【<6.8> 靜態服務】
有時候希望人工管理服務提供者的上線和下線,此時需將註冊中心標識為非動態管理模式。
對應原始碼解析文章:
【<6.9> 多協議】
Dubbo 允許配置多協議,在不同服務上支援不同協議或者同一服務上同時支援多種協議。
對應原始碼解析文章:
【<6.10> 多註冊中心】
Dubbo 支援同一服務向多註冊中心同時註冊,或者不同服務分別註冊到不同的註冊中心上去,甚至可以同時引用註冊在不同註冊中心上的同名服務。另外,註冊中心是支援自定義擴充套件的。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— 服務暴露(一)之本地暴露(Injvm)》
- 《精盡 Dubbo 原始碼分析 —— 服務暴露(二)之遠端暴露(Dubbo)》
- 《精盡 Dubbo 原始碼分析 —— 服務引用(一)之本地引用(Injvm)》
- 《精盡 Dubbo 原始碼分析 —— 服務引用(二)之遠端引用(Dubbo)》
【<6.11> 服務分組】
當一個介面有多種實現時,可以用 group 區分。
【<6.12> 多版本】
當一個介面實現,出現不相容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。
可以按照以下的步驟進行版本遷移:
- 在低壓力時間段,先升級一半提供者為新版本
- 再將所有消費者升級為新版本
- 然後將剩下的一半提供者升級為新版本
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— 服務暴露(二)之遠端暴露(Dubbo)》
- 《精盡 Dubbo 原始碼分析 —— 服務引用(二)之遠端引用(Dubbo)》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【2】同步呼叫》
【<6.13> 分組聚合】
按組合並返回結果 1,比如選單服務,介面一樣,但有多種實現,用group區分,現在消費方需從每種group中呼叫一次返回結果,合併結果返回,這樣就可以實現聚合選單項。
對應原始碼解析文章:
【<6.14> 引數驗證】
引數驗證功能 1 是基於 JSR303 實現的,使用者只需標識 JSR303 標準的驗證 annotation,並通過宣告 filter 來實現驗證 2。
對應原始碼解析文章:
【<6.15> 結果快取】
對應原始碼解析文章:
【<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
上的setAttachment
和getAttachment
在服務消費方和提供方之間進行引數的隱式傳遞。 1
對應原始碼解析文章:
【<6.21> 非同步呼叫】
基於 NIO 的非阻塞實現並行呼叫,客戶端不需要啟動多執行緒即可完成並行呼叫多個遠端服務,相對多執行緒開銷較小。 1
對應原始碼解析文章:
【<6.22> 本地呼叫】
本地呼叫使用了 injvm 協議,是一個偽協議,它不開啟埠,不發起遠端呼叫,只在 JVM 內直接關聯,但執行 Dubbo 的 Filter 鏈。
對應原始碼解析文章:
【<6.23> 引數回撥】
引數回撥方式與呼叫本地 callback 或 listener 相同,只需要在 Spring 的配置檔案中宣告哪個引數是 callback 型別即可。Dubbo 將基於長連線生成反向代理,這樣就可以從伺服器端呼叫客戶端邏輯 1。可以參考 dubbo 專案中的示例程式碼。
對應原始碼解析文章:
【<6.24> 事件通知】
在呼叫之前、呼叫之後、出現異常時,會觸發
oninvoke
、onreturn
、onthrow
三個事件,可以配置當事件發生時,通知哪個類的哪個方法 1。
對應原始碼解析文章:
【<6.25> 本地存根】
遠端服務後,客戶端通常只剩下介面,而實現全在伺服器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做 ThreadLocal 快取,提前驗證引數,呼叫失敗後偽造容錯資料等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 例項,會把 Proxy 通過建構函式傳給 Stub 1,然後把 Stub 暴露給使用者,Stub 可以決定要不要去調 Proxy。
對應原始碼解析文章:
【<6.26> 本地偽裝】
本地偽裝 1 通常用於服務降級,比如某驗權服務,當服務提供方全部掛掉後,客戶端不丟擲異常,而是通過 Mock 資料返回授權失敗。
對應原始碼解析文章:
【<6.27> 延遲暴露】
如果你的服務需要預熱時間,比如初始化快取,等待相關資源就位等,可以使用 delay 進行延遲暴露。
對應原始碼解析文章:
【<6.28> 併發控制】
限制
com.foo.BarService
的每個方法,伺服器端併發執行(或佔用執行緒池執行緒數)不能超過 10 個限制
com.foo.BarService
的sayHello
方法,伺服器端併發執行(或佔用執行緒池執行緒數)不能超過 10 個限制
com.foo.BarService
的每個方法,每客戶端併發執行(或佔用連線的請求數)不能超過 10 個限制
com.foo.BarService
的sayHello
方法,每客戶端併發執行(或佔用連線的請求數)不能超過 10 個
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— 過濾器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
- 《精盡 Dubbo 原始碼解析 —— 叢集容錯(四)之 Loadbalance 實現》
【<6.29> 連線控制】
限制伺服器端接受的連線不能超過 10 個 1:
限制客戶端服務使用連線不能超過 10 個 2:
對應原始碼解析文章:
【<6.30> 延遲連線】
延遲連線用於減少長連線數。當有呼叫發起時,再建立長連線。1
對應原始碼解析文章:
【<6.31> 粘滯連線】
粘滯連線用於有狀態服務,儘可能讓客戶端總是向同一提供者發起呼叫,除非該提供者掛了,再連另一臺。
粘滯連線將自動開啟延遲連線,以減少長連線數。
對應原始碼解析文章:
【<6.32> 令牌驗證】
通過令牌驗證在註冊中心控制許可權,以決定要不要下發令牌給消費者,可以防止消費者繞過註冊中心訪問提供者,另外通過註冊中心可靈活改變授權方式,而不需修改或升級提供者
對應原始碼解析文章:
【<6.33> 路由規則】
對應原始碼解析文章:
【<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,也可以通過以下方式顯示配置日誌輸出策略:
- 命令列
- 在
dubbo.properties
中指定- 在
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。
兩階段提交:
目前該功能暫未實現,如下是推薦閱讀的內容:
- 《RocketMQ 原始碼分析 —— 事務訊息》
- 《Sharding-JDBC 原始碼分析 —— 分散式事務(一)之最大努力型》
- 《MyCAT 原始碼分析 —— XA分散式事務》
- 《TCC-Transaction 原始碼解析 —— 精品合集》
- 《Happylifeplat-TCC 原始碼解析 —— 精品合集》
- 《Myth 原始碼解析 —— 精品合集》
【<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 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【1】通訊實現》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【2】同步呼叫》
- 《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【3】非同步呼叫》
《精盡 Dubbo 原始碼解析 —— 服務呼叫(二)之遠端呼叫(Dubbo)【4】引數回撥》
【<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 1 的
frontend-simple
和transports-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://】
對應原始碼解析文章:
【<9.8> redis://】
對應原始碼解析文章:
【<9.9> rest://】
對應文件為
對應原始碼解析文章:
【<10.1> Multicast 註冊中心】
Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。
- 提供方啟動時廣播自己的地址
- 消費方啟動時廣播訂閱請求
- 提供方收到訂閱請求時,單播自己的地址給訂閱者,如果設定了
unicast=false
,則廣播給訂閱者- 消費方收到提供方地址時,連線該地址進行 RPC 呼叫。
組播受網路結構限制,只適合小規模應用或開發階段使用。組播地址段: 224.0.0.0 - 239.255.255.255
對應原始碼解析文章:
【<10.2> zookeeper 註冊中心】
Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用 1。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— Zookeeper 客戶端》
- 《精盡 Dubbo 原始碼分析 —— 註冊中心(一)之抽象 API》
- 《精盡 Dubbo 原始碼分析 —— 註冊中心(二)之 Zookeeper》
【<10.3> Redis 註冊中心】
對應原始碼解析文章:
【<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> 框架設計】
對應原始碼解析文章:
【<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 程式間通訊等。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— 服務暴露(一)之本地暴露(Injvm)》
- 《精盡 Dubbo 原始碼分析 —— 服務暴露(二)之遠端暴露(Dubbo)》
- 《精盡 Dubbo 原始碼分析 —— 服務引用(一)之本地引用(Injvm)》
- 《精盡 Dubbo 原始碼分析 —— 服務引用(二)之遠端引用(Dubbo)》
【<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" />
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼解析 —— 過濾器(一)之 ClassLoaderFilter》
- 《精盡 Dubbo 原始碼解析 —— 過濾器(二)之 ContextFilter》
- 《精盡 Dubbo 原始碼解析 —— 過濾器(三)之 AccessLogFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(四)之 ActiveLimitFilter && ExecuteLimitFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(五)之 TimeoutFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(六)之 DeprecatedFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(七)之 ExceptionFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(八)之 TokenFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(九)之 TpsLimitFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(十)之 CacheFilter》
- 《精盡 Dubbo 原始碼分析 —— 過濾器(十一)之 ValidationFilter》
【<5.3> 引用監聽擴充套件】
當有服務引用時,觸發該事件。
對應原始碼解析文章:
【<5.4> 暴露監聽擴充套件】
當有服務暴露時,觸發該事件。
對應原始碼解析文章:
【<5.5> 叢集擴充套件】
當有多個服務提供方時,將多個服務提供方組織成一個叢集,並偽裝成一個提供方。
對應原始碼解析文章:
【<5.6> 路由擴充套件】
從多個服務提者方中選擇一個進行呼叫。
- 官方文件寫的有問題,從多個服務提者方中篩選出所有匹配的結果集。
對應原始碼解析文章:
【<5.7> 負載均衡擴充套件】
從多個服務提者方中選擇一個進行呼叫
對應原始碼解析文章:
【<5.8> 合併結果擴充套件】
合併返回結果,用於分組聚合。
對應原始碼解析文章:
【<5.9> 註冊中心擴充套件】
負責服務的註冊與發現。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— Zookeeper 客戶端》
- 《精盡 Dubbo 原始碼分析 —— 註冊中心(一)之抽象 API》
- 《精盡 Dubbo 原始碼分析 —— 註冊中心(二)之 Zookeeper》
- 《精盡 Dubbo 原始碼分析 —— 註冊中心(三)之 Redis》
《精盡 Dubbo 原始碼分析 —— 註冊中心(四)之 Simple 》《精盡 Dubbo 原始碼分析 —— 註冊中心(五)之 Multicast 》
【<5.10> 監控中心擴充套件】
負責服務呼叫次和呼叫時間的監控。
對應原始碼解析文章:
TODO
【<5.11> 擴充套件點載入擴充套件】
擴充套件點本身的載入容器,可從不同容器載入擴充套件點。
對應原始碼解析文章:
【<5.12> 動態代理擴充套件】
將
Invoker
介面轉換成業務介面。
對應原始碼解析文章:
【<5.13> 編譯器擴充套件】
Java 程式碼編譯器,用於動態生成位元組碼,加速呼叫。
對應原始碼解析文章:
【<5.14> 訊息派發擴充套件】
通道資訊派發器,用於指定執行緒池模型。
對應原始碼解析文章:
【<5.15> 執行緒池擴充套件】
服務提供方執行緒程實現策略,當伺服器收到一個請求時,需要線上程池中建立一個執行緒去執行服務提供方業務邏輯。
對應原始碼解析文章:
【<5.16> 序列化擴充套件】
將物件轉成位元組流,用於網路傳輸,以及將位元組流轉為物件,用於在收到位元組流資料後還原成物件。
對應原始碼解析文章:
- 《精盡 Dubbo 原始碼分析 —— 序列化(一)之 總體實現》
- 《精盡 Dubbo 原始碼分析 —— 序列化(二)之 Dubbo 實現》
- 《精盡 Dubbo 原始碼分析 —— 序列化(三)之 Kryo 實現》
【<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 專欄
- 作者 :老徐
- 部落格 :https://www.cnkirito.moe/categories/RPC/
- 目錄 :
3. 【肥朝】Dubbo 原始碼解析
- 作者 :肥朝
- 部落格 :http://www.jianshu.com/u/f7daa458b874
- 目錄 :
- 《Dubbo 原始碼解析 —— 叢集容錯架構設計》
- 《Dubbo 原始碼解析 —— Directory》
- 《Dubbo 原始碼解析 —— Router》
- 《Dubbo 原始碼解析 —— Cluster》
- 《Dubbo 原始碼解析 —— LoadBalance》
- 《Dubbo 原始碼解析 —— 服務暴露原理》
- 《Dubbo 原始碼解析 —— 本地暴露》
- 《Dubbo 原始碼解析 —— 遠端暴露》
- 《Dubbo原始碼解析 —— Zookeeper 連線》
- 《Dubbo原始碼解析 —— Zookeeper 建立節點》
- 《Dubbo原始碼解析 —— 服務暴露總結》
- 《Dubbo原始碼解析 —— Zookeeper 訂閱》
- 《Dubbo原始碼解析 —— 邏輯層設計之服務降級》
- 《Dubbo原始碼解析 —— 簡單原理、與spring融合》
- 《Dubbo原始碼解析 —— 服務引用原理》
4. 【MR_QI】Dubbo 原始碼解析
- 作者 :MR_QI
- 部落格 :https://my.oschina.net/qixiaobo025/blog 或 http://qixiaobo.site/tags/dubbo/
- 目錄 :
5. 【楊武兵】Dubbo 原始碼解析
- 作者 :楊武兵
- 部落格 :https://my.oschina.net/ywbrj042/blog
- 目錄 :
- 《dubbo原始碼分析系列——專案工程結構介紹》
- 《dubbo原始碼分析系列——dubbo-rpc-api模組原始碼分析》
- 《dubbo原始碼分析系列——dubbo-rpc-default模組原始碼分析》
- 《dubbo原始碼分析系列——dubbo的SPI機制原始碼分析》
- 《dubbo原始碼分析系列——dubbo的SPI機制自適應Adpative類分析》
- 《dubbo原始碼分析系列——dubbo-cluster模組原始碼分析》
- 《dubbo原始碼分析系列——dubbo-register-api模組原始碼分析》
- 《dubbo典型協議、傳輸元件、序列化方式組合效能對比測試》
- 《dubbo核心流程分析》
- 《dubbo服務中的hessian序列化工廠使用hashmap加鎖在高併發場景下的問題》
- 《《分散式服務框架原理與實踐》——第5章協議棧閱讀筆記》