一、前言
工欲善其事,必先利其器,前面通過幾篇文章簡單的介紹瞭如何使用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 服務提供者暴露一個服務的詳細過程
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 服務消費者消費一個服務的詳細過程
首先 ReferenceConfig 類的 init 方法調用 Protocol 的 refer 方法生
成 Invoker 實例(如上圖中的紅色部分),這是服務消費的關鍵。接下來把
Invoker 轉換為客戶端需要的接口(如:UserServiceBo)。
dubbo協議的invoker轉換為客戶端需要的接口是發生在DubboProtocol的refer方法,他主要是創建一個netty client 鏈接服務提供者,通訊細節由 Dubbo 自己實現。
四、總結
本文簡單的介紹了dubbo整體架構,後續具體介紹,dubbo增強的spi的實現,服務提供方如何發佈服務,比如何時如何創建netty Server來監聽服務消費者的鏈接,何時如何註冊服務到服務治理中心;dubbo的filter鏈如何構建;服務消費方如何消費服務,何時創建netty client….
閱讀更多 3T教育編程猿 的文章