dubbo的實現原理


dubbo的介紹

dubbo是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的RPC實現服務的輸出和輸入功能,可以和Spring框架無縫集成。

dubbo框架是基於Spring容器運行的。

RPC遠程過程調用

遠程過程調用協議是一種通過網絡從遠程計算機程序上請求服務,而不需要了解網絡底層技術的協議。

RPC協議假定某些傳輸協議的存在,如TCP或者UDP,為通信程序之間攜帶信息數據。

在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。

RPC的優點:使得開發包括網絡分布式多程序在內的應用程序更加容易。

 

dubbo角色介

注冊中心(registry):生產者在此注冊並發布內容,消費者在此訂閱並接收發布的內容。

消費者(consumer):客戶端,從注冊中心獲取到方法,可以調用生產者中的方法。

生產者(provider):服務端,生產內容,生產前需要依賴容器(先啟動容器)。

容器(container):生產者在啟動執行的時候,必須依賴容器才能正常啟動(默認依賴的是spring容器),

          dubbo技術不能脫離spring框架。2.5.3版本的dubbo默認依賴spring2.5版本,可以選用spring4.5以下的版本

          2.5.7版本的dubbo默認依賴spring4.3.10版本,可以選擇任意的spring版本。

監控中心(monitor):是dubbo提供的一個jar工程。主要功能是監控服務端和消費端的使用數據。

          如:服務端是什么,有多少接口,多少方法,調用次數,壓力信息等,客戶端有多少,調用過哪些服務端,調用了多少次等。

 

dubbo執行流程(以上圖為例)

0.start:啟動Spring容器時,自動啟動dubbo的Provider

1.register:dubbo的Provider在啟動后自動會去注冊內容。注冊的內容包括:

      1.1 Provider的IP

      1.2 Provider的端口

      1.3 Provider對外提供的接口、方法

      1.4 dubbo版本號

      1.5 訪問Provider的協議

2.subscribe:訂閱,當Consumer啟動時,自動去Registry獲取到所有已注冊的服務信息

3.notify: 通知, 當Provider的信息發生變化時,自動由Registry向Consumer推送通知

4.invoke: 調用, Consumer調用Provider中的方法

      4.1同步請求,消耗一定性能,但是必須是同步請求,因為需要接收調用方法后的結果

5.count: 次數, 每隔2分鍾,Provider和Consumer自動向Monitor發送訪問次數,Monitor進行統計。

 

dubbo的工作原理

初始化過程細節:第一步,就是將服務裝載到容器中,然后准備注冊服務。和Spring中啟動過程類似,Spring啟動時,將bean裝載進容器中的時候,首先要解析bean。所以dubbo也是先讀配置文件解析服務。

 

解析服務:1)、基於dubbo.jar內的META-INF/spring.handlers配置,spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler類。

     2)、所有的dubbo標簽都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標簽解析為Bean對象,生產者或者消費者初始化的時候,會將Bean對象轉換為URL格式,將所有Bean屬性轉換成URL的參數。然后將URL傳給Protocal擴展點,基於擴展點的Adaptive機制,根據URL的協議頭,進行不同協議的服務暴露和引用。

 

暴露服務:1)、直接暴露服務端口:在沒有注冊中心的情況下,配置ServiceConfig解析出的URL,基於擴展點Adaptive機制,通過URL的協議頭識別,直接調用DubboProtocol的export()方法,打開服務端口

     2)、向注冊中心暴露服務:將服務的IP和端口一同暴露給注冊中心。ServiceConfig解析出的url格式,基於擴展點的Adaptive機制,通過URL的協議頭識別,調用RegistryProtocol的export()方法,將export參數中的提供者URL先注冊到注冊中心,再重新傳給Protocol擴展點進行暴露。

 

引用服務:1)、直接引用服務:在沒有注冊中心的情況下,直連提供者,ReferenceConfig解析出URL格式,基於擴展點的Adaptive機制,通過URL協議頭識別,直接調用DubboProtocol的refer方法,返回提供者引用。

     2)、從注冊中心發現引用服務:ReferenceConfig解析出的URL的格式,基於擴展點的Adaptive機制,通過URL協議頭識別,就會調用RegistryProtocol的refer方法,從refer參數總的條件,查詢提供者URL,通過提供者URL協議頭識別,就會調用DubboProtocol的refer()方法,得到提供者引用。然后RegistryProtocol將多個提供者引用通過Cluster擴展點,偽裝成單個提供者引用返回。

 

服務提供與消費詳細過程

暴露服務的主過程:
首先ServiceConfig類拿到對外提供服務的實際類ref,然后將ProxyFactory類的getInvoker方法使用ref生成一個AbstractProxyInvoker實例,到這一步就完成具體服務到invoker的轉化。接下來就是Invoker轉換到Exporter的過程。 Dubbo處理服務暴露的關鍵就在Invoker轉換到Exporter的過程,下面我們以Dubbo和rmi這兩種典型協議的實現來進行說明: Dubbo的實現: Dubbo協議的Invoker轉為Exporter發生在DubboProtocol類的export方法,它主要是打開socket偵聽服務,並接收客戶端發來的各種請求,通訊細節由dubbo自己實現。 Rmi的實現: RMI協議的Invoker轉為Exporter發生在RmiProtocol類的export方法,他通過Spring或Dubbo或JDK來實現服務,通訊細節由JDK底層來實現。

服務消費的主過程:
首先ReferenceConfig類的init方法調用Protocol的refer方法生成Invoker實例。接下來把Invoker轉為客戶端需要的接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM