進入主題前先看一下dubbo各個節(jié)點的職責及他們的調用關系
DUBBO各節(jié)點圖
節(jié)點角色說明
節(jié)點 | 角色說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務注冊與發(fā)現(xiàn)的注冊中心 |
Monitor | 統(tǒng)計服務的調用次數(shù)和調用時間的監(jiān)控中心 |
Container | 服務運行容器 |
調用關系說明
1:服務容器負責啟動堪藐,加載,運行服務提供者挑围。
2:服務提供者在啟動時礁竞,向注冊中心注冊自己提供的服務。
3:服務消費者在啟動時杉辙,向注冊中心訂閱自己所需的服務模捂。
4:注冊中心返回服務提供者地址列表給消費者,如果有變更蜘矢,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者狂男。
5:服務消費者,從提供者地址列表中品腹,基于軟負載均衡算法岖食,選一臺提供者進行調用,如果調用失敗舞吭,再選另一臺調用泡垃。
6:服務消費者和提供者,在內(nèi)存中累計調用次數(shù)和調用時間羡鸥,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心兔毙。
DUBBO調用鏈圖
上圖所示各個模塊初始化的節(jié)點和調用過程。本次主要對dubbo如何基于Spring實現(xiàn)兄春、dubbo的自定義拓展及dubbo的代理進行詳解。
如何基于Spring實現(xiàn)
1:擴展關鍵入口DubboNamespaceHandler(截圖如下)
2:如何拓展
在DefaultNamespaceHandlerResolver類中會掃描整個項目"META-INF/spring.handlers";文件锡溯。打開dubbo對應的jar包可以找到文件“dubbo-2.5.3.jar!\META-INF\spring.handlers”中的內(nèi)容就是指向DubboNamespaceHandler赶舆。如下圖所示
2.2:dubbo中的bean對象如果定義
在目錄“META-INF/spring.schemas”中定義了對應bean對應的屬性的namespace及屬性如下圖所示
dubbo.xsd中描述了各個標簽對應有哪些屬性。在dubbo-consumer.xml或者dubbo-provider.xml中加入對應xmlns即可如下圖所示
2.3:Spring添加對dubbo標簽的解析
spring添加對dubbo標簽的解析祭饭,如下圖所示
2.4:如何解析dubbo對應Bean
應用啟動導入dubbo-consumer.xml和dubbo-provider.xml文件如下所示:
DubboBeanDefinitionParser實現(xiàn)BeanDefinitionParser接口且重寫了parse方法如下圖所示
在parse方法中對各個節(jié)點進行解析如:ProtocolConfig芜茵、ServiceBean、ProviderConfig倡蝙、ConsumerConfig的解析
2.5:ServiceBean啟動過程
首先看一下ServiceBean類結構如下圖所示九串。
主要的實現(xiàn)在方法onApplicationEvent中,實現(xiàn)了服務配置的解析寺鸥、導出猪钮、Filter鏈包裝及注冊服務等。代碼片段如下
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
if (!isExported() && !isUnexported()) {
if (logger.isInfoEnabled()) {
logger.info("The service ready on spring started. service: " + getInterface());
}
//服務導出
export();
}
}
注冊關鍵內(nèi)容(protocol.export(wrapperInvoker)胆建,實際運行的過程中使用那個實現(xiàn)類由ExtensionLoad加載烤低,后面詳解)如下圖所示
如果想基于spring實現(xiàn)特定功能可以定義自己的xmlns、spring.handler及xsd文件實現(xiàn)笆载。mybatis也是通過同樣的拓展進行實現(xiàn)的如下圖所示: