阿里巴巴Dubbo實現的源碼分析

  1. Dubbo概述

Dubbo是阿里巴巴開源出來的一個分布式服務框架,致力于提供高性能和透明化的RPC遠程服務調用方案,以及作為SOA服務治理的方案。它的核心功能包括:

remoting:遠程通訊基礎,提供對多種NIO框架抽象封裝,包括“同步轉異步”和“請求-響應”模式的信息交換方式。

Cluster: 服務框架核心,提供基于接口方法的遠程過程調用,包括多協議支持,并提供軟負載均衡和容錯機制的集群支持。

registry: 服務注冊中心,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。

由于Dubbo團隊的文檔和代碼都非常優秀,所以更多關于dubbo的方方面面請參考網站http://code.alibabatech.com/wiki/display/dubbo/Home-zh。

這里我們只是補充一下從源碼具體實現角度來看的某些細節方面,包括Invoker、ExtensionLoader等方面。任何官方已經介紹過的細節,我們不做畫蛇添足,官方文檔已經足夠詳實了,這篇文檔的定位是補充實現的相關細節,是基于我在往Dubbo添加web service協議過程中,所碰到過的一些困難。

  1. 服務提供者暴露一個服務的詳細過程
    1_jpeg

上圖是服務提供者暴露服務的主過程:

首先ServiceConfig類拿到對外提供服務的實際類ref(如:HelloWorldImpl),然后通過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來實現RMI服務,通訊細節這一塊由JDK底層來實現,這就省了不少工作量。

  1. 服務消費者消費一個服務的詳細過程
    2_jpeg

上圖是服務消費的主過程:

首先ReferenceConfig類的init方法調用Protocol的refer方法生成Invoker實例(如上圖中的紅色部分),這是服務消費的關鍵。接下來把Invoker轉換為客戶端需要的接口(如:HelloWorld)。

關于每種協議如RMI/Dubbo/Web service等它們在調用refer方法生成Invoker實例的細節和上一章節所描述的類似。

  1. 滿眼都是Invoker

由于Invoker是Dubbo領域模型中非常重要的一個概念,很多設計思路都是向它靠攏。這就使得Invoker滲透在整個實現代碼里,對于剛開始接觸Dubbo的人,確實容易給搞混了。

 下面我們用一個精簡的圖來說明最重要的兩種Invoker:服務提供Invoker和服務消費Invoker:

3_jpeg
為了更好的解釋上面這張圖,我們結合服務消費和提供者的代碼示例來進行說明:

#服務消費者代碼
4
上面代碼中的’DemoService’就是上圖中服務消費端的proxy,用戶代碼通過這個proxy調用其對應的Invoker(DubboInvoker、 HessianRpcInvoker、 InjvmInvoker、 RmiInvoker、 WebServiceInvoker中的任何一個),而該Invoker實現了真正的遠程服務調用。
5
上面這個類會被封裝成為一個AbstractProxyInvoker實例,并新生成一個Exporter實例。這樣當網絡通訊層收到一個請求后,會找到對應的Exporter實例,并調用它所對應的AbstractProxyInvoker實例,從而真正調用了服務提供者的代碼。

Dubbo里還有一些其他的Invoker類,但上面兩種是最重要的。

  1. ExtensionLoader的完整分析

ExtensionLoader是Dubbo中一個非常重要的類,剛接觸Dubbo源碼的人看這個類的時候也多少會有點困惑,這個類非常重要,它就像是廚房里的“大廚”,按照用戶的隨時需要把各種“食材”烹調出來。

我們結合具體代碼詳細說一下ExtensionLoader的實現,下面是ServiceConfig類里的一行代碼:

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

   上面代碼的程序流程圖如下所示(假定是第一次執行這行代碼):

5_jpeg
在這個過程中最重要的兩個方法是getExtensionClasses和createAdaptiveExtensionClass(圖中紅色部分),下面詳細對這兩個方法進行分析:

#getExtensionClasses

這個方法主要讀取META-INF/services/目錄下對應文件內容,在本示例代碼中,是讀取META-INF/services/com.alibaba.dubbo.rpc.Protocol文件中的內容,具體內容如下:

