1. 程式人生 > >Dubbo剖析-整體架構分析

Dubbo剖析-整體架構分析

一、前言

工欲善其事,必先利其器,前面通過幾篇文章簡單的介紹瞭如何使用Dubbo搭建一個簡單的分散式系統,在接下來的的一段時間就來研究Dubbo原理設計,本文作為原理設計的開篇先整體介紹下dubbo的架構。

二、整體架構

image.png

dubbo官方的這個圖很複雜,但是一開始沒有必要深入細節,下面我們簡單講解主要模組。

  • 其中Service 和 Config 層為 API,對應服務提供方來說是使用ServiceConfig來代表一個要釋出的服務配置物件,對應服務消費方來說ReferenceConfig代表了一個要消費的服務的配置物件。可以直接初始化配置類,也可以通過 spring 解析配置生成配置類。
  • 其它各層均為 SPI,SPI意味著下面各層都是元件化可以被替換的,這也是dubbo比較好的一點,主要功能元件都可以外掛化替換。dubbo增強了JDK中的SPI功能,在dubbo中其它各層都是使用擴充套件點進行提供服務的,dubbo增強的SPI增加了對擴充套件點 IoC 和 AOP 的支援,一個擴充套件點可以直接 setter 注入其它擴充套件點;並且不會一次性例項化擴充套件點的所有實現類,這避免了有擴充套件實現初始化很耗時,但如果沒用上也載入,會很浪費資源的情況,增強的SPI是在具體用某一個實現類時候才進行例項化。後續會具體講解增強的SPI的實現原理。
  • proxy 服務代理層:擴充套件介面為 ProxyFactory,dubbo實現的SPI主要JavassistProxyFactory(預設使用)和JdkProxyFactory,用來對服務提供方和服務消費方的服務進行代理。
  • registry 註冊中心層:封裝服務地址的註冊與發現,擴充套件介面為 Registry , RegistryService,Dubbo提供的擴充套件介面實現為ZookeeperRegistry,RedisRegistry,MulticastRegistry,DubboRegistry。
    擴充套件介面RegistryFactory,dubbo提供的擴充套件介面實現DubboRegistryFactory,DubboRegistryFactory,RedisRegistryFactory,ZookeeperRegistryFactory。
  • cluster 路由層:封裝多個提供者的路由及負載均衡,並橋接註冊中心,
    擴充套件介面為 Cluster , Directory , Router ,LoadBalance。
  • monitor 監控層:RPC 呼叫次數和呼叫時間監控,擴充套件介面為 MonitorFactory , Monitor , MonitorService。
  • protocol 遠端呼叫層:封將 RPC 呼叫,擴充套件介面為 Protocol , Invoker , Exporter。
  • exchange 資訊交換層:封裝請求響應模式,同步轉非同步,擴充套件介面為 Exchanger , ExchangeChannel ,ExchangeClient , ExchangeServer
  • transport 網路傳輸層:抽象 mina 和 netty 為統一介面擴充套件介面為 Channel , Transporter , Client , Server , Codec
  • serialize 資料序列化層:可複用的一些工具,擴充套件介面為 Serialization ,
    ObjectInput , ObjectOutput , ThreadPool

關於dubbo擴充套件點一個簡單的例子:
以擴充套件 Dubbo 的協議為例,在協議的實現 jar 包內放置文字檔案: METAINF/dubbo/com.alibaba.dubbo.rpc.Protocol ,內容為:

myprotocol=com.alibaba.user.MyProtocol

MyProtocol內容如下:

package com.alibaba.user;
import com.alibaba.dubbo.rpc.Protocol;
public class MyProtocol implemenets Protocol {
// ...
}

配置模組中的配置
Dubbo 配置模組中,擴充套件點均有對應配置屬性或標籤,通過配置指定使用哪個擴充套件
實現。比如:

<dubbo:protocol name="myprotocol" />

三、遠端呼叫細節

3.1 服務提供者暴露一個服務的詳細過程

image.png
  • 首先 ServiceConfig 類拿到對外提供服務的實際類 ref(如:UserServiceImpl),然後通過 ProxyFactory 類的 getInvoker 方法使用 ref 生成一個
    AbstractProxyInvoker 例項,到這一步就完成具體服務到 Invoker 的轉化。
    接下來就是 Invoker 轉換到 Exporter 的過程。Dubbo 處理服務暴露的關鍵就在 Invoker 轉換到 Exporter 的過程,上圖中的紅色部分。
  • Dubbo 協議的 Invoker 轉為 Exporter 發生在 DubboProtocol 類的
    export 方法,它主要是開啟建立一個Netty Server 偵聽服務,並接收客戶端發來的各種請求,通訊細節由 Dubbo 自己實現,然後註冊服務到服務註冊中心。

3.2 服務消費者消費一個服務的詳細過程

image.png
  • 首先 ReferenceConfig 類的 init 方法呼叫 Protocol 的 refer 方法生
    成 Invoker 例項(如上圖中的紅色部分),這是服務消費的關鍵。接下來把
    Invoker 轉換為客戶端需要的介面(如:UserServiceBo)。
  • dubbo協議的invoker轉換為客戶端需要的介面是發生在DubboProtocol的refer方法,他主要是建立一個netty client 連結服務提供者,通訊細節由 Dubbo 自己實現。

四、總結

本文簡單的介紹了dubbo整體架構,後續具體介紹,dubbo增強的spi的實現,服務提供方如何釋出服務,比如何時如何建立netty Server來監聽服務消費者的連結,何時如何註冊服務到服務治理中心;dubbo的filter鏈如何構建;服務消費方如何消費服務,何時建立netty client….

歡迎大家加入知識星球,在知識星球裡面我們會深入討論Java併發程式設計,以及JUC包原始碼;Java類載入器原理;Spring,Springboot,Tomcat,Dubbo等開源框架的使用以及原始碼剖析;分享作者從畢業到現在一路走來的學習經驗,如何高效學習,如何閱讀原始碼;討論職業面試時候會經常遇到的問題以及如何作答,讀者可以識別下面二維碼加入:


加多

加多

高階 Java 攻城獅 at 阿里巴巴加多,目前就職於阿里巴巴,熱衷併發程式設計、ClassLoader,Spring等開源框架,分散式RPC框架dubbo,springcloud等;愛好音樂,運動。微信公眾號:技術原始積累。知識星球賬號:技術原始積累