请支持原创:
http://donlianli.iteye.com/blog/2092531
作者当前分析的版本为2.5.x。作者在分析的时候,都是带着疑问去查看代码,debug进行调试的,笔者写此文章仅供参考。
先大概了解一下系统作为一个消费者从启动到注册完成的过程
- 系统启动时,引用service时首先将系统本身自己需要引用的服务注册到zookeeper,然后订阅系统需要的服务,最后,会接收到zookeeper发送的订阅信息。比如一个消费者注册了一个UserService,系统在启动时,首先声明自己是UserService的一个消费者,然后再向zookeeper声明自己需要订阅UserService,最后,从zookeeper接收订阅的服务,然后存储到本地。
- 如果同时引用多个接口,则上面的服务会重复执行多次。
- 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,不能直接调用。
关于为什么不使用zookeeper自带的客户端,请参考
为什么dubbo使用ZkClient作为zookeeper的客户端
关于我,邯郸人。
对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
相关推荐
dubbo例子,里面有基于zookeeper的注册中心,提供者和消费者
本项目案例“妻子”作为消费者去调用生产者(“丈夫”)的服务--洗碗 本项目需要注意 @DubboReference private HusbandService husbandService; @EnableDubbo @DubboService 这几个注解不能忘,否则会报错,或者...
1.dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子 2. ssm-dubbo 源码 ssm-tomcat 里放的是 warbao ,程序包 zookeeper-3.4.9 zookeeper 免安装包 设置都是默认的 zookeeper 端口 2181 dubbo-...
dubbo提供者和消费者工程
dubbo提供者消费者例子,帮助理解dubbo的代码中的运用
dubbo2.4版本提供者provider消费者consumerjar包
Dubbo服务提供者以及消费者实例
dubbo提供者和消费者示例
在dubbo服务运行过程中,上传正确的java代码文件,自动编译生成class并注册到dubbo zk 中,可以正常dubbo invoke来调用。整个过程服务不用重启。我写了个框架并命名为D-Unit。
dubbo消费者的web应用实例
dubbo实现的服务消费者,服务提供者,分模块拆分的demo
基于注解、SpringBoot的Dubbo提供者消费者DEMO,下载下来直接可以跑。
Apache Dubbo服务注册及服务消费源码分析
Dubbo生产者消费者示例源代码,Eclipse项目,基于Maven构建,可以直接导入Eclipse开发环境,本人亲测,编译通过,可以直接在Eclipse中运行(包含Main方法),先运行提供者,再运行生产者。
1.SpringBoot聚合工程整合Dubbo,实现服务提供者与服务消费者的数据调用, 2.该项目提高了自己对Spring Boot整合Dubbo的理解,并深刻的认识到了服务者与消费者之间的调用及流程 4. Dubbo配置全部采用yml文件配置,...
springboot融合dubbo 提供者消费者 协议api,provider 使用他提供服务,consumer使用他调用服务,实现代码 参考:https://download.csdn.net/download/itexplorersfather/10346699
dubbo-provider-consumer生产者消费者实例 博文请查看:http://www.cnblogs.com/shawWey/p/6927141.html
dubbo注册中心服务ip和实际服务提供者ip不一致问题 网上收集的资料
资料总结linux下 zookkeeper 查看dubbo消费者生产者.txt
dubbo 测试,基于maven的web工程,provider服务提供者和consumer服务消费者