请支持原创:
http://www.cnblogs.com/donlianli/p/3847676.html
 
作者当前分析的版本为2.5.x。作者在分析的时候,都是带着疑问去查看代码,debug进行调试的,笔者写此文章仅供参考。
先大概了解一下系统作为一个消费者从启动到注册完成的过程
  1. 系统启动时,引用service时首先将系统本身自己需要引用的服务注册到zookeeper,然后订阅系统需要的服务,最后,会接收到zookeeper发送的订阅信息。比如一个消费者注册了一个UserService,系统在启动时,首先声明自己是UserService的一个消费者,然后再向zookeeper声明自己需要订阅UserService,最后,从zookeeper接收订阅的服务,然后存储到本地。
  2. 如果同时引用多个接口,则上面的服务会重复执行多次。
  3. montitorService是在执行的时候,才执行订阅。
 
问题:
1、dubbo是通过哪个类跟zookeeper进行交互的?
2、dubbo把订阅的信息存储到了哪个类?
 

RegistryProtocol.doRefer这里面进行的注册,将调用FailbackRegistry.registry进行真正的注册,实际跟zookeeper进行交互,调用的是ZookeeperRegistry的doRegistry方法。如果注册失败,会将url添加定定时任务中进行重试。

 
AbstractRegistry.notify真正接收到zookeeper的通知。在那儿将notify接口添加到zookeeper的改变事件的呢?
在ZookeeperRegistry代码的doSubscribe方法中(与zookeeper进行交互的代码中),将订阅的接口发送给zookeeper,并且从zookeeper取得可用的服务列表。
ZookeeperRegistry代码:
zkClient.create(path, false);
//这个是zookeeper返回客户端订阅的服务
List<String> children = zkClient.addChildListener(path, zkListener);
if (children != null) {
urls.addAll(toUrlsWithEmpty(url, path, children));
}
在循环之外,将已经可用的列表进行通知。
notify(url, listener, urls);,调用了AbstractRegistry.notify
 
AbstractRegistry在收到通知后,将url进行存储,继续通知NotifyListener。
NotifyListener是在哪儿放入Registry的呢?
在RegistryProtocol订阅服务的时候,会调用RegistryDirectory.subscribe方法。RegistryDirectory这类本身就实现了NotifyListener接口,在调用FailbackRegistry的subscribe方法的时候,把自己当成一个参数传递给了AbstractRegistry对象。所以AbstractRegistry在收到通知后,继续通知的是RegistryDirectory。
 
RegistryDirectory这个类维护着从本地方法到远程方法的映射关系,远程参数到本地方法的调用关系等。
在注册过程中的几个主要类
ZookeeperRegistry:负责与zookeeper进行交互
RegistryProtocol:从注册中心获取可用服务,或者将服务注册到zookeeper,然后提供服务或者提供调用代理。
RegistryDirectory:维护着所有可用的远程Invoker或者本地的Invoker。这个类实现了NotifyListner。
NotifyListener:负责RegistryDirectory和ZookeeperRegistry的通信。
FailbackRegistry:继承自Registry,实现了失败重试机制。
 
回答一开始的问题
1、通过ZookeeperRegistry和Zookeeper进行交互,相关的类还有ZookeeperClient,ZkclientZookeeperClient和org.I0Itec.zkclient.ZkClient类。通过这些类的方法,实现服务的注册和订阅及信息的传递。
2、主要是AbstractRegistry和RegistryDirectory这两个类。其中RegistryDirectory存储的可供客户端直接调用的Invoker,而AbstractRegistry这个类主要存储的是已经注册的服务接口,已经订阅的服务接口和已经收到通知的接口的URL,不能直接调用。
 

