想熟悉dubbo源码,首先要知道dubbo extensionLoader,而dubbo的这种扩展机制,是根据java spi衍生而来。

这是基础,但是我放在后面说明。

一:dubbo demo provider在启动过程中,主要做了:

1.暴露本地服务

2.暴露远程服务

3.启动netty

4.链接zookeeper

5.到zookeeper注册

6.zookeeper事件通知

下面多图预警:

官网的两个图拿来:

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返回。
												

dubbo服务暴露的更多相关文章

  1. 《Duubo系列》-Dubbo服务暴露过程

    我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...

  2. Dubbo 服务暴露注册流程

    Dubbo的应用会在启动时完成服务注册或订阅(不论是生产者,还是消费者)如下图所示. 图中小方块Protocol, Cluster, Proxy, Service, Container, Regist ...

  3. dubbo系列四、dubbo服务暴露过程源码解析

    一.代码准备 1.示例代码 参考dubbo系列二.dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台) 2.简单了解下spring自定义标签 https://w ...

  4. dubbo服务暴露过程

    所谓服务暴露最终做的事情:绑定网络端口,开启serversokect服务以接收外部请求 服务暴露时序图 本地暴露 远程暴露 整体总结 dubbo服务提供者暴露服务的主过程:首先 ServiceConf ...

  5. Dubbo服务暴露分析

    Dubbo的服务暴露是一个重要的特性,了解其机制很重要.之前有很多人写了有关的源代码分析,在本文中不再重新分析.官方文档中的一篇写的就很好,本文主要是有关内容进行补充与总结. 传送门:服务导出 为什么 ...

  6. Dubbo服务暴露源码解析②

    目录 0.配置解析 1.开始export 2.组装URL 3.服务暴露 疑问解析 ​ 先放一张官网的服务暴露时序图,对我们梳理源码有很大的帮助.注:不论是暴露还是导出或者是其他翻译,都是描述expor ...

  7. dubbo服务暴露原理-远程暴露

    1.与本地暴露相比,远程暴露也大同小异 我们已经到了第三个关键词Procotol我们来看看他的继承体系图 按照经典图的路线,我们下一个关键词应该就是Server了,从方法名openServer(url ...

  8. dubbo服务暴露原理

    1.发布流程 暴露本地服务 暴露远程服务 启动netty 连接zookeeper 到zookeeper注册 监听zookeeper 2.官方文档 3.看输出日志,就会发现在暴露本地服务之前,有一句很重 ...

  9. Dubbo服务暴露延迟

    Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要warmup事件,就可以使用delay进行服务延迟暴露.只需在服务提供者的<dubbo:service/>标签中添加delay属 ...

随机推荐

  1. PLS-00357: Table,View Or Sequence reference 'SEQ_TRADE_RECODE.NEXTVAL' not allowed in this context

    oracle数据库: 为了使ID自增,建了序列后,创建触发器: create or replace TRIGGER TRIG_INSERT_TRADE_RECODE BEFORE INSERT ON ...

  2. vue-cli3使用webpack-spritesmith配置雪碧图

    一.背景问题 项目中如果有大量的小图标,如果不使用阿里的iconfont.UI给一个加一个,加一个引用一个,每个图标虽然很小,但是也是一次请求,每次请求都是消耗性能资源的. 二.解决思路 使用webp ...

  3. 关于Python的协程问题总结

    协程其实就是可以由程序自主控制的线程 在python里主要由yield 和yield from 控制,可以通过生成者消费者例子来理解协程 利用yield from 向生成器(协程)传送数据# 传统的生 ...

  4. Python母版使用

    设定base.html为母版,母版是页面的公共部分,可以减少代码冗余: 母版中变化的部分用:  {% block page-main % }  <!--page-mains是自己起的名称--&g ...

  5. 论文阅读笔记 Word Embeddings A Survey

    论文阅读笔记 Word Embeddings A Survey 收获 Word Embedding 的定义 dense, distributed, fixed-length word vectors, ...

  6. Linux Git用户组

    Vivien: groupadd admin useradd -d /home/bill -s /bin/bash -m bill 用户组 查看用户列表 cat /etc/passwd 或者 cat ...

  7. Java构造器与构建器的使用

    我们在平常类的构建过程中,可能会面临很多问题,可扩张性.安全性等等.想象一下,这样一个场景,我们现在要创建一个类,其中有6个属性,其中又有4个属性的值是不太确定的(可能某个对象就不需要其中的某个值), ...

  8. 关于文件目录等的特殊权限setuid, setgid , sticky chattr, lsattr

    有三种特殊权限 总之, 设置这些特殊权限有两种方法, 一是使用 chmod ugo的方式, 另一个是 使用 数字的方式, 通常的读写执行 权限 是 3位 数字, 那么 特殊权限 就用 4位数字, 而且 ...

  9. Sitecore8.2 Solr5.1.0配置步骤

    1.首先下载Solr安装包,官方提供了几种下载,我选的的solr的5.1.0版本zip包,下载链接:http://mirror.bit.edu.cn/apache/lucene/solr. 2.下载后 ...

  10. Notepad++的Json格式化插件

    安装  :1.下载插件压缩包并解压出dll:Jsonviewer2.dll(64位)或NPPJSONViewer.dll(32位); 2..拷贝对应dll到Notepad++安装目录下的plugins ...