1、產生的背景前端
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已沒法應對,分佈式服務架構以及流動計算架構勢在必行,亟需一個治理系統確保架構有條不紊的演進。下面咱們用一個圖來具體說明架構和開發框架的演進過程。算法
單一應用架構數據庫
當網站流量很小時,只需一個應用,將全部功能都部署在一塊兒,以減小部署節點和成本。此時,用於簡化增刪改查工做量的數據訪問框架(ORM)是關鍵。緩存
垂直應用架構服務器
當訪問量逐漸增大,單一應用增長機器帶來的加速度愈來愈小,將應用拆成互不相干的幾個應用,以提高效率。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。網絡
分佈式服務架構架構
當垂直應用愈來愈多,應用之間交互不可避免,將核心業務抽取出來,做爲獨立的服務,逐漸造成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用於提升業務複用及整合的分佈式服務框架(RPC)是關鍵。負載均衡
流動計算架構框架
當服務愈來愈多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增長一個調度中心基於訪問壓力實時管理集羣容量,提升集羣利用率。此時,用於提升機器利用率的資源調度和治理中心(SOA)是關鍵。異步
2、服務治理的需求
微服務架構是互聯網很熱門的話題,是互聯網技術發展的必然結果。它提倡將單體應用程序劃分紅一組若干小的服務,服務之間互相協調、互相配合,爲用戶提供最終價值。
單體應用程序拆分紅微服務後,服務治理是關鍵。那麼有沒有好的服務治理方案呢?答案是有的,並且不少人都在用這個框架,它就是Dubbo。Dubbo是一個帶有服務治理功能的RPC框架,提供了一套較爲完整的服務治理方案,因此企業若是要實現服務化的話,Dubbo 是很好的一個選擇。這裏簡單介紹一下Dubbo服務治理的幾個基本需求。
在大規模服務化以前,應用可能只是經過 RMI 或 Hessian 等工具,簡單的暴露和引用遠程服務,經過配置服務的URL地址進行調用,經過 F5 等硬件進行負載均衡。
當服務愈來愈多時,服務 URL 配置管理變得很是困難,F5 硬件負載均衡器的單點壓力也愈來愈大。此時須要一個服務註冊中心,動態的註冊和發現服務,使服務的位置透明。並經過在消費方獲取服務提供方地址列表,實現軟負載均衡和 Failover,下降對 F5 硬件負載均衡器的依賴,也能減小部分紅本。
當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪一個應用要在哪一個應用以前啓動,架構師都不能完整的描述應用的架構關係。這時,須要自動畫出應用間的依賴關係圖,以幫助架構師理清關係。
接着,服務的調用量愈來愈大,服務的容量問題就暴露出來,這個服務須要多少機器支撐?何時該加機器? 爲了解決這些問題,第一步,要將服務如今天天的調用量,響應時間,都統計出來,做爲容量規劃的參考指標。其次,要能夠動態調整權重,在線上,將某臺機器的權重一直加大,並在加大的過程當中記錄響應時間的變化,直到響應時間到達閾值,記錄此時的訪問量,再以此訪問量乘以機器數反推總容量。
以上是 Dubbo 最基本的幾個需求。簡單的說,Dubbo就是個服務調用的框架,若是沒有分佈式的需求,實際上是不須要用的,只有在分佈式的時候,纔有使用Dubbo這樣的分佈式服務框架的需求,而且本質上是個服務調用的東東。其核心部分包含:
1. 遠程通信:提供對多種基於長鏈接的NIO框架抽象封裝,包括多種線程模型、序列化以及「請求-響應」模式的信息交換方式。
2. 集羣容錯:提供基於接口方法的透明遠程過程調用,包括多協議支持以及軟負載均衡,失敗容錯、地址路由、動態配置等集羣支持。
3. 自動發現:基於註冊中心目錄服務,使服務消費方能動態的查找服務提供方,使地址透明,使服務提供方能夠平滑增長或減小機器。
3、Dubbo的架構和特色
說完產生的背景和需求後,下面具體談下Dubbo的整體架構以及Dubbo的特色。
Dubbo整體架構設計一共劃分了10層,而最上面的Service層是留給實際想要使用Dubbo開發分佈式服務的開發者實現業務邏輯的接口層。圖中左邊淡藍背景的爲服務消費方使用的接口,右邊淡綠色背景的爲服務提供方使用的接口,位於中軸線上的爲雙方都用到的接口。
下面,結合Dubbo官方文檔,理解一下整體架構分層中,各個層次的設計要點:
1. 服務接口層(Service):該層是與實際業務邏輯相關的,根據服務提供方和服務消費方的業務設計對應的接口和實現。
2. 配置層(Config):對外配置接口,以ServiceConfig和ReferenceConfig爲中心,能夠直接new配置類,也能夠經過Spring解析配置生成配置類。
3. 服務代理層(Proxy):服務接口透明代理,生成服務的客戶端Stub和服務器端Skeleton,以ServiceProxy爲中心,擴展接口爲ProxyFactory。
4. 服務註冊層(Registry):封裝服務地址的註冊與發現,以服務URL爲中心,擴展接口爲RegistryFactory、Registry和RegistryService。可能沒有服務註冊中心,此時服務提供方直接暴露服務。
5. 集羣層(Cluster):封裝多個提供者的路由及負載均衡,並橋接註冊中心,以Invoker爲中心,擴展接口爲Cluster、Directory、Router和LoadBalance。將多個服務提供方組合爲一個服務提供方,實現對服務消費方透明,只須要與一個服務提供方進行交互。
6. 監控層(Monitor):RPC調用次數和調用時間監控,以Statistics爲中心,擴展接口爲MonitorFactory、Monitor和MonitorService。
7. 遠程調用層(Protocol):封將RPC調用,以Invocation和Result爲中心,擴展接口爲Protocol、Invoker和Exporter。Protocol是服務域,它是Invoker暴露和引用的主功能入口,它負責Invoker的生命週期管理。Invoker是實體域,它是Dubbo的核心模型,其餘模型都向它靠擾,或轉換成它,它表明一個可執行體,可向它發起invoke調用。它有多是一個本地的實現,也多是一個遠程的實現,也多是一個集羣實現。
8. 信息交換層(Exchange):封裝請求響應模式,同步轉異步,以Request和Response爲中心,擴展接口爲Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
9. 網絡傳輸層(Transport):抽象mina和netty爲統一接口,以Message爲中心,擴展接口爲Channel、Transporter、Client、Server和Codec。
10. 數據序列化層(Serialize):可複用的一些工具,擴展接口爲Serialization、 ObjectInput、ObjectOutput和ThreadPool。
從上圖能夠看出,Dubbo對於服務提供方和服務消費方,從框架的10層中分別提供了各自須要關心和擴展的接口,構建整個服務生態系統(服務提供方和服務消費方自己就是一個以服務爲中心的)。
下圖是從Dubbo官網直接拿來的,看一下基於RPC層,服務提供方和服務消費方之間的調用關係,如圖所示:
節點角色說明
調用關係說明
0:服務容器負責啓動,加載,運行服務提供者。
1:服務提供者在啓動時,向註冊中心註冊本身提供的服務。
2:服務消費者在啓動時,向註冊中心訂閱本身所需的服務。
3:註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。
4:服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
5:服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
Dubbo架構採用的是一種很是簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,因此基於這一點能夠抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色。另外Dubbo架構還具備如下幾個特色,連通性、健壯性、伸縮性、升級性,有關注冊中心、協議支持、服務監控等內容,也在特色裏有詳細的描述。
連通性(服務消費者和服務提供者的關聯)
1. 註冊中心負責服務地址的註冊與查找,至關於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小。
2. 監控中心負責統計各服務調用次數,調用時間等,統計先在內存彙總後每分鐘一次發送到監控中心服務器,並以報表展現。
3. 服務提供者向註冊中心註冊其提供的服務,並彙報調用時間到監控中心,此時間不包含網絡開銷。
4. 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時彙報調用時間到監控中心,此時間包含網絡開銷。
5. 註冊中心,服務提供者,服務消費者三者之間均爲長鏈接,監控中心除外。
6. 註冊中心經過長鏈接感知服務提供者的存在,服務提供者宕機,註冊中心將當即推送事件通知消費者。
7. 註冊中心和監控中心所有宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表。
8. 註冊中心和監控中心都是可選的,服務消費者能夠直連服務提供者。
健壯性(任意節點宕掉後,服務仍然可用)
1. 監控中心宕掉不影響使用,只是丟失部分採樣數據。
2. 數據庫宕掉後,註冊中心仍能經過緩存提供服務列表查詢,但不能註冊新服務。
3. 註冊中心對等集羣,任意一臺宕掉後,將自動切換到另外一臺。
4. 註冊中心所有宕掉後,服務提供者和服務消費者仍能經過本地緩存通信。
5. 服務提供者無狀態,任意一臺宕掉後,不影響使用。
6. 服務提供者所有宕掉後,服務消費者應用將沒法使用,並沒有限次重連等待服務提供者恢復。
伸縮性(節點能夠自動增長)
1. 註冊中心爲對等集羣,可動態增長機器部署實例,全部客戶端將自動發現新的註冊中心。
2. 服務提供者無狀態,可動態增長機器部署實例,註冊中心將推送新的服務提供者信息給消費者。
升級性(可平滑升級)
當服務集羣規模進一步擴大,帶動IT治理結構進一步升級,須要實現動態部署,進行流動計算,不會給現有分佈式服務架構帶來阻力。下圖是將來可能的一種調用架構:
節點角色說明:
4、總結
Dubbo是Alibaba開源的分佈式服務框架,並被普遍應用於各互聯網公司。Dubbo只須要經過Spring配置的方式便可完成服務化,對於應用無入侵,其框架自己的成熟度以及文檔的完善程度,基本都能知足各互聯網公司的業務需求。
若是你須要使用配置中心、分佈式跟蹤這些內容則須要本身去集成,有一些定製化難度。另一款開源分佈式服務框架Spring Cloud 發展到如今,幾乎考慮了服務治理的方方面面,開發起來很是的便利和簡單。所以,企業須要根據自身的研發水平和所處階段選擇合適的架構來解決業務問題,不論是Dubbo仍是Spring Cloud都是實現微服務有效的工具。