dubbo源碼解析——概要篇

這次源碼解析借鑑《肥朝》前輩的dubbo源碼解析,進行源碼學習。總結起來就是先總體,後局部.也就是先把需要注意的概念先拋出來,把整體架構圖先畫出來.讓讀者拿着"地圖"跟着我的腳步,並且每一步我都提醒,現在我們在哪,我們下一步要做什麼,這樣纔不會迷失方向。

總體概述

在這裏插入圖片描述
首先是總體出發瞭解整體的架構,涉及到概念,在學習dubbo會更加理解透徹。
下面對上面這張圖做簡要的分析:
(1)cluster是集羣,主要是

Invoker

概念:
Invoker 是實體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起 invoke 調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集羣實現。它裏面有一個很重要的方法 Result invoke(Invocation invocation)。

Invocation是會話域,它持有調用過程中的變量,比如方法名,參數等重要信息。

它有2種類型的Invoker

1.本地執行類的Invoker
   server端:比如有一個dubbo接口demoService.sayHello,在本項目中執行 demoService.sayHello,就通過InjvmExporter來進行反射執行demoService.sayHello就可以了。
   

2.遠程通信類的Invoker

    client端:要執行 demoService.sayHello,它封裝了DubboInvoker進行遠程通信,發送要執行的接口給server端。
    server端:採用了AbstractProxyInvoker執行了DemoServiceImpl.sayHello,然後將執行結果返回發送給client.

按服務提供、服務消費分類

引用官方文檔:分爲服務提供 Invoker 和服務消費 Invoker
在這裏插入圖片描述
爲了更好的解釋上面這張圖,我們結合服務消費和提供者的代碼示例來進行說明:

服務消費者代碼:

public class DemoClientAction {
 
    private DemoService demoService;
 
    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }
 
    public void start() {
        String hello = demoService.sayHello("world" + i);
    }
}

上面代碼中的 DemoService 就是上圖中服務消費端的 proxy,用戶代碼通過這個 proxy 調用其對應的 Invoker [5],而該 Invoker 實現了真正的遠程服務調用。

服務提供者代碼:

public class DemoServiceImpl implements DemoService {
 
    public String sayHello(String name) throws RemoteException {
        return "Hello " + name;
    }
}

上面這個類會被封裝成爲一個 AbstractProxyInvoker 實例,並新生成一個 Exporter 實例。這樣當網絡通訊層收到一個請求後,會找到對應的 Exporter 實例,並調用它所對應的 AbstractProxyInvoker 實例,從而真正調用了服務提供者的代碼。

Invoker繼承關係
在這裏插入圖片描述

Directory

概念
簡單來說,Directory就是裝載invoker的文件目錄

兩個重要Directory
StaticDirectory:靜態目錄服務,他的Invoker是固定的。
RegistryDirectory:註冊目錄服務,他的Invoker集合數據來源於zk註冊中心的,他實現了NotifyListener接口,這個接口中的notify方法就是註冊中心的回調,也就是它之所以能根據註冊中心動態變化的根源所在.。
整個過程有一個重要的map變量,methodInvokerMap(它是數據的來源;同時也是notify的重要操作對象,重點是寫操作。)

Router

概念
利用Router,可以從多個服務提者方中選擇一個進行調用
分類
主要是3個實現類:
ConditionRouter(條件路由):條件路由主要就是根據dubbo管理控制檯配置的路由規則來過濾相關的invoker
MockInvokersSelector:主要根據參數,判斷是否需要篩選出正常的(非mock的)invoker 或者 mock的invoker
ScriptRouter(腳本路由):待補充

例子
參考:org.apache.dubbo.rpc.cluster.router.script.ScriptRouterTest

LoadBalance

概念
與Router功能類似,利用負載均衡策略(random,roundrobin,leastactive),從多個服務提者方中選擇一個進行調用

Protocol

概念
Protocol 是服務域,它是 Invoker 暴露和引用的主功能入口,它負責 Invoker 的生命週期管理。

再接下來給大家一張"地圖","地圖"上我已經標記了序號,再下面的源碼分析中,我也會實時提醒我們所在的位置,以至於不會迷失方向.
在這裏插入圖片描述

消費方調用過程中,dubbo究竟做了什麼?
a、在Directory中找出本次集羣中的全部invokers
b、在Router中,將上一步的全部invokers挑選出滿足條件的invokers
c、在LoadBalance中,將上一步的能正常的執行invokers中,根據配置的負載均衡策略,挑選出需要執行的invoker

後面開始,就是正式的源碼閱讀(環境搭建這些略過)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章