com.alibaba.dubbo.registry.support.RegistryProtocol

com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper

com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper

com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol

com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol

com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol

com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol

com.alibaba.dubbo.rpc.protocol.webservice.WebServiceProtocol

它分析該文件中的每一行(每一行對應一個類),分析這些類,如果發現有哪個類的Annotation是@Adaptive,則找到對應的AdaptiveClass了,但由于Protocol文件里沒有哪個類的Annotation是@Adaptive,所以在這個例子中該方法沒找到對應的AdaptiveClass。

#createAdaptiveExtensionClass

該方法是在getExtensionClasses方法找不到AdaptiveClass的情況下被調用,該方法主要是通過字節碼的方式在內存中新生成一個類,它具有AdaptiveClass的功能,Protocol就是通過這種方式獲得AdaptiveClass類的。

AdaptiveClass類的作用是能在運行時動態判斷具體是要調用哪個類的方法,更多關于AdaptiveClass的內容請參考Dubbo官方文檔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456179.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

POJ 2106-Boolean Expressions,雙棧運用類似表達式求值!

Boolean Expressions 首先聲明此題后臺可能極水(畢竟這種數據不好造!)。昨天寫了一天卻總是找不到bug,討論區各種數據都過了,甚至懷疑輸入有問題,但看到gets也可以過,難道是思路錯了&#xff1f…

H264 CAVLC 研究

目錄 1 CAVLC概念 2 CAVLC原理 3 CAVLC編碼流程 4 CAVLC解碼流程 展開全部 1 CAVLC概念 2 CAVLC原理 3 CAVLC編碼流程 4 CAVLC解碼流程 收起 摘要糾錯編輯摘要 CAVLC即基于上下文的自適應變長編碼。H.264標準中使用CAVLC對4*4模塊的亮度和色度殘差數據進行編碼。 CAVLC-CAVLC…

【MySQL 】學習筆記千行總結

/* Windows服務 */ -- 啟動MySQLnet start mysql -- 創建Windows服務sc create mysql binPath mysqld_bin_path(注意:等號與值之間有空格)/* 連接與斷開服務器 */ mysql -h 地址 -P 端口 -u 用戶名 -p 密碼SHOW PROCESSLIST -- 顯示哪些線程正在運行 SHOW VARIABLES…

CCCC 連續因子

題意: 一個正整數N的因子中可能存在若干連續的數字。例如630可以分解為3*5*6*7,其中5、6、7就是3個連續的數字。給定任一正整數N,要求編寫程序求出最長連續因子的個數,并輸出最小的連續因子序列。 輸入格式: 輸入在一行…

Mybatis怎么能看是否執行了sql語句

項目需要學習mybatis中&#xff0c;本來mybatis也不是什么新技術&#xff0c;無奈之前沒接觸過。 驗證緩存機制時&#xff0c;需要能看到是否sql被執行了。這就需要增加日志的打印 配置如下 在pom中增加如下依賴&#xff1a; <dependency> <groupId>org.bgee.log4j…

定時備份 MySQL 并上傳到七牛

定時備份 MySQL 并上傳到七牛 多數應用場景下&#xff0c;我們需要對重要數據進行備份、并放置到一個安全的地方&#xff0c;以備不時之需。 常見的 MySQL 數據備份方式有&#xff0c;直接打包復制對應的數據庫或表文件(物理備份)、mysqldump 全量邏輯備份、xtrabackup 增量邏輯…

vue_props div賦值props定義變量 templete獲取

