今天開始記錄本身學習的dubbo過程,而且轉換成文檔形式輸出,若是有問題,請隨時指出。 主要參考圖書《深刻理解Apache Dubbo與實踐》,網上資料信息,自身查看源碼等整理出的。學習是個持續過程,之後探索中發現有問題或者更加深刻,還會繼續回來補充。
1、架構圖服務器
一、註冊中心網絡
二、服務端(提供者)架構
三、客戶端(調用者)負載均衡
四、監控中心框架
2、分層學習
API層:spa
一、Service(業務層,開發者實現的業務代碼)線程
二、Config(配置層,主要圍繞ServiceConfig和ReferenceConfig類,管理配置)代理
SPI層:code
一、Proxy(服務代理層,不管生產者仍是消費者,都會生成代理類。完成遠程調用)
二、Registry(註冊層。負責註冊和發現)
三、Cluster(集羣容錯層。遠程調用失敗的容錯機制,選擇調用節點的負載均衡策略)
四、Monitor(監控層,主要統計調用次數和時間等。)
五、Protocol(遠程調用層。封裝RPC調用具體過程,是Invoker暴露和引用的主功能入口)
六、Exchange(信息交換層。創建Request-Response模型,封裝請求響應模式)
七、Transport(網絡傳輸層。把網絡傳輸抽象爲統一接口。)
八、Seriallze(序列化層。負責序列化和反序列化)
服務暴露過程:
一、服務端在啓動時,初始化服務實例
二、經過Proxy組件調用具體的協議(Protocol),把服務端要暴露的接口封裝成Invoker,
三、而後轉換成Exporter,
四、框架會打開服務端口等並記錄服務實例到內存中。
五、最後經過Registry把服務元數據註冊到註冊中心。
客戶端調用過程:
啓動時經過Registry在註冊中心訂閱服務端的元數據(IP和端口)。獲得暴露的服務。
服務消費者調用服務提供者的過程:
一、消費者調用,先經過Proxy
二、Proxy持有一個Invoker對象
三、而後出發invoke調用。
四、在invoke過程當中,須要使用Cluster(負責容錯),如調用失敗的重試。
五、Cluster在調用以前會經過Directory獲取全部能夠調用的遠程服務Invoker列表
六、經過路由規則將Invoker列表過濾一遍
七、經過LoadBlance方法作負載均衡,最後選出一個Invoker。
八、Invoker通過過濾鏈,過濾鏈一般處理上下文,限流,計算等。
九、使用Client作數據傳輸。
十、使用Codec作私有協議構造。
十一、構造完成後,對數據包作序列化,而後傳輸到服務器提供者。
十二、服務提供者收到數據包,也使用Codec處理協議,而後對完整的數據報文作反序列化。(Request)
1三、Request被分配到線程池中進行處理。
1四、Server處理Request.
1五、根據請求查詢到對應的Exporter(內部持有Invoker)
1六、通過過濾鏈Filter
1七、獲得接口的具體實現,而且調用,再原路把結果返回。