Dubbo源码分析系列---服务的发布
摘要:
通过解析配置文件,将xml定义的Bean解析并实例化,(涉及重要的类:ServiceBean、RegistryConfig[注册中心配置]、ProtocolConfig[协议配置]、ApplicationConfig[应用配置]),最终向注册中心注册服务提供方的过程。这里我们重点分析provider是如何注册到注册中心的?注册了那些内容?
如何注册到注册中心:
1、准备工作做好:RegistryConfig、ProtocolConfig、ApplicationConfig类作为ServiceBean的属性存在,在export之前先检查这些属性有没有赋值,没有的话会使用默认的配置实例化并赋值
2、doExportUrls:组装需要向注册中心注册的URL,根据配置的不同协议(默认dubbo),向注册中心注册相应的地址
private void doExportUrls() {
List<URL> registryURLs = loadRegistries(true);
for (ProtocolConfig protocolConfig : protocols) {
doExportUrlsFor1Protocol(protocolConfig, registryURLs);
}
}
2.1、组装URL:loadRegistries(true)
registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.0&owner=william&pid=5916®istry=zookeeper×tamp=1496647142958
组装完成后的URL就是上面那样。
2.2、向注册中心注册:
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
Exporter<?> exporter = protocol.export(invoker);
2.2.1、proxyFactory为javassist字节码生成的Adaptive实例,其getInvoker方法通过URL参数调用具体的扩展点(参见扩展点自适应),并调用扩展点的getInvoker方法。
2.2.2、protocol也是动态生成的Adaptive实例,因为Url中的protocol属性为Registry,所以具体的扩展点实现是RegistryProtocol,又因为Protocol实现了装饰器模式,
ProtocolListenerWrapper,ProtocolFilterWrapper是装饰器模式的2个实现。所以export的调用过程如下:
ProtocolFilterWrapper.export()--》ProtocolListenerWrapper.export()--》RegistryProtocol.export()
wapper类只是方便我们自己做些额外的处理,最终向注册中心注册的过程在RegistryProtocol中。
2.2.3、在2.2.2步骤中实例化RegistryProtocol后,会检查属性中是否有启用扩展点加载的,有则一并创建对应属性的Adaptive实例。
A、doLocalExport:创建ExchangeServer绑定回调,开启Netty连接,保持通信。
B、register:向注册中心注册临时节点:(节点名)
/dubbo/com.alibaba.dubbo.demo.DemoService/providers/dubbo%3A%2F%2F192.168.3.6%3A20880%2Fcom.alibaba.dubbo.demo.DemoService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.0.0%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.demo.DemoService%26loadbalance%3Droundrobin%26methods%3DsayHello%26owner%3Dwilliam%26pid%3D6380%26side%3Dprovider%26timestamp%3D1497161144248
C、创建configurators节点,对该节点添加子节点监听,当该节点有变化重新暴露,相当于执行A
/dubbo/com.alibaba.dubbo.demo.DemoService/configurators 监听的节点
注册了哪些内容:
创建/dubbo/com.alibaba.dubbo.demo.DemoService/providers/(url)节点
创建/dubbo/com.alibaba.dubbo.demo.DemoService/configurators 节点,并对该节点添加监听
发布活动图(转):

参考:
Dubbo源码分析系列---服务的发布的更多相关文章
- dubbo源码分析13——服务本地暴露 exportLocal(url)
dubbo服务的本地暴露,显然是针对当服务消费者和服务提供者都在同一个jvm的进程内这种场景 .通常是发生在服务之间的调用的情况下.一种情况就是A服务调用B服务的情况,如果A服务和B服务都是在一个线程 ...
- dubbo源码分析8——服务暴露概述
从上文中可知,com.alibaba.dubbo.config.spring.ServiceBean类是负责解析<dubbo:service/>的配置的,下面是它的类图 从类图上可知它继承 ...
- Dubbo 源码分析系列之一环境搭建
环境搭建的步骤有哪些 依赖外部的环境 使用的开发工具 源码的拉取 结构大致介绍 1 依赖的外部环境 安装JDK 安装Git 安装maven 这边我们就不介绍怎么安装这些外部环境了,大家自行从安装这些外 ...
- dubbo源码分析10——服务暴露1_export()方法分析
ServiceConfig类中的export()方法,是dubbo服务暴露的入口方法,被触发的时机有两个: 1. spring容器初始化完成所有的bean实例后,通过事件机制触发 2. 实现Initi ...
- Dubbo源码分析系列---扩展点加载
扩展点配置: 约定: 在扩展类的jar包内,放置扩展点配置文件:META-INF/dubbo/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔.(摘自dubbo文档) 示例: ...
- dubbo源码分析12——服务暴露3_doExportUrls()方法分析
本文紧接上文,doExportUrls()方法位于ServiceConfig类中,代码入口如下: private void doExportUrls() { List<URL> regis ...
- Dubbo 源码分析系列之三 —— 架构原理
1 核心功能 首先要了解Dubbo提供的三大核心功能: Remoting:远程通讯 提供对多种NIO框架抽象封装,包括"同步转异步"和"请求-响应"模式的信息交 ...
- dubbo源码分析11——服务暴露2_doExport()方法分析
protected synchronized void doExport() { //如果是已经解除暴露的接口则抛出异常 if (unexported) { throw new IllegalStat ...
- Dubbo 源码分析 - 服务调用过程
注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...
随机推荐
- C++ 头文件系列(system_error)
1.为什么system_error "....report error conditions originating from the operating system or low-lev ...
- 商城项目实战 | 2.1 Android 仿京东商城——自定义 Toolbar (一)
前言 本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 现在很多的 APP 里面都有自己的自定义风格,特别是京东商城中自 ...
- 谈一下我们是如何开展code review的
众所周知,代码审查是软件开发过程中十分重要的环节,楼主结合自己的实际工作经验,和大家分享一下在实际工作中代码审查是如何开展的, 笔者水平有限,若有错误和纰漏,还请大家指正. 代码审查的阻力 我想不通公 ...
- Angular2.js——数据显示
显示数据,即属性绑定机制把数据显示到用户界面上. 在Angular中最典型的数据显示方式,就是把HTML模板中的控件绑定到Angular组件的属性. 接下来介绍几种数据显示的语法和代码片段. 使用插值 ...
- 在linux系统中跟踪高IO等待
原文作者:Jon Buys 原文地址:http://ostatic.com/blog/tracking-down-high-io-wait-in-linux 译者:Younger Liu,本作品采用知 ...
- web安全色
web安全色产生的原因 不同的平台(Mac.PC等)有不同的调色板,不同的浏览器也有自己的调色板.这就意味着对于一幅图,显示在Mac上的Web浏览器中的图像,与它在PC上相同浏览器中显示的效果可能差别 ...
- TCP/IP协议精华笔记
1.简介 TCP/IP协议并非单指TCP协议.IP协议,它是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议.ICMP(Internet Control Mes ...
- Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】
接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy 动态代理 Befor talking abou ...
- scala 异常处理机制
有经验的码农都知道,程序开发的差不多的时候,为了提高程序的稳健性,是一定要加上异常处理机制的 在scala中,用try/catch/finally实现该功能,这个在我的博客,数字转汉字小工具中有体现, ...
- 获取安卓的SH1安全码
用于获取手机联系人 信息 public static String sHA1(Context context) { try { PackageInfo info = context.getPac ...