Dubbo中订阅和通知解析
Dubbo中关于服务的订阅和通知主要发生在服务提供方暴露服务的过程和服务消费方初始化时候引用服务的过程中。
服务引用过程中的订阅和通知
在服务消费者初始化的过程中,会有一步是进行服务的引用,具体的代码是在RegistryProtocol的refer方法:
1 |
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
|
在refer方法中有一步是获取注册中心实例,这一步中也会有一个notify操作,先暂时不解释。接着就是doRefer方法:
1 |
private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
|
在doRefer方法中服务消费者会订阅服务,同时订阅了三种类型:providers,routers,configurators。
接续看directory.subscribe订阅方法,这里directory是RegistryDirectory:
1 |
public void subscribe(URL url) {
|
这里registry是ZookeeperRegistry,在ZookeeperRegistry调用subscribe处理之前会先经过AbstractRegistry的处理,然后经过FailbackRegistry处理,在FailbackRegistry中会调用ZookeeperRegistry的doSubscribe方法。
首先看下AbstractRegistry中subscribe方法:
1 |
public void subscribe(URL url, NotifyListener listener) {
|
然后是FailbackRegistry的subscribe方法:
1 |
public void subscribe(URL url, NotifyListener listener) {
|
这里总共进行了一下几件事情:
- AbstractRegistry的处理
- 移除订阅失败的
- 由具体的子类向服务器端发送订阅请求
- 如果订阅发生失败了,尝试获取缓存url,然后进行失败通知或者如果开启了启动时检测,则直接抛出异常
- 将失败的订阅请求记录到失败列表,定时重试
主要看下子类向服务器段发送订阅请求的步骤,在ZookeeperRegistry的doSubscribe方法中:
1 |
protected void doSubscribe(final URL url, final NotifyListener listener) {
|
上面主要是分别对providers,routers,configurators三种不同类型的进行订阅,也就是往zookeeper中注册节点,注册之前先给url添加监听器。最后是订阅完之后进行通知。
notify方法,这里notify方法实现是在ZookeeperRegistry的父类FailbackRegistry中:
1 |
protected void notify(URL url, NotifyListener listener, List<URL> urls) {
|
看下AbstractRegistry的notify方法:
1 |
protected void notify(URL url, NotifyListener listener, List<URL> urls) {
|
继续看RegistryDirectory的notify方法:
1 |
public synchronized void notify(List<URL> urls) {
|
最重要的重建invoker实例,在服务引用的文章中已经介绍过,不再重复,还有上面说省略的获取注册中心实例的过程中,也会有notify的操作。(这里省略)这里也是进行了invoker实例的重建。
暴露服务过程中的订阅和通知
服务暴露过程中的订阅在RegistryProtocol的export方法中:
1 |
public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {
|
registry.subscribe订阅override数据,会首先经过AbstractRegistry处理,然后经过FailbackRegistry处理。处理方法在上面消费者发布订阅的讲解中都已经介绍。往下的步骤基本相同,不同之处在于AbstractRegistry的notify方法:
1 |
protected void notify(URL url, NotifyListener listener, List<URL> urls) {
|
接下来看OverrideListener的notify方法:
1 |
/* |
这里也是对Invoker重新进行了引用。
Dubbo中订阅和通知解析的更多相关文章
- Dubbo中@Service工作过程解析
Dubbo中@Service工作过程解析 Spring中的BeanPostProcessor 首先我们应当了解到在spring体系中BeanPostProcessor是什么.加载流程 它是什么 Bea ...
- Dubbo中SPI扩展机制解析
dubbo的SPI机制类似与Java的SPI,Java的SPI会一次性的实例化所有扩展点的实现,有点显得浪费资源. dubbo的扩展机制可以方便的获取某一个想要的扩展实现,每个实现都有自己的name, ...
- Dubbo中Directory解析
Directory代表多个Invoker,可以把它看成List Directory接口 Directory接口继承了Node接口: 1234567 public interface Directory ...
- Dubbo中集群Cluster,负载均衡,容错,路由解析
Dubbo中的Cluster可以将多个服务提供方伪装成一个提供方,具体也就是将Directory中的多个Invoker伪装成一个Invoker,在伪装的过程中包含了容错的处理,负载均衡的处理和路由的处 ...
- Dubbo中消费者初始化的过程解析
首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...
- Dubbo中暴露服务的过程解析
dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay="5000"),另外一种是没有设置延迟暴露或者延迟设置为-1(delay="-1"): 设置 ...
- Dubbo中编码和解码的解析
(这里做的解析不是很详细,等到走完整个流程再来解析)Dubbo中编解码的工作由Codec2接口的实现来处理,回想一下第一次接触到Codec2相关的内容是在服务端暴露服务的时候,根据具体的协议去暴露服务 ...
- 7.7 服务远程暴露 - 订阅与通知(TODO)
为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为exporter 启动netty 注册服务到zookeeper 订 ...
- 对Vue中的MVVM原理解析和实现
对Vue中的MVVM原理解析和实现 首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写 下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章 ...
随机推荐
- The 11th tip of DB Query Analyzer
The 11th tip of DB Query Analyzer MA Gen feng ...
- MQ队列与哪些机器连接
1.使用MQ安装用户登录Linux,例如:su - mqm 2.runmqsc Qm1 #Queue 代表要查询的队列3.DISPLAY CONN(*) WHERE(OBJNAME EQ Queue) ...
- nodejs+express blog项目分享
项目简介:项目采用nodejs+express+typescript+mongodb技术搭建 主要功能: 1.用户注册 2.用户登录 3.文章管理模块 4.图片管理模块 5.token认证 6.密码加 ...
- java 深入理解内部类以及之间的调用关系
什么是内部类 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和 ...
- 《深入理解Java虚拟机》读书笔记2--垃圾回收
回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析 转载:http://blog.csdn.net/tjiyu/article/details/5398 ...
- JavaScript脚本放在哪里
在HTML body部分中的JavaScripts会在页面加载的时候被执行. 在HTML head部分中的JavaScripts会在被调用的时候才执行. ----------------------- ...
- ubuntu11.04安装nginx+php+mysql
先列参考内容,后面我再补充点东西: http://www.4wei.cn/archives/1001436 http://www.gidot.net/blog/article.asp?id=322 上 ...
- C++位运算
移位运算 要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形. 2 " < <" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2. ...
- HashMap原理浅析
HashMap概述 HashMap是基于哈希表和Map实现来的,它提供所有可选的映射方式,可以允许使用null键,除了不同步和允许使用null键之外,HashMap和HashTable基本上相同.因此 ...
- 为什么在JDBC要使用Class.forName();这句话
为什么在调用JDBC的时候,我们总要写这句话:Class.forName("驱动类");解释:在JDBC编程中一般有以下几个步骤:1>加载驱动,也就是Class.forNam ...