Dubbo原理和機制詳解(非常全面)
Dubbo是一款Java RPC框架,致力於提供高效能的RPC遠端服務呼叫方案。
大家好,我是 mikechen ,專注分享「 網際網路 大廠架構技術」~
本文,我重點詳解 Dubbo 的原理機制。
目錄
- Dubbo核心功能
- Dubbo核心元件
- Dubbo的架構設計
-
Dubbo呼叫流程
Dubbo核心功能
Dubbo主要提供了3大核心功能:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
1)遠端方法呼叫
網路通訊框架,提供對多種NIO框架抽象封裝,包括“同步轉非同步”和“請求-響應”模式的資訊交換方式。
2)智慧容錯和負載均衡
提供基於介面方法的透明遠端過程呼叫,包括多協議支援,以及軟負載均衡,失敗容錯,地址路由,動態配置等叢集支援。
3) 服務註冊和發現
服務註冊,基於註冊中心目錄服務,使服務消費方能動態的查詢f服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo核心元件
Dubbo角色,主要包含如下幾個核心元件:
1)註冊中心(registry)
生產者在此註冊併發布內容,消費者在此訂閱並接收發布的內容。
2)消費者(consumer)
客戶端,從註冊中心獲取到方法,可以呼叫生產者中的方法。
3)生產者(provider)
服務端,生產內容,生產前需要依賴容器(先啟動容器)。
4)容器(container)
生產者在啟動執行的時候,必須依賴容器才能正常啟動(預設依賴的是spring容器),
5)監控(Monitor)
統計服務的呼叫次數與時間等。
Dubbo的架構設計
Dubbo整體架構如下圖所示:
圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面, 位於中軸線上的為雙方都用到的介面。
Dubbo框架設計一共劃分了10個層:
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呼叫流程
對照上面的整體架構圖,大致分為以下8大步驟:
1、服務提供者啟動,開啟Netty服務,建立Zookeeper客戶端,向註冊中心註冊服務;
2、服務消費者啟動,透過Zookeeper向註冊中心獲取服務提供者列表,與服務提供者透過Netty建立長連線;
3、服務消費者透過介面開始遠端呼叫服務,ProxyFactory透過初始化Proxy物件,Proxy透過建立動態代理物件;
4、動態代理物件透過invoke方法,層層包裝生成一個Invoker物件,該物件包含了代理物件;
5、Invoker透過路由,負載均衡選擇了一個最合適的服務提供者,在透過加入各種過濾器,協議層包裝生成一個新的DubboInvoker物件;
6、再透過交換成將DubboInvoker物件包裝成一個Reuqest物件,該物件透過序列化透過NettyClient傳輸到服務提供者的NettyServer端;
7、到了服務提供者這邊,再透過反序列化、協議解密等操作生成一個DubboExporter物件,再層層傳遞處理,會生成一個服務提供端的Invoker物件;
8、這個Invoker物件會呼叫本地服務,獲得結果再透過層層回撥返回到服務消費者,服務消費者拿到結果後,再解析獲得最終結果。
作者簡介
陳睿 | mikechen ,10年+大廠架構經驗,《mikechen的網際網路架構》系列文章作者,專注於網際網路架構技術。
閱讀「mikechen 的網際網路架構」40W 字 技術文章合集
關注「mikechen 的網際網路架構」公眾號,回覆【 架構】即可領取
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011997/viewspace-2919796/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Kafka 架構和原理機制 (圖文全面詳解)Kafka架構
- Nginx 快取機制詳解!非常詳細實用Nginx快取
- 詳解 php 反射機制原理PHP反射
- 詳解Apache Dubbo的SPI實現機制Apache
- 圖解Dubbo,6 種擴充套件機制詳解圖解套件
- Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析Java虛擬機JVMGC
- 圖文詳解 HDFS 的工作機制及其原理
- dubbo容錯機制和負載均衡負載
- MySQL索引機制(詳細+原理+解析)MySql索引
- springcloud eureka原理和機制SpringGCCloud
- 深入詳解Java反射機制與底層實現原理?Java反射
- Dubbo原始碼分析(六)Dubbo通訊的編碼解碼機制原始碼
- 圖解Dubbo,Dubbo服務介面詳解圖解
- Java SPI機制詳解Java
- Spring事件機制詳解Spring事件
- Redis 事件機制詳解Redis事件
- TCP可靠機制詳解TCP
- 詳解Condition的await和signal等待/通知機制AI
- Java 型別資訊詳解和反射機制Java型別反射
- springMVC 的工作原理和機制SpringMVC
- 圖解 Java 垃圾回收機制,寫得非常好!圖解Java
- Dubbo的微核心機制
- Dubbo(一)-SPI(2) 機制之 Dubbo 的 SPI
- 交換機的作用、功能和工作原理詳解
- 圖解Dubbo,Dubbo服務消費詳解圖解
- JavaScript非同步機制詳解JavaScript非同步
- js執行機制詳解JS
- Java-SPI機制詳解Java
- Roguelike機制的原理和應用
- 聊聊Dubbo - Dubbo可擴充套件機制實戰套件
- 圖解Dubbo,Dubbo服務提供者詳解圖解
- Flutter完整開發實戰詳解(十三、全面深入觸控和滑動原理)Flutter
- Dubbo 原始碼分析 - SPI 機制原始碼
- Zookeeper的基本命令詳解和ACL和watch監聽機制
- Dubbo原始碼分析(三)Dubbo中的SPI和自適應擴充套件機制原始碼套件
- linux核心IDR機制詳解【轉】Linux
- iOS APP簽名機制詳解iOSAPP
- android事件分發機制詳解Android事件