天天看點

Dubbo架構介紹及應用

作者:Undo

Dubbo簡介

首先,我們學習一項新技術,腦海裡面第一反應,這個東西是什麼,有何特性,能幹什麼?

百度百科給出的回答:

Dubbo架構介紹及應用

1.Dubbo是什麼?

Dubbo是一個分布式服務架構,緻力于提供高性能和透明化的RPC遠端服務調用,以及SOA服務治理方案。

2.Dubbo有何特性?

Dubbo架構介紹及應用

Dubbo快速入門

Dubbo開源代碼提供示範demo,我們這裡就以它為例子,實作快速入門。

項目結構如圖所示:

Dubbo架構介紹及應用

Dubbo快速入門(第一步)

定義服務接口:該接口需單獨打包,在服務提供方和消費方共享

Dubbo架構介紹及應用
Dubbo架構介紹及應用

Dubbo快速入門(第二步)

在服務提供方提供接口的實作:DemoServiceImpl,接口中的方法的具體實作在此類中提供具體的邏輯處理。

Dubbo架構介紹及應用
Dubbo架構介紹及應用

服務提供者配置資訊

dubbo.application.name=dubbo-demo-annotation-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880           
Dubbo架構介紹及應用

Dubbo快速入門(第三步)

配置服務消費者

消費者配置資訊:

dubbo.application.name=dubbo-demo-annotation-consumer

dubbo.registry.address=zookeeper://127.0.0.1:2181

Dubbo架構介紹及應用

好了上面就是dubbo簡單的入門工作。

Dubbo架構設計淺析

Dubbo架構介紹及應用

節點說明

Dubbo架構介紹及應用

調用關系說明

服務容器負責啟動,加載,運作服務提供者

服務提供者啟動時,向注冊中心注冊自己提供的服務。

服務消費者在啟動時,想注冊中心訂閱自己所需的服務

注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将長連接配接推送變更資料給消費者

服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用

服務消費者和提供者,在記憶體中累計調用次數和調用時間,宋史每分鐘發送一次資料到監控中心

Dubbo源碼解讀

dubbo服務整體調用圖

Dubbo架構介紹及應用

各層說明

config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類
proxy 服務代理層:服務接口透明代理,生成服務的用戶端 Stub 和伺服器端 Skeleton, 以 ServiceProxy 為中心,擴充接口為 ProxyFactory
registry 注冊中心層:封裝服務位址的注冊與發現,以服務 URL 為中心,擴充接口為 RegistryFactory, Registry, RegistryService
cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以 Invoker 為中心,擴充接口為 Cluster, Directory, Router, LoadBalance
monitor 監控層:RPC 調用次數和調用時間監控,以 Statistics 為中心,擴充接口為 MonitorFactory, Monitor, MonitorService
protocol 遠端調用層:封裝 RPC 調用,以 Invocation, Result 為中心,擴充接口為 Protocol, Invoker, Exporter
exchange 資訊交換層:封裝請求響應模式,同步轉異步,以 Request, Response 為中心,擴充接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以 Message 為中心,擴充接口為 Channel, Transporter, Client, Server, Codec
serialize 資料序列化層:可複用的一些工具,擴充接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool
           

服務提供者啟動過程

spring 初始化bean上下文周期

sping bean初始化,再最後refresh操作的,會有一個ApplicationEvent事件發出,dubbo DubboLifecycleComponentApplicationListener監聽spring 事件,初始化dubbo元件bean的生命周期,如:

服務暴露過程:

正真的初始化在dubbo初始化完成之後,ApplicationEventMulticaster用來通知所有的觀察者對象,這裡是DubboBootstrapApplicationListener,這裡監聽到事件,會實作服務提供者相關操作。具體實作暴露服務功能在DubboBootstrap類中的start()方法中。

Dubbo架構介紹及應用

初始化操作

dobbo初始化的過程,如:

Dubbo架構介紹及應用

服務暴露過程,如:

Dubbo架構介紹及應用

ServiceConfig

Dubbo架構介紹及應用

将服務注冊到注冊中心去

Dubbo架構介紹及應用

注冊過程

1.将服務注冊到系統資料庫

2.通知訂閱者系統資料庫變動

Dubbo架構介紹及應用

服務暴露

Dubbo架構介紹及應用

消費者啟動過程

AbstractAnnotationBeanPostProcessor

Dubbo架構介紹及應用

消費者注入bean過程

ReferenceAnnotationBeanPostProcessor

Dubbo架構介紹及應用

注冊服務進系統資料庫

Dubbo架構介紹及應用

Dubbo SPI 機制擴充注冊中心

Dubbo架構介紹及應用

SPI(Service Provider Interface),是Java提供的一套用來被第三方實作或者擴充的API,它可以用來啟用架構擴充和替換元件。

整體機制圖如下:

Dubbo架構介紹及應用

Dubbo 的擴充點加載從 JDK 标準的 SPI (Service Provider Interface) 擴充點發現機制加強而來。

Dubbo改進了JDK标準的SPI的所面臨的一些問題;

1.JDK 标準的 SPI 會一次性執行個體化擴充點所有實作,如果有擴充實作初始化很耗時,但如果沒用上也加載,會很浪費資源。

2.增加了對擴充點 IoC 和 AOP 的支援,一個擴充點可以直接 setter 注入其它擴充點。

3.如果擴充點加載失敗,連擴充點的名稱都拿不到了。比如:JDK 标準的 ScriptEngine,通過 getName() 擷取腳本類型的名稱,但如果 RubyScriptEngine 因為所依賴的 jruby.jar 不存在,導緻 RubyScriptEngine 類加載失敗,這個失敗原因被吃掉了,和 ruby 對應不起來,當使用者執行 ruby 腳本時,會報不支援 ruby,而不是真正失敗的原因。

基于hazelcast實作的注冊中心

Dubbo架構介紹及應用
Dubbo架構介紹及應用

繼續閱讀