全局視角: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 配置模塊中,擴展點均有對應配置屬性或標籤,通過配置指定使用哪個擴展

實現。比如:

三、遠程調用細節

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

全局視角:Dubbo的整體架構分析

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 服務消費者消費一個服務的詳細過程

全局視角:Dubbo的整體架構分析

  • 首先 ReferenceConfig 類的 init 方法調用 Protocol 的 refer 方法生

    成 Invoker 實例(如上圖中的紅色部分),這是服務消費的關鍵。接下來把

    Invoker 轉換為客戶端需要的接口(如:UserServiceBo)。

  • dubbo協議的invoker轉換為客戶端需要的接口是發生在DubboProtocol的refer方法,他主要是創建一個netty client 鏈接服務提供者,通訊細節由 Dubbo 自己實現。

四、總結

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


分享到:


相關文章: