dubbo服務暴露

 想熟悉dubbo源碼,首先要知道dubbo extensionLoader,而dubbo的這種擴展機制,是根據java spi衍生而來。java

這是基礎,可是我放在後面說明。網絡

 

一:dubbo demo provider在啓動過程當中,主要作了:框架

1.暴露本地服務jvm

2.暴露遠程服務分佈式

3.啓動nettyide

4.連接zookeeperurl

5.到zookeeper註冊線程

6.zookeeper事件通知debug

 

下面多圖預警:設計

官網的兩個圖拿來:

1.服務提供者暴露一個服務的過程

 

2.暴露時序服務

 

入口就在serviceConfig裏,我一步步走,代碼運行到:

private void doExportUrls() {
List<URL> registryURLs = loadRegistries(true);
for (ProtocolConfig protocolConfig : protocols) {
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
}
}

 

這裏遍歷的主要緣由就是dubbo對多協議的支持。

//配置不是remote的狀況下作本地暴露 (配置爲remote,則表示只暴露遠程服務)
if (!Constants.SCOPE_REMOTE.toString().equalsIgnoreCase(scope)) {
exportLocal(url);
}

本地暴露的細節:本地服務暴露是暴露在jvm中,不須要遠程通訊。
@SuppressWarnings({"unchecked", "rawtypes"})
private void exportLocal(URL url) {
if (!Constants.LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
URL local = URL.valueOf(url.toFullString())
.setProtocol(Constants.LOCAL_PROTOCOL)
.setHost(LOCALHOST)
.setPort(0);
Exporter<?> exporter = protocol.export(
proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
exporters.add(exporter);
logger.info("Export dubbo service " + interfaceClass.getName() + " to local registry");
}
}

 

關注一下proxyFactory怎麼定義的:

private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();

這裏就用到了dubbo的擴展機制。

proxyFactory動態編譯,沒法看到生成的代碼,可是能夠調整log4j的日誌級別debug級別,具體代碼定位在:

ExtensionLoader中的

createAdaptiveExtensionClassCode()方法

 

根據控制檯打印的code信息,我新建了一個ProxyFactory$Adaptive,截圖以下:

最終執行到

JavassistProxyFactory的getInvoker()方法

到這裏我已經把具體服務到invoker的轉換調通了,分割線下就是主要的邏輯:從invoker到exporter的過程,也是重點。

=============================================================分割線==============================================================

一:本地服務的暴露
用相同的方法,控制檯打印了Protocol$Adaptive code 代碼塊,我新建了類,截圖以下:

 

 

 

 

二:遠程服務的暴露
dubbo遠程服務暴露,設計到的知識點太多了,netty io、線程模型,zookeeper分佈式鎖等等

這是dubbo官方圖,圖中標紅的就是遠程服務暴露過程,可是這張圖是從consumer--》provider的過程,因此實際上provider是反過來的。

 流程以下:

跟本地暴露的流程同樣,一步步斷點,最終執行到:

 

 

這裏invoker轉換成了exporter,最終保存在exporterMap中。這個map是用來幹什麼的???

已經到了dubbo protocol,咱們繼續走,開始關聯到server部分。

 

Exchange:按照網絡通訊的理解,這個exchange能夠對應到交換層的意思。

那麼,dubbo 的 exchange 究竟起了什麼做用?

 

這裏要設計到另一個重要的知識點,transporter傳輸層。

 

 

看到了把,這裏的netty和mina都是有名的nio框架,繼續走下去:

 

 

父類主要處理了一下timeout,connectiontimeout和codec等一些基礎設置,最終咱們走到了netty server doOpen()方法,

 

看到這個圖,感受一切都清晰了吧?從新回到了netty上。並把最終的exporter返回。
相關文章
相關標籤/搜索