vue_props div賦值props定義變量 templete獲取 <div id"app"> <add v-bind:btn"h"></add> </div> <script> var vm new Vue({ el: #app, data: { h: "hello" }, components: { "add": { …

H.264句法和語法總結 句法元素的分層結構

在 H.264 定義的碼流中&#xff0c;句法元素被組織成有層次的結構&#xff0c;分別描述各個層次的信息&#xff0c;如下圖所示 在H.264 中&#xff0c;句法元素共被組織成 序列、圖像、片、宏塊、子宏塊五個層次。 在這樣的結構中&#xff0c;每一層的頭部和它的數據部分形成管…

instanceof 的運用

2019獨角獸企業重金招聘Python工程師標準>>> Java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出&#xff0c;這個對象是否是這個特定類或者是它的子類的一個實例。 用法&#xff1a; result object i…

R 腳本讀取匯總 Excel 表格數據

主要用到了 xlsx 和 rJava 包&#xff0c;打開 Excel 文件&#xff0c;讀取各表格數據&#xff0c;再寫入到匯總表。 下圖為處理前的原始數據表格&#xff1a; 下圖為處理后的數據&#xff1a; 代碼實現 安裝&加載包的函數實現。installed.packages() 函數獲取所有已安裝…

[Grid Layout] Place grid items on a grid using grid-column and grid-row

It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid-template-columns and grid-template-rows, and to the grid items, we’ll pass grid-column and grid-row some numeric values. <!DOCTYPE html> <html l…

【大數據】最新大數據學習路線(完整詳細版,含整套教程)

大數據學習路線 java(Java se,javaweb) Linux(shell,高并發架構,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 機器學習(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

264編碼基本概念 FFMpeg的解碼流程

下面轉自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8樓 1、NAL、Slice與frame意思及相互關系 NAL指網絡提取層&#xff0c;里面放一些與網絡相關的信息Slice是片的意思&#xff0c;264中把圖像分成一幀&#xff08;frame&#xff09;…

谷歌瀏覽器開發調試工具中Sources面板 js調試等 完全介紹

這次分享的是Chrome開發工具中最有用的面板Sources。 Sources面板幾乎是我最常用到的Chrome功能面板&#xff0c;也是在我看來決解一般問題的主要功能面板。通常只要是開發遇到了js報錯或者其他代碼問題&#xff0c;在審視一遍自己的代碼而一無所獲之后&#xff0c;我首先就會打…

java XML解析防止外部實體注入

/** * 增加防止部實體注入邏輯* <功能詳細描述>* param reader* throws SAXException* see [類、類#方法、類#成員]*/public static void setReaderFeature(SAXReader reader)throws SAXException{reader.setFeature("http://apache.org/xml/features/disallow-doct…

【Python】最新Python學習路線(完整詳細版,含整套教程)

python目前應用最廣的三個崗位&#xff1a;全棧開發、數據分析、運維開發&#xff0c;今天我們就以這三個重點的崗位來做一下自學Python的規劃&#xff0c;希望你在學之前就能有明確的學習方向。 最近開始整理python的資料&#xff0c;博主建立了一個qq群&#xff0c;希望給大家…

程序員,軟件測試知多少?

送給初級程序員的測試認知文作為開發同學&#xff0c;一些基本的測試崗位相關知識還是很有必要了解一下&#xff0c;免的某些同學在工作中和測試同學斗嘴、打架、群毆等以及被測試鄙視....。 我們常常聽說的一些測試專業術語&#xff0c;比如白盒、黑盒、單元測試&#xff0c;相…

ffmpeg最新源代碼(定期更新)

為了方便那些不能連接到ffmpeg的SVN倉庫更新源代碼的用戶&#xff0c;ffmpeg工程組特開辟一個專區&#xff0c;定期更新ffmpeg的源代碼&#xff0c;并將其快照上傳&#xff0c;有需要的朋友可以長期關注本帖。ffmpeg的編譯指令通常為&#xff1a;1、配置&#xff1a;configurat…

vue 入門環境搭建

公司項目要用vue.js來開發&#xff0c;要使用vue來開發前端框架&#xff0c;首先要有環境&#xff0c;所以給大家介紹一下如何搭建vue環境。其實很簡單&#xff1a; 1.首先下載安裝node.js。 去官網https://nodejs.org/zh-cn/下載安裝包。 2.安裝webpack 打開cmd命令界面&#…

【解決】Win10修改host沒有權限問題

Step1&#xff1a;右鍵文件選擇屬性&#xff0c;選擇安全&#xff0c;點擊編輯&#xff1a; Step2&#xff1a;在彈窗中點擊添加&#xff0c;在彈窗中點擊高級&#xff1a; Step3&#xff1a;在彈窗中點擊立即查找&#xff0c;選中當前用戶&#xff0c;點擊確定&#xff1a; …