dubbo源碼分析系列——項目工程結構介紹

項目源碼地址

本系列文章是基於噹噹網維護的dubbox版本進行分析的,源碼地址參考:https://github.com/dangdangdotcom/dubboxjava

項目源碼結構

咱們下載源碼後導入到ide中能夠看到如此之多的項目組成,真的是很是之多的項目組成,並且用到的技術也很是多,redis、zookeeper,netty等等,不由讓人心生畏懼,這麼大的工程源碼該如何下手閱讀呢?咱們必須理清楚這些工程的職責和關係,纔可以抽絲剝繭的把dubbo搞清楚。git

核心項目間關係

結構圖說明

爲了讓圖保持清晰明瞭,該圖特地忽略了一些具體的api實現模塊,只保留了核心的一些藉口定義模塊,而具體技術實現的模塊忽略了。經過分析dubbo的各項目及組成關係分析出該項目以下特色。github

  1. duubo的項目劃分得很是細。所以致使工程數目達到幾十個之多,這樣的好處就是開發者能夠根據本身的需求去編譯符合需求的包,只保留本身須要用到的模塊。缺點是致使工程接口的很是複雜。
  2. 強大的可擴展性和靈活性。dubbo抽象出了不少核心接口,而針對這些接口都提供了不一樣的實現了,開發者能夠根據本身的須要選擇各類實現,也能夠根據須要擴展開發本身的實現,具備很是強大的擴展和定製能力。

核心模塊職責介紹

dubbo-common

通用模塊,定義了幾乎全部dubbo模塊都會使用到的一些通用與業務領域無關的工具類(io處理、日誌處理、配置處理、類處理等等),線程池擴展、二進制代碼處理、class編譯處理、json處理、數據存儲接口,系統版本號等等通用的類和接口。web

dubbo-rpc-api

分佈式服務框架的核心是rpc,這是最基本的功能,這個模塊定義了rpc的一些抽象的rpc接口和實現類,包括服務發佈,服務調用代理,遠程調用結果及異常,rpc調用網絡協議,rpc調用監聽器和過濾器等等。該模塊提供了默認的基於dubbo協議的實現模塊,還提供了hessian、http、rest、rmi、thrift和webservice等協議的實現,還實現了injvm的本地調用實現,靈活性強,很是通用,可以知足絕大多數項目的使用需求,並且還能夠自行實現rpc協議。redis

dubbo-registry-api

註冊中心也是最重要的組成部分,它是rpc中的consumer和provider兩個重要角色的協調者。該項目定義了核心的註冊中心接口和實現。具體實現留給了其它項目。有一個默認的實現模塊,組冊中心提供了mutilcast、redis和zookeeper等多種方式的註冊中心實現,用於不一樣的使用場景。spring

dubbo-remoting-api

該模塊是dubbo中的遠程通信模塊。rpc的實現基礎就是遠程通信,consmer要調用provider的遠程方法必須經過網絡遠程通信實現。該模塊定義了遠程傳輸器、終端(endpoint)、客戶端、服務端、編碼解碼器、數據交換、緩衝區、通信異常定義等等核心的接口及類構成。他是對於遠程網絡通信的抽象。提供了諸如netty、mina、grizzly、http、p2p和zookeeper的協議和技術框架的實現方式。json

dubbo-monitor-api

該模塊是dubbo的監控模塊,經過該模塊能夠監控服務調用的各類信息,例如調用耗時、調用量、調用結果等等,監控中心在調用過程當中收集調用的信息,發送到監控服務,在監控服務中能夠存儲這些信息,對這些數據進行統計分析,最終能夠產生各類維護的調用監控信息。dubbo默認提供了一個實現,該實現很是簡單,只是做爲默認的實現範例,生產環境使用價值不高,須要自行實現本身的監控。設計模式

dubbo-container-api

dubbo服務運行容器api模塊。定義了啓動容器列表的包含應用程序入口main方法的類Main;定義了容器接口Container,該接口包含了啓動和中止方法定義;還有一些通用的分頁功能的相關類。dubbo內置了javaconfig、jetty、log4j、logback和spring幾種容器的實現。api

