阿里巴巴Dubbo實現的源碼分析[轉]

1.      Dubbo概述html

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

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

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

#registry: 服務註冊中心,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方能夠平滑增長或減小機器。bootstrap

因爲Dubbo團隊的文檔和代碼都很是優秀,因此更多關於dubbo的方方面面安全

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

 

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



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

首先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:


 

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

#服務消費者代碼

public class DemoClientAction {

    private DemoService demoService;

    public void setDemoService(DemoService demoService) {

        this.demoService = demoService;

}

    public void start() {

              String hello = demoService.sayHello("world" + i);

     }

}

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

 

#服務提供者代碼

public class DemoServiceImpl

  implements DemoService

{

  public String sayHello(String name) throws RemoteException

  {

    return "Hello " + name;

  }

}

 

      上面這個類會被封裝成爲一個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官方文檔。

  • 項目核心代碼結構截圖

    1. 1. 使用阿里巴巴Druid鏈接池(高效、功能強大、可擴展性好的數據庫鏈接池、監控數據庫訪問性能、支持Common-Logging、Log4j和JdkLog,監控數據庫訪問)
    1.  

      2. 提供高併發JMS消息處理機制
      3. 全部功能模塊化、全部模塊服務化、全部服務原子化的方式,提供可拓展的服務模型,使程序穩定運行,永不宕機
      4. 提供Wink Rest、Webservice服務,故可做爲獨立服務平臺部署

      框架整合:

      Springmvc + Mybatis + Shiro(權限) + REST(服務) + WebService(服務) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定時調度) + Bootstrap Html5(支持PC、IOS、Android)

      框架簡介:

     

    項目Maven構建,真實大型互聯網架構,作到高併發,大數據處理,整個項目使用定製化服務思想,提供模塊化、服務化、原子化的方案,將功能模塊進行拆分,能夠公用到全部的項目中。架構採用分佈式部署架構,全部模塊進行拆分,使項目作到絕對解耦,穩定壓倒一切~~

     

    持續集成:

    1. 個人待辦工做流服務(提供Webservice服務)

    2. 個人待辦工做流集成JMS消息服務(支持高併發,可支持成千上萬系統集成)

    3. 個人任務提供Rest服務,完成平常的工做管理,經過定時調度平臺,動態生成個人任務、循環週期任務、定時郵催提醒完成任務等

    4. 文件上傳、多線程下載服務化、發送郵件、短信服務化、部門信息服務化、產品信息服務化、信息發佈服務化、個人訂閱服務化、個人任務服務化、公共連接、個人收藏服務化等

    系統模塊:

     1.  用戶管理:

          用戶信息管理(添加、刪除、修改、用戶受權、用戶欄目管理、查詢等)

          用戶組管理(添加、刪除、修改、用戶組欄目受權,欄目受權、查詢、用戶組人員添加查詢等)

          用戶角色管理(添加、刪除、修改、用戶角色受權、用戶角色欄目信息查詢設置等)
     2.  文章管理:

          欄目管理:查詢無限極欄目樹、建立無限極欄目樹分類(導航欄目、圖片列表欄目、文章列表欄目、文章內容欄目等)、刪除、修改欄目信息。

          文章管理:建立、刪除、修改文章,多維度文章查詢,包括已發佈、未發佈、全部文章等。文章富文本編輯器、文章多文件上傳、文章狀態控制等。
    3.  系統設置:

           數據字典管理:支持中、英文信息,支持無限級別分類配置,動態控制是否可用等。

           部門信息管理:支持中、英文無限級別部門信息增長,刪除,修改操做,部門列表、樹心查詢等。

           日誌管理:系統日誌列表查詢、在線查看、在線下載等

           路線管理:集成百度地圖API,提供線路查詢管理功能

           Druid Monitor(監控):集成阿里巴巴鏈接池,提供在線鏈接池監控程序,包括:數據源、SQL監控、URL監控、Session監控、Spring監控等

           網站信息管理:經過系統配置文件進行網站內容操做,包括郵件服務器配置、公司基本信息配置等。

     4.  集成REST服務,能夠用做獨立服務平臺(提供大量實例及測試平臺,包括:文件上傳下載、郵件短信發送、部門、產品、公共鏈接、個人收藏、個人任務、信息發佈等)

     5.  集成Quartz調度,能夠用做定時調度平臺(動態配置調度類、調度時間,使程序自動執行某些業務)

     6.  Lucene搜索引擎,能夠將文件資料索引化,支持文件內容搜索、關鍵字搜索、高亮關鍵字等,使信息在毫秒內提取查詢出來

     7.  用戶設置功能:包括修改用戶信息,修改密碼、發送消息,修改我的圖片,查看角色、查看用戶組,管理員修改角色、用戶、用戶組等。

     8.  集成Webservice平臺,包括jaxws服務、CXF框架,配置雙加密的權限認證。使服務集成更加安全。

  •  

     

     9.  Bootstrap html5提供了兩套前臺開環境,包括CMS和電子商務網站,使您的開發更加的簡潔。

    技術點:

    1.  Springmvc + Mybatis集成、SpringSecurity權限控制、Spring AOP事務處理。

    2.   Wink Rest服務、Webservice服務:jaxws、CXF等

    3.  IO 流上傳下載文件,多線程操做

    4.  發送郵件,配置郵件服務器,發基於html、純文本格式的郵件

    5.  MD5加密 (登錄密碼校驗加密等),用戶統一Session、Cookie管理,統一驗證碼校驗等。

    6.  數據庫鏈接池統一配置 

    7.  Quartz定時調度任務集成(直接經過配置便可)

    8.  Httpclient破解驗證碼,登錄聯通充值平臺

    9.  漢字、英文拆分、能夠用做文檔關鍵字搜索等。

    10.  Base64圖片處理,支持PC,Android,IOS

    11.  Service Socket 、Client Socket 通訊技術(已經作過GPRS數據獲取,並用到了項目中)

    12.  提供大量工具類,能夠直接使用

    13.  Maven項目構建,您能夠直接作架構,能夠提高本身的學習能力,使您成爲真正的架構師。

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客
     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客
     

     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客
     

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客
     

    Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

     Springmvc+mybatis+shiro框架整合 高併發 大數據 bootstrap ehcache 企業級應用 - zookeeperkafka - zookeeperkafka的博客

相關文章
相關標籤/搜索