日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里巴巴商城源码JAVA_阿里巴巴Dubbo实现的源码分析

發布時間:2024/1/23 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里巴巴商城源码JAVA_阿里巴巴Dubbo实现的源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.??????Dubbo概述

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

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

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

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

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

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

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

首先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底層來實現,這就省了不少工作量。

3.服務消費者消費一個服務的詳細過程

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

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

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

4.滿眼都是Invoker

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

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

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

#服務消費者代碼

上面代碼中的’DemoService’就是上圖中服務消費端的proxy,用戶代碼通過這個proxy調用其對應的Invoker(DubboInvoker、 HessianRpcInvoker、 InjvmInvoker、 RmiInvoker、 WebServiceInvoker中的任何一個),而該Invoker實現了真正的遠程服務調用。

#服務提供者代碼

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

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

5.ExtensionLoader的完整分析

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

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

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

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

在這個過程中最重要的兩個方法是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官方文檔。

總結

以上是生活随笔為你收集整理的阿里巴巴商城源码JAVA_阿里巴巴Dubbo实现的源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。