dubbo-config-api

從圖中能夠看出改模塊依賴了幾乎全部的其它模塊,他是dubbo的配置模塊,經過它的配置和組裝將dubbo組件的多個模塊整合在一塊兒給最終的開發者提供有價值的分佈式服務框架。經過它的配置可讓開發者選擇符合本身需求和使用場景的模塊和技術,它定義了面向dubbo使用者的各類信息配置,好比服務發佈配置、方法發佈配置、服務消費配置、應用程序配置、註冊中心配置、協議配置、監控配置等等。另外還有一個spring的配置模塊,定義了一些spring的XML Schema,可以大大簡化使用dubbo的配置,能夠大大下降spring使用場景的學習和配置成本。網絡

dubbo-cluster

該模塊是dubbo實現的集羣模塊。支持遠程服務的集羣,支持多種集羣調用策略,包括failover,failsafe,failfast,failback,forking等。而且支持目錄服務,註冊中心就是目錄服務的一種實現,支持負載均衡,該模塊還實現了路由器特性,此外還包括合併技術,當將調用請求分發給全部的服務提供者,則會返回多個結果,則將多個結果合併須要用到合併器的實現,該模塊也是很是重要的一個模塊。

dubbo-admin

該項目是一個web應用,能夠獨立部署,它能夠管理dubbo服務,經過該管理應用能夠鏈接註冊中心,重點是讀取註冊中心中的信息,也能夠經過該應用改寫註冊中心的信息,從而實現動態的管控服務。該模塊的功能也很是簡單,對於實際的生產使用場景,還須要對該應用的功能進行擴展和定製,以知足實際的使用場景。

總結

經過分析項目結構,讓咱們對dubbo有了一個全面系統的瞭解,尤爲是對於它的組成結構,可是這只是一個開始,對於細節的掌握,咱們還須要逐層深刻,進入到每一個具體的項目和類中去探索它的實現細節。

咱們能夠看出來dubbo是一個設計比較精良的項目,它的項目和代碼組織結構合理;而且它又是一個很是龐大的項目,涉及的具體技術包含方方面面,若是不進行良好的設計,那項目的質量也沒法保障,也要求它必須進行良好的設計;同時它又是一個很是通用和靈活的框架項目,該項目定義了大量的api和配置,也提供了不少框架和技術的實現方案,所以它可以適應絕大多數的使用場景,另外又具備很是靈活的配置和擴展能力,所以也可以很是方便地擴展實現以知足本身個性化的需求,它的普遍流行也是有其必然緣由的。

從它的設計中又印證了我一直比較認同的一種設計模式。就是分層設計模型:

底層是一些通用和支撐性的通用模塊,好比dubbo-commom、dubbo-remoting-api,它們是很是通用的,不解決任何領域業務問題,可以使用於所有或者多數業務領域模塊;

中間層是核心業務領域模塊。它們相互組合協做完成一個完整的對使用者有價值的功能特性,分佈式服務框架裏面就是dubbo-rpc-api遠程調用、dubbo-registry-api是註冊中心、dubbo-monitor-api是監控中心和dubbo-container-api等。模塊化設計下降了代碼複雜度和縮小了關注焦點,也有利於分工協做,還方便各模塊可以獨立演變;結構化良好的中間層纔可以靈活應對各類技術和業務需求的演變。

上層是用戶界面模塊。該層會將結構化良好的中間層服務進行配置和組裝,整合成爲一個對用戶有價值的打包服務,在該層要考慮的是用戶體驗,下降用戶的學習和使用成本,這就須要面向用戶類型、用戶使用場景進行設計,用戶類型須要瞭解用戶掌握的知識,環境和使用場景,依據這些特性進行設計,面向原生java環境使用dubbo-config-api模塊去配置使用dubbo,面向使用spring環境則使用dubbo-config-spring模塊,該層是主要是爲了下降用戶的學習使用成本,填補內部結構和用戶之間的知識、技能方面的鴻溝。

dubbo總體架構和流程圖

next

dubbo-rpc-api是最爲核心的模塊,咱們將從該模塊入手來研究。

相關文章
相關標籤/搜索