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轉為客戶端需要的接口。