PS:dubbo啟動需要注冊中心秸脱,提供一個個人云zk地址:159.75.49.126:2181,還有其他組件部蛇,redis摊唇、kafka、mysql搪花,端口是默認(rèn)端口遏片。
其實(shí)dubbo官網(wǎng)文檔已經(jīng)是比較清晰了,以下兩張圖撮竿,基本是核心思路吮便。
dubbo服務(wù)生產(chǎn)者服務(wù)注冊流程,版本:3.0.10
a幢踏、注冊流程大致調(diào)用棧
// 一般dubbo依賴spring啟動髓需,spring啟動流程不清楚的要另外看下
org.springframework.context.support.AbstractApplicationContext#finishRefresh
// spring事件發(fā)布
org.springframework.context.support.AbstractApplicationContext#publishEvent(org.springframework.context.ApplicationEvent)
// dubbo實(shí)現(xiàn)的監(jiān)聽器接口
org.apache.dubbo.config.spring.context.DubboDeployApplicationListener#onApplicationEvent
// 啟動dubbo部署
org.apache.dubbo.config.deploy.DefaultModuleDeployer#start
// 發(fā)布dubbo接口到注冊中心
org.apache.dubbo.config.ServiceConfig#export
// 這里就是主要的發(fā)布邏輯了
org.apache.dubbo.registry.integration.RegistryProtocol#export
// 將服務(wù)注冊到注冊中心
org.apache.dubbo.registry.support.FailbackRegistry#register
b、消費(fèi)者向注冊中心注冊監(jiān)聽器房蝉,以及注冊中心回調(diào)消費(fèi)者過程僚匆,以zk為例
// 消費(fèi)者發(fā)布接口到zk
org.apache.dubbo.registry.integration.RegistryProtocol#export
// dubbo客戶端注冊zk watcher監(jiān)聽
org.apache.dubbo.registry.zookeeper.ZookeeperRegistry#doSubscribe
// 會調(diào)到zk提供的注冊監(jiān)聽api
org.apache.zookeeper.ZooKeeper#getData(java.lang.String, org.apache.zookeeper.Watcher, org.apache.zookeeper.data.Stat)
// 當(dāng)zk節(jié)點(diǎn)發(fā)生修改時
org.apache.zookeeper.server.DataTree#setData
// 觸發(fā)zk節(jié)點(diǎn)事件監(jiān)聽
org.apache.zookeeper.server.watch.WatchManager#triggerWatch(java.lang.String, org.apache.zookeeper.Watcher.Event.EventType, org.apache.zookeeper.server.watch.WatcherOrBitSet)
// 發(fā)送節(jié)點(diǎn)事件給消費(fèi)者客戶端
org.apache.zookeeper.server.NIOServerCnxn#process
// 消費(fèi)者客戶端接收到節(jié)點(diǎn)修改事件通知
org.apache.zookeeper.ClientCnxn.SendThread#readResponse
// 消費(fèi)者客戶端將通知放入等待事件隊(duì)列
org.apache.zookeeper.ClientCnxn.EventThread#queueEvent(org.apache.zookeeper.WatchedEvent, java.util.Set<org.apache.zookeeper.Watcher>)
// 消費(fèi)者客戶端線程消費(fèi)等待事件隊(duì)列
org.apache.zookeeper.ClientCnxn.EventThread#run
// 消費(fèi)者客戶端處理節(jié)點(diǎn)變更事件,這個就是回調(diào)前面注冊的監(jiān)聽器
org.apache.zookeeper.ClientCnxn.EventThread#processEvent