dubbo服务暴露
想熟悉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服务暴露的更多相关文章
- 《Duubo系列》-Dubbo服务暴露过程
我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...
- Dubbo 服务暴露注册流程
Dubbo的应用会在启动时完成服务注册或订阅(不论是生产者,还是消费者)如下图所示. 图中小方块Protocol, Cluster, Proxy, Service, Container, Regist ...
- dubbo系列四、dubbo服务暴露过程源码解析
一.代码准备 1.示例代码 参考dubbo系列二.dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台) 2.简单了解下spring自定义标签 https://w ...
- dubbo服务暴露过程
所谓服务暴露最终做的事情:绑定网络端口,开启serversokect服务以接收外部请求 服务暴露时序图 本地暴露 远程暴露 整体总结 dubbo服务提供者暴露服务的主过程:首先 ServiceConf ...
- Dubbo服务暴露分析
Dubbo的服务暴露是一个重要的特性,了解其机制很重要.之前有很多人写了有关的源代码分析,在本文中不再重新分析.官方文档中的一篇写的就很好,本文主要是有关内容进行补充与总结. 传送门:服务导出 为什么 ...
- Dubbo服务暴露源码解析②
目录 0.配置解析 1.开始export 2.组装URL 3.服务暴露 疑问解析 先放一张官网的服务暴露时序图,对我们梳理源码有很大的帮助.注:不论是暴露还是导出或者是其他翻译,都是描述expor ...
- dubbo服务暴露原理-远程暴露
1.与本地暴露相比,远程暴露也大同小异 我们已经到了第三个关键词Procotol我们来看看他的继承体系图 按照经典图的路线,我们下一个关键词应该就是Server了,从方法名openServer(url ...
- dubbo服务暴露原理
1.发布流程 暴露本地服务 暴露远程服务 启动netty 连接zookeeper 到zookeeper注册 监听zookeeper 2.官方文档 3.看输出日志,就会发现在暴露本地服务之前,有一句很重 ...
- Dubbo服务暴露延迟
Dubbo 2.6.5 版本以后,如果我们的服务启动过程需要warmup事件,就可以使用delay进行服务延迟暴露.只需在服务提供者的<dubbo:service/>标签中添加delay属 ...
随机推荐
- Git仓库完全迁移,包括所有的分支和标签,当然也包括日志
一.删除原有远程仓库地址 git remote rm origin 添加新的仓库地址 cd existing_repo git remote add origin <URL> git pu ...
- C++中的纯虚方法
在学习数据结构中优先级队列时遇到纯虚方法的定义,一时没想起来,便查了一下. 1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义 ...
- vue强制刷新组件
<component v-if="hackReset"></component>(组件名称) data:hackReset (事件执行) this.hack ...
- appium+夜神+python3 环境配置
先感慨一下真的心累啊,踩了好多坑,断断续续四天终于把环境彻底搭建完了,由于之前看的网上的帖子都不是很全而且还带坑,决定自己写一篇综述,作为笔记. 一,首先是安装需要的环境: 需要用到的软件: 1. j ...
- Codeforces Round #503 (by SIS, Div. 2)
连接:http://codeforces.com/contest/1020 C.Elections 题型:你们说水题就水题吧...我没有做出来...get到了新的思路,不虚.好像还有用三分做的? KN ...
- SPOJ 1812 LCS2 - Longest Common Substring II
思路 后缀自动机求多串的最长公共子串 对第一个建出后缀自动机,其他的在SAM上匹配,更新到一个节点的匹配长度最大值即可,最后对所有最大值取min得到一个节点的答案,对所有节点答案求max即可 然后注意 ...
- Linux操作系统的VI命令
Linux操作系统的VI命令 VI是Linux系统的一个文本编辑器,该编辑器可以通过使用VI命令来操作,从而完成对文本的编辑.熟练掌握一些常用的VI命令,可以大大简化编辑操作并提高操作Linux文本的 ...
- webpack的css样式文件加载依赖
1.需要两个依赖包: npm i style-loader css-loader -D
- centos7 基础命令
一: linux基础 (1) 查看服务器的IP信息 ip add showifconfig (2) 操作网卡命令(重启网络和启用网卡) systemctl restart networksystemc ...
- .net core创建控制台应用程序和mvc程序
一.创建控制台应用程序 1.查看支持哪些类型:dotnet new --help 2.创建项目(先定位到需要创建的目录) dotnet new console -o ./myconsole 3.查看目 ...