dubbo作为消费者注册过程分析--????的更多相关文章

  1. dubbo作为消费者注册过程分析

    请支持原创: http://www.cnblogs.com/donlianli/p/3847676.html   作者当前分析的版本为2.5.x.作者在分析的时候,都是带着疑问去查看代码,debug进 ...

  2. dubbo在idea下的使用创建 服务者,消费者 注册中心

    1.基于windows 下  spring 下的dubbo  需要书写配置文件 (1).创建带有web工程的项目 创建一个服务者 package cn.edu.aynu.bean; import lo ...

  3. 【Dubbo&&Zookeeper】4、 Java实现Dubbo服务提供者及消费者注册

    转自:http://blog.csdn.net/u010317829/article/details/52128852 创建Mavn工程.HelloDubbo. pom.xml添加dubbo及spri ...

  4. Dubbo原理解析-注册中心之Zookeeper协议注册中心

    下面我们来看下开源dubbo推荐的业界成熟的zookeeper做为注册中心, zookeeper是hadoop的一个子项目是分布式系统的可靠协调者,他提供了配置维护,名字服务,分布式同步等服务.对于z ...

  5. Dubbo中消费者初始化的过程解析

    首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...

  6. Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册

    文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...

  7. Dubbo 服务 IP 注册错误踩坑经历

    个人博客地址 studyidea.cn,点击查看更多原创文章 踩坑 公司最近新建一个机房,需要将现有系统同步部署到新机房,部署完成之后,两地机房同时对提供服务.系统架构如下图: 这个系统当前对外采用 ...

  8. dubbo的消费者是怎么获取提供者服务接口引用的?

    本文主要解读dubbo消费者是如何引用服务端接口的,是如何像本地调用一样调用远程服务的. 并试着从设计者的角度思考,为何这样设计. @Component public class DubboConsu ...

  9. freeswitch注册过程分析

    操作系统:debian8.5_x64freeswitch 版本 : 1.6.8 本文仅描述sip注册的简单场景,即话机直接向处于同一个局域网的fs进行注册. SIP协议的消息结构 消息框架 SIP协议 ...

随机推荐

  1. csp20160904解题报告

    dijkstra+贪心 每次加一个到起始点(首都)距离最小的点. 然后加边,这个最小点必然通过一条边和已加入的某个点相连,在这个最小点与已加入的点相连的边中,选取最短的一条边加入. 证明如下: 前提: ...

  2. hinton教授的本科生课程CSC321-机器学习中的神经网的笔记

    最近一直在看仙守博友所记录的笔记 Hinton的CSC321课程(完结,待文字润色): 1.lecture1-NN的简介 2.lecture2-NN结构的主要类型的概述和感知机 3.lecture3- ...

  3. 到浏览器顶部的获取js和jquery

    获取当前窗口到页面顶端高度: js: document.documentElement.scrollTop JQ:$(document).scrollTop()或者$(window).scrollTo ...

  4. Kafka集群优化篇-调整broker的堆内存(heap)案例实操

    Kafka集群优化篇-调整broker的堆内存(heap)案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看kafka集群的broker的堆内存使用情况 1>. ...

  5. GO语言的进阶之路-网络安全之proxy

    GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...

  6. 面向对象【day07】:面向对象引子(一)

    本节内容 概述 面向对象引子 面向过程介绍 一.概述 很对人都不理解编程中的面向对象的概念,那我们先来说说面向对象的引子,由这个引子带领我们更好的理解面向对象的概念. 二.面向对象引子 你现在是一家游 ...

  7. ajax跨域原理以及jsonp使用

    jsonp介绍: JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题. 由于同源策略,一般来说位于 server1.example. ...

  8. PHP7 学习笔记(七)如何使用zephir编译一个扩展记录

    一.zephir 编译遇到的错误 安装 git clone https://github.com/phalcon/zephir $ cd zephir $ ./install-json $ ./ins ...

  9. oracle乱码记录

    plsql中显示正常,查询到的结果乱码 1.获得服务端编码 select * from nls_database_parameters where parameter ='NLS_CHARACTERS ...

  10. elasticsearch核心知识梳理

    https://blog.csdn.net/laoyang360/article/details/52244917