資料內容:
6. Dubbo 服務器注冊與發(fā)現(xiàn)的流程?
服務容器Container負責啟動,加載,運行服務提供者。
服務提供者Provider在啟動時,向注冊中心注冊自己提供的服務。
服務消費者Consumer在啟動時,向注冊中心訂閱自己所需的服務。
注冊中心Registry返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)
據(jù)給消費者。
服務消費者Consumer,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調
用失敗,再選另一臺調用。
服務消費者Consumer和提供者Provider,在內存中累計調用次數(shù)和調用時間,定時每分鐘發(fā)送一次統(tǒng)
計數(shù)據(jù)到監(jiān)控中心Monitor。
7. Dubbo 的整體架構設計有哪些分層?
接口服務層(Service):該層與業(yè)務邏輯相關,根據(jù) provider 和 consumer 的業(yè)務設計對應的接口和
實現(xiàn)
配置層(Config):對外配置接口,以 ServiceConfig 和 ReferenceConfig 為中心
服務代理層(Proxy):服務接口透明代理,生成服務的客戶端 Stub 和 服務端的 Skeleton,以
ServiceProxy 為中心,擴展接口為 ProxyFactory
服務注冊層(Registry):封裝服務地址的注冊和發(fā)現(xiàn),以服務 URL 為中心,擴展接口為
RegistryFactory、Registry、RegistryService
路由層(Cluster):封裝多個提供者的路由和負載均衡,并橋接注冊中心,以Invoker 為中心,擴展接
口為 Cluster、Directory、Router 和 LoadBlancce
監(jiān)控層(Monitor):RPC 調用次數(shù)和調用時間監(jiān)控,以 Statistics 為中心,擴展接口為
MonitorFactory、Monitor 和 MonitorService
遠程調用層(Protocal):封裝 RPC 調用,以 Invocation 和 Result 為中心,擴展接口為Protocal、
Invoker 和 Exporter
信息交換層(Exchange):封裝請求響應模式,同步轉異步。以 Request 和Response 為中心,擴展
接口為 Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer
網(wǎng)絡 傳輸 層(Transport):抽象 mina 和 netty 為統(tǒng)一接口,以 Message 為中心,擴展接口為
Channel、Transporter、Client、Server 和 Codec
數(shù)據(jù)序列化層(Serialize):可復用的一些工具,擴展接口為 Serialization、ObjectInput、
ObjectOutput 和 ThreadPool
8. Dubbo Monitor 實現(xiàn)原理?
Consumer 端在發(fā)起調用之前會先走 filter 鏈;provider 端在接收到請求時也是先走 filter 鏈,然后才進行
真正的業(yè)務邏輯處理。默認情況下,在 consumer 和 provider 的 filter 鏈中都會有Monitorfilter。
MonitorFilter 向 DubboMonitor 發(fā)送數(shù)據(jù)
DubboMonitor 將數(shù)據(jù)進行聚合后(默認聚合 1min 中的統(tǒng)計數(shù)據(jù))暫存到
ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一個含有 3 個線程(線程名
字:DubboMonitorSendTimer)的線程池每隔 1min 鐘,調用 SimpleMonitorService 遍歷發(fā)送
statisticsMap 中的統(tǒng)計數(shù)據(jù),每發(fā)送完畢一個,就重置當前的 Statistics 的AtomicReference
SimpleMonitorService 將這些聚合數(shù)據(jù)塞入 BlockingQueue queue 中(隊列大寫為 100000)
SimpleMonitorService 使用一個后臺線程(線程名為:DubboMonitorAsyncWriteLogThread)將
queue 中的數(shù)據(jù)寫入文件(該線程以死循環(huán)的形式來寫)
SimpleMonitorService 還會使用一個含有 1 個線程(線程名字:DubboMonitorTimer)的線程池每隔
5min 鐘,將文件中的統(tǒng)計數(shù)據(jù)畫成圖表