Dubbo工作流程
一、dubbo整體架構(gòu)
其中Service 和 Config 層為 API,對應(yīng)服務(wù)提供方來說是使用ServiceConfig來代表一個要發(fā)布的服務(wù)配置對象,對應(yīng)服務(wù)消費(fèi)方來說ReferenceConfig代表了一個要消費(fèi)的服務(wù)的配置對象??梢灾苯映跏蓟渲妙?,也可以通過 spring 解析配置生成配置類。
proxy 服務(wù)代理層:擴(kuò)展接口為 ProxyFactory,dubbo實(shí)現(xiàn)的SPI主要JavassistProxyFactory(默認(rèn)使用)和JdkProxyFactory,用來對服務(wù)提供方和服務(wù)消費(fèi)方的服務(wù)進(jìn)行代理。
registry 注冊中心層:封裝服務(wù)地址的注冊與發(fā)現(xiàn),擴(kuò)展接口為 Registry , RegistryService,Dubbo提供的擴(kuò)展接口實(shí)現(xiàn)為ZookeeperRegistry,RedisRegistry,MulticastRegistry,DubboRegistry。
擴(kuò)展接口RegistryFactory,dubbo提供的擴(kuò)展接口實(shí)現(xiàn)DubboRegistryFactory,DubboRegistryFactory,RedisRegistryFactory,ZookeeperRegistryFactory。
cluster 路由層:封裝多個提供者的路由及負(fù)載均衡,并橋接注冊中心,
擴(kuò)展接口為 Cluster , Directory , Router ,LoadBalance。
monitor 監(jiān)控層:RPC 調(diào)用次數(shù)和調(diào)用時間監(jiān)控,擴(kuò)展接口為 MonitorFactory , Monitor , MonitorService。
protocol 遠(yuǎn)程調(diào)用層:封將 RPC 調(diào)用,擴(kuò)展接口為 Protocol , Invoker , Exporter。
exchange 信息交換層:封裝請求響應(yīng)模式,同步轉(zhuǎn)異步,擴(kuò)展接口為 Exchanger , ExchangeChannel ,ExchangeClient , ExchangeServer
transport 網(wǎng)絡(luò)傳輸層:抽象 mina 和 netty 為統(tǒng)一接口擴(kuò)展接口為 Channel , Transporter , Client , Server , Codec
serialize 數(shù)據(jù)序列化層:可復(fù)用的一些工具,擴(kuò)展接口為 Serialization ,ObjectInput , ObjectOutput , ThreadPool
二、dubbo服務(wù)發(fā)布原理
首先 ServiceConfig 類拿到對外提供服務(wù)的實(shí)際類 ref(如:UserServiceImpl),然后通過 ProxyFactory 類的 getInvoker 方法使用 ref 生成一個AbstractProxyInvoker 實(shí)例,到這一步就完成具體服務(wù)到 Invoker 的轉(zhuǎn)化。
接下來就是 Invoker 轉(zhuǎn)換到 Exporter 的過程。Dubbo 處理服務(wù)暴露的關(guān)鍵就在 Invoker 轉(zhuǎn)換到 Exporter 的過程,上圖中的紅色部分。
Dubbo 協(xié)議的 Invoker 轉(zhuǎn)為 Exporter 發(fā)生在 DubboProtocol 類的 export 方法,它主要是打開創(chuàng)建一個Netty Server 偵聽服務(wù),并接收客戶端發(fā)來的各種請求,通訊細(xì)節(jié)由 Dubbo 自己實(shí)現(xiàn),然后注冊服務(wù)到服務(wù)注冊中心
三、dubbo消費(fèi)原理
首先 ReferenceConfig 類的 init 方法調(diào)用 Protocol 的 refer 方法生成 Invoker 實(shí)例(如上圖中的紅色部分),這是服務(wù)消費(fèi)的關(guān)鍵。接下來把Invoker 轉(zhuǎn)換為客戶端需要的接口。
dubbo協(xié)議的invoker轉(zhuǎn)換為客戶端需要的接口是發(fā)生在DubboProtocol的refer方法,他主要是創(chuàng)建一個netty client 鏈接服務(wù)提供者,通訊細(xì)節(jié)由 Dubbo 自己實(shí)現(xiàn)。
四、dubbo原理總結(jié)
節(jié)點(diǎn)角色說明:
Provider: 暴露服務(wù)的服務(wù)提供方。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
Registry: 服務(wù)注冊與發(fā)現(xiàn)的注冊中心。
Monitor: 統(tǒng)計服務(wù)的調(diào)用次調(diào)和調(diào)用時間的監(jiān)控中心。
Container: 服務(wù)運(yùn)行容器。
調(diào)用關(guān)系說明:
服務(wù)容器負(fù)責(zé)啟動,加載,運(yùn)行服務(wù)提供者。
服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。
服務(wù)消費(fèi)者在啟動時,向注冊中心訂閱自己所需的服務(wù)。
注冊中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費(fèi)者。
服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
服務(wù)消費(fèi)者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
registry(configServer)
注冊中心,和每個Server/Client之間會作一個實(shí)時的心跳檢測(因?yàn)樗鼈兌际墙⒌腟ocket長連接),比如幾秒鐘檢測一次。收集每個Server提供的服務(wù)的信息,每個Client的信息,整理出一個服務(wù)列表
當(dāng)某個Server不可用,那么就更新受影響的服務(wù)對應(yīng)的serverAddressList,即把這個Server從serverAddressList中踢出去(從地址列表中刪除),同時將推送serverAddressList給這些受影響的服務(wù)的clientAddressList里面的所有Client
新加一個Server時,由于它會主動與ConfigServer取得聯(lián)系,而ConfigServer又會將這個信息主動發(fā)送給Client,所以新加一個Server時,只需要啟動Server,然后幾秒鐘內(nèi),Client就會使用上它提供的服務(wù)
consumer(client)
調(diào)用服務(wù)的機(jī)器,每個Client啟動時,主動與ConfigServer建立Socket長連接,并將自己的IP等相應(yīng)信息發(fā)送給ConfigServer。
Client在使用服務(wù)的時候根據(jù)服務(wù)名稱去ConfigServer中獲取服務(wù)提供者信息(這樣ConfigServer就知道某個服務(wù)是當(dāng)前哪幾個Client在使用),Client拿到這些服務(wù)提供者信息后,與它們都建立連接,后面就可以直接調(diào)用服務(wù)了,當(dāng)有多個服務(wù)提供者的時候,Client根據(jù)一定的規(guī)則來進(jìn)行負(fù)載均衡,如輪詢,隨機(jī),按權(quán)重等。
一旦Client使用的服務(wù)它對應(yīng)的服務(wù)提供者有變化(服務(wù)提供者有新增,刪除的情況),ConfigServer就會把最新的服務(wù)提供者列表推送給Client,Client就會依據(jù)最新的服務(wù)提供者列表重新建立連接,新增的提供者建立連接,刪除的提供者丟棄連接
provider(server)
真正提供服務(wù)的機(jī)器,每個Server啟動時,主動與ConfigServer建立Scoket長連接,并將自己的IP,提供的服務(wù)名稱,端口等信息直接發(fā)送給ConfigServer,ConfigServer就會收集到每個Server提供的服務(wù)的信息。
優(yōu)點(diǎn):
只要在Client和Server啟動的時候,ConfigServer是好的,服務(wù)就可調(diào)用了,如果后面ConfigServer掛了,那只影響ConfigServer掛了以后服務(wù)提供者有變化,而Client還無法感知這一變化。
Client每次調(diào)用服務(wù)是不經(jīng)過ConfigServer的,Client只是與它建立聯(lián)系,從它那里獲取提供服務(wù)者列表而已
調(diào)用服務(wù)-負(fù)載均衡:Client調(diào)用服務(wù)時,可以根據(jù)規(guī)則在多個服務(wù)提供者之間輪流調(diào)用服務(wù)。
服務(wù)提供者-容災(zāi):某一個Server掛了,Client依然是可以正確的調(diào)用服務(wù)的,當(dāng)前提是這個服務(wù)有至少2個服務(wù)提供者,Client能很快的感知到服務(wù)提供者的變化,并作出相應(yīng)反應(yīng)。
服務(wù)提供者-擴(kuò)展:添加一個服務(wù)提供者很容易,而且Client會很快的感知到它的存在并使用它。
總結(jié)
- 上一篇: DAOS 分布式异步对象存储|数据平面
- 下一篇: Xenserver命令大全