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返回。
相关文章
相关标签